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,347 @@
|
|
|
1
|
+
# 06 — Wiring a form control to a process
|
|
2
|
+
|
|
3
|
+
How a control triggers a PROCESIO process, how data goes in, how results come back
|
|
4
|
+
into fields, and the design rule that saves a day of debugging: **one process
|
|
5
|
+
output variable per form field.**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. The event
|
|
10
|
+
|
|
11
|
+
A `RUN_PROCESS` event on a control's trigger ([01](01-ANATOMY.md) §6):
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{
|
|
15
|
+
"id": "<guid>",
|
|
16
|
+
"type": "INPUT",
|
|
17
|
+
"action": "RUN_PROCESS",
|
|
18
|
+
"config": {
|
|
19
|
+
"processId": "<process guid>",
|
|
20
|
+
"syncRun": true,
|
|
21
|
+
"inputMap": [ … ],
|
|
22
|
+
"outputMap": [ … ]
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
**`syncRun: true` holds the line open** until the process finishes — verified live
|
|
28
|
+
across a multi-second external API call. With `syncRun: false` the form fires and
|
|
29
|
+
forgets, so an `outputMap` can never populate anything.
|
|
30
|
+
|
|
31
|
+
**One event per trigger.** Two `RUN_PROCESS` events on the same trigger launch the
|
|
32
|
+
process twice; the second result overwrites the first and the timing is not
|
|
33
|
+
deterministic. When rewiring, use `--replace` rather than appending.
|
|
34
|
+
|
|
35
|
+
## 2. The map rows — the shape that took three attempts to get right
|
|
36
|
+
|
|
37
|
+
```json
|
|
38
|
+
{
|
|
39
|
+
"id": 0,
|
|
40
|
+
"left": {"value": "<PROCESS VARIABLE GUID>", "isList": false, "path": {}},
|
|
41
|
+
"right": {"value": "<form value path>", "isList": false, "path": null}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Four rules, each learned the hard way:
|
|
46
|
+
|
|
47
|
+
1. **The process-variable GUID goes on the LEFT** — in `inputMap` *and* in
|
|
48
|
+
`outputMap`. A variable *name* on the left is accepted by the API, but the
|
|
49
|
+
designer then renders raw guids and the launch 400s.
|
|
50
|
+
2. **Each side is an OBJECT, not a bare string.** Bare strings are accepted by the
|
|
51
|
+
API and produce a row the designer cannot render.
|
|
52
|
+
3. **The two sides differ**: the process side carries `path: {}`, the form side
|
|
53
|
+
`path: null`. Discovered by reading a mapping the designer itself had written.
|
|
54
|
+
4. **`path` carries the attribute chain** when a model-typed variable is mapped one
|
|
55
|
+
attribute at a time. Rebuilding a row without carrying `path` over silently maps
|
|
56
|
+
the whole object into a single text field — the classic `[object Object]`
|
|
57
|
+
in every field.
|
|
58
|
+
|
|
59
|
+
The form side's value is the full field path from [01](01-ANATOMY.md) §5:
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
{dmRootId}.{FIELDS_NS}.{elementId}.{valueConfigId}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
with `FIELDS_NS = 11223344-5566-7788-99aa-aabbccddeeff` (constant on every form).
|
|
66
|
+
|
|
67
|
+
## 3. Wire it with the tool, not by hand
|
|
68
|
+
|
|
69
|
+
`form-set-element-event` does a surgical read-modify-write: it touches **only** that
|
|
70
|
+
element's event config, resolves variable names to guids, and fails loudly *before
|
|
71
|
+
writing anything* if a name is unknown.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
python scripts/run-tool.py procesio form-set-element-event \
|
|
75
|
+
--id <form-id> --element <element-name-or-id> \
|
|
76
|
+
--on input --action RUN_PROCESS --replace \
|
|
77
|
+
--config-file event.json --dry-run
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Drop `--dry-run` to write. Inspect what is currently wired with:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
python scripts/run-tool.py procesio form-get-element-events --id <form-id> --element <name>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
Because it resolves names, `event.json` can be written readably:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{"processId": "<guid>",
|
|
90
|
+
"inputMap": [{"left": "input_file", "right": "<form value path>"}],
|
|
91
|
+
"outputMap": [{"left": "o_first_name", "right": "<form value path>"}]}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
It also defaults `syncRun` to `true`, so you cannot forget it.
|
|
95
|
+
|
|
96
|
+
## 3b. Driving a RUN_PROCESS from script: wait out the debounce (measured 2026-10-17)
|
|
97
|
+
|
|
98
|
+
When a custom UI writes a control's value from script (native value setter + `input`
|
|
99
|
+
event) and then clicks the control's RUN_PROCESS button with `element.click()`, the
|
|
100
|
+
process receives the value the field had BEFORE the write unless the script waits first.
|
|
101
|
+
Measured on a public form: a 300 ms wait, with or without a blur, sent the stale value;
|
|
102
|
+
600, 800 and 1000 ms sent the new one every time. A finer run put the threshold at the form's
|
|
103
|
+
~500 ms debounce: at 100, 250 and 400 ms 18 of 18 launches got the old value, at 500 and 650 ms
|
|
104
|
+
11 of 11 got the new one. So write, wait about 560 ms, then click.
|
|
105
|
+
Serialise these calls (one queue), or two writes interleave and each click sends the other's
|
|
106
|
+
value. The click works on a button that is off screen. A process round trip from click to
|
|
107
|
+
the output landing in the field took 0.7 to 1.0 s for a small Node-only flow. It is two
|
|
108
|
+
sequential requests: `POST /api/formProcess/{formId}/{processId}/publish` (creates the instance,
|
|
109
|
+
~300-470 ms) then `POST /api/formProcess/{formId}/{instanceId}/launch?runSynchronous=true`
|
|
110
|
+
(~670-800 ms for ~260 ms of execution), so roughly 1.1-1.2 s per call whatever the flow does. A
|
|
111
|
+
Node action costs ~56-85 ms of execution each and a Query Store ~16 ms: keep form-facing flows to
|
|
112
|
+
few Nodes (pass one JSON value into SQL and unpack it with `JSON_EXTRACT` rather than one Node
|
|
113
|
+
per column). For a live
|
|
114
|
+
"N results" count while the visitor is still choosing, filter a cached copy in the browser
|
|
115
|
+
and keep the process for the authoritative search and the logging.
|
|
116
|
+
|
|
117
|
+
## 3c. The wire, request by request (measured on the forms host, 2026-10-22)
|
|
118
|
+
|
|
119
|
+
What a RUN_PROCESS sends, for a runtime that has to follow one run among several:
|
|
120
|
+
|
|
121
|
+
| request | carries |
|
|
122
|
+
|---|---|
|
|
123
|
+
| `POST /api/formProcess/{formId}/{processId}/publish`, body = the input values | answers the process VARIABLE list (inputs echoed as `defaultValue`), **no instance id** |
|
|
124
|
+
| `POST /api/formProcess/{formId}/{instanceId}/launch?runSynchronous=true\|false&secondsTimeOut=300`, body `{"flowTemplateId": processId, "connectionId": …}` | the instance id is minted by the CLIENT and sits in the URL; the answer is `{"instanceId"}`, plus `status` + `variable` (outputs) when synchronous |
|
|
125
|
+
| `GET /api/formProcess/{formId}/{processId}/{instanceId}/variables` (async only, polled) | `{"id", "status", "variables": [{name, defaultValue = the value, …}]}`, final at status 50 (finished) or 40 (finished with errors) |
|
|
126
|
+
|
|
127
|
+
So tie a run to its process by the launch request BODY (`flowTemplateId`) and read the instance
|
|
128
|
+
id from the launch URL; `/variables` carries both ids. A required process input whose form side
|
|
129
|
+
is empty is refused at publish: `HTTP 400 statusCode 373 "Missing required input for variables:
|
|
130
|
+
<name>"`, nothing launches.
|
|
131
|
+
|
|
132
|
+
A File output mapped to a control is fetched ONCE, right after the run, by
|
|
133
|
+
`GET /api/formProcess/download` with no query string: the file is named by request HEADERS
|
|
134
|
+
(`flowtemplateid`, `formtemplateid`, `instanceid`, `variableid`, `workspaceid`, `uploadfilepath` =
|
|
135
|
+
`flow/flow-<processId>/flow-instance-<instanceId>/variable-<variableId>/<fileId>`), cookie auth,
|
|
136
|
+
answer = the bytes with `content-disposition: attachment; filename=…`. A File output that is empty
|
|
137
|
+
still triggers the call with `uploadfilepath: undefined` and gets a 400; harmless, but it shows in
|
|
138
|
+
the console.
|
|
139
|
+
|
|
140
|
+
**A synchronous step keeps the form locked for its whole run.** While a chain runs every button is
|
|
141
|
+
`disabled` ([08](08-PITFALLS.md)); with `syncRun: true` that lasts until the process ends (measured:
|
|
142
|
+
a hidden RUN_PROCESS button stayed `disabled` for the 33 s a document-generating process took, and
|
|
143
|
+
came back the moment it answered). With `syncRun: false` the chain ends at launch, so a hidden poll
|
|
144
|
+
button can run while the async process is still going. A runtime that clicks a hidden button after
|
|
145
|
+
a sync step must wait for `button.disabled === false`, not for a timer.
|
|
146
|
+
|
|
147
|
+
**A list loaded at FORM_LOAD goes stale while the page stays open** (a signer signs, a status
|
|
148
|
+
moves on). To refresh it without a page reload, put the same RUN_PROCESS on a hidden button whose
|
|
149
|
+
output map writes the dynamic row again; the table re-renders from the new value and the selected
|
|
150
|
+
detail stays where it is. Controls set by the chain that OPENED a record (MAPs on its status) do
|
|
151
|
+
not follow the new row by themselves: reopen the record, or tell the user it moved on.
|
|
152
|
+
|
|
153
|
+
**Testing a form runtime without running anything (measured 2026-10-22).** Route
|
|
154
|
+
`**/formProcess/**/launch*` in Playwright, pick the run by the request body's `flowTemplateId`, and
|
|
155
|
+
fulfill it with `{"instanceId": "<any guid>", "status": 50, "variable": {<output name>: <value>},
|
|
156
|
+
"error": []}`. The form maps that answer exactly like a real synchronous one: outputs land in
|
|
157
|
+
their fields and variables, `visible` outputs show their controls, and the chain's MAP conditions
|
|
158
|
+
then run on the faked values. Nothing launches on the server (the publish before it only
|
|
159
|
+
registers the inputs). This is how to rehearse states the test data no longer has; File outputs
|
|
160
|
+
left out simply leave their viewers empty.
|
|
161
|
+
|
|
162
|
+
## 4. Design rule: **one output variable per field, all primitives**
|
|
163
|
+
|
|
164
|
+
The tempting design is one structured output variable (a data model, or a JSON blob)
|
|
165
|
+
mapped attribute-by-attribute into the fields. Do not. The attribute-path shape on
|
|
166
|
+
the form side of a map row is typed `left: any` in the renderer, so it is **not
|
|
167
|
+
derivable** — you would be guessing, and a wrong guess writes `[object Object]`
|
|
168
|
+
into every field with no error anywhere.
|
|
169
|
+
|
|
170
|
+
The design that works:
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
File → Base64 → Decisional (branch by applicant type)
|
|
174
|
+
├── Call API (branch A) → Node: parse → structured result
|
|
175
|
+
└── Call API (branch B) → Node: parse → structured result
|
|
176
|
+
↓
|
|
177
|
+
Join
|
|
178
|
+
↓
|
|
179
|
+
one small "splitter" Node per field, each returning a plain string
|
|
180
|
+
↓
|
|
181
|
+
o_first_name, o_last_name, o_tax_code, … (string outputs)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Each splitter is three lines:
|
|
185
|
+
|
|
186
|
+
```js
|
|
187
|
+
const o = <%0%>; // the structured result
|
|
188
|
+
return (o && o.field_name != null) ? String(o.field_name) : '';
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Then `outputMap` is a flat list of **primitive → field** rows. No paths, nothing to
|
|
192
|
+
guess, and every row is independently debuggable. The extra dozen Node actions cost
|
|
193
|
+
nothing at runtime and buy a wiring you can reason about.
|
|
194
|
+
|
|
195
|
+
**Do not add a hidden "carrier" field to the form** to receive the blob and then
|
|
196
|
+
distribute it in JavaScript. It puts a second copy of the data in the DOM, it needs
|
|
197
|
+
its own gating so it never shows, and the outputMap already populates fields
|
|
198
|
+
natively — which is also the honest completion signal (§6).
|
|
199
|
+
|
|
200
|
+
## 5. Notes on the process side
|
|
201
|
+
|
|
202
|
+
- **A file input's variable is `FileDataModel`**, not a primitive type. `file` is
|
|
203
|
+
not a type.
|
|
204
|
+
- **`Call API v3` is superseded** — use `Call API`, with `Response Status`,
|
|
205
|
+
`Response Body`, and `Time Out`. The framework's `process-create` refuses
|
|
206
|
+
superseded actions outright.
|
|
207
|
+
- **A `Node` action's `Timeout` must be 60–300.** `30` is rejected by the validation
|
|
208
|
+
gate. `Node` returns its value raw; a `Javascript` action wraps it as
|
|
209
|
+
`{result: v}` — a difference that silently changes every downstream reference.
|
|
210
|
+
- **`Decisional` is a diamond** and fans out any number of branches; they do not
|
|
211
|
+
have to re-converge, but a `Join` is the explicit merge point when they should.
|
|
212
|
+
- Parse defensively at the boundary and return a *diagnosable* object rather than
|
|
213
|
+
throwing:
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
const r = <%0%>;
|
|
217
|
+
try {
|
|
218
|
+
const a = r.choices[0].message.tool_calls[0].function.arguments;
|
|
219
|
+
return (typeof a === 'string') ? JSON.parse(a) : a;
|
|
220
|
+
} catch (e) {
|
|
221
|
+
return ({ warning_status: true,
|
|
222
|
+
warning_message: 'Could not read the extraction service response.',
|
|
223
|
+
_err: String(e && e.message) });
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
A thrown error inside a Node stops the flow and tells the form nothing. A returned
|
|
228
|
+
warning object flows on and can be surfaced to the user.
|
|
229
|
+
|
|
230
|
+
- Carry a **`warning_status` / `warning_message` pair** through to the form. When an
|
|
231
|
+
external model returns mostly nulls (a partially legible document), that is an
|
|
232
|
+
*extraction quality* result, not a wiring failure — and the two are indistinguishable
|
|
233
|
+
from the form unless the process says which it was.
|
|
234
|
+
|
|
235
|
+
## 6. The form side: detect arrival from the fields themselves
|
|
236
|
+
|
|
237
|
+
```js
|
|
238
|
+
/* The extraction is done when the platform has written into the fields — the
|
|
239
|
+
outputMap populates them natively, so there is no carrier to read. Detecting the
|
|
240
|
+
values themselves is also the honest signal: it is true exactly when there is
|
|
241
|
+
something worth showing. */
|
|
242
|
+
function extractionArrived() {
|
|
243
|
+
var found = false;
|
|
244
|
+
fields().forEach(function (el) {
|
|
245
|
+
if (found) { return; }
|
|
246
|
+
if (!fieldKey(el)) { return; }
|
|
247
|
+
var f = q('input, textarea', el);
|
|
248
|
+
if (f && String(f.value || '').trim()) { found = true; }
|
|
249
|
+
});
|
|
250
|
+
return found;
|
|
251
|
+
}
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## 7. The full pattern: upload → veil → reveal only what applies
|
|
255
|
+
|
|
256
|
+
```js
|
|
257
|
+
/* 1. The upload starts the work: raise a HELD veil (the network is silent, so the
|
|
258
|
+
quiet-timer heuristic would lift it immediately). */
|
|
259
|
+
D.addEventListener('change', function (e) {
|
|
260
|
+
var input = e.target;
|
|
261
|
+
if (!input || input.type !== 'file' || !input.files || !input.files.length) { return; }
|
|
262
|
+
if (!input.closest || !input.closest('.form-builder--file-upload')) { return; }
|
|
263
|
+
if (currentStep() !== IDENTITY_STEP) { return; } // other steps just collect documents
|
|
264
|
+
window.__uxExtracting = true;
|
|
265
|
+
showVeil('Reading the document…', true);
|
|
266
|
+
}, true);
|
|
267
|
+
|
|
268
|
+
/* 2. Every refresh pass decides what the step shows. */
|
|
269
|
+
function identityStep(active) {
|
|
270
|
+
if (active !== IDENTITY_STEP) { return; }
|
|
271
|
+
var arrived = extractionArrived();
|
|
272
|
+
|
|
273
|
+
if (arrived && window.__uxExtracting) { // 3. dismiss the held veil
|
|
274
|
+
window.__uxExtracting = false;
|
|
275
|
+
hideVeil();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
var ready = true;
|
|
279
|
+
fields().forEach(function (el) {
|
|
280
|
+
if (q('input[type=file]', el) || el.querySelector('.form-builder--file-upload')) {
|
|
281
|
+
return; // the upload always stays
|
|
282
|
+
}
|
|
283
|
+
var key = fieldKey(el);
|
|
284
|
+
if (!key) { return; }
|
|
285
|
+
|
|
286
|
+
var group = FIELD_GROUP[key]; // 'a' | 'b' | undefined
|
|
287
|
+
var mine = !group || group === currentApplicantKind();
|
|
288
|
+
|
|
289
|
+
// Hidden until the document has been read, and then only the half that
|
|
290
|
+
// belongs to the chosen applicant type.
|
|
291
|
+
el.classList.toggle('ux-gated', !arrived || !mine);
|
|
292
|
+
if (!arrived) { ready = false; return; }
|
|
293
|
+
if (!mine) { return; }
|
|
294
|
+
|
|
295
|
+
var ok = validate(el, key);
|
|
296
|
+
if (el.offsetParent !== null && !ok) { ready = false; } // only VISIBLE fields gate
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
gateNext(ready); // 4. → appears only when complete
|
|
300
|
+
}
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
Three details that matter:
|
|
304
|
+
|
|
305
|
+
- **`el.offsetParent !== null`** is the real "is this visible" test. Counting a
|
|
306
|
+
hidden field against readiness makes the next button unreachable forever, with no
|
|
307
|
+
visible cause.
|
|
308
|
+
- **`FIELD_GROUP` decides visibility here as well** as in the form's own logic. The
|
|
309
|
+
form's logic keys off its own state and runs on its own schedule; deciding here
|
|
310
|
+
too means the step never shows the wrong half, not even for the frame between the
|
|
311
|
+
results landing and that logic running.
|
|
312
|
+
- **The upload is exempt from every gate.** It is the only thing on the step before
|
|
313
|
+
the results arrive, and it must stay reachable afterwards so a wrong document can
|
|
314
|
+
be replaced.
|
|
315
|
+
|
|
316
|
+
## 8. Offer a manual escape
|
|
317
|
+
|
|
318
|
+
Extraction from a photographed document fails sometimes. When the veil's ceiling
|
|
319
|
+
fires, say so and let the person continue by hand — a form that can only be
|
|
320
|
+
completed when a model cooperates is not a form.
|
|
321
|
+
|
|
322
|
+
```js
|
|
323
|
+
window.UXToast('This is taking longer than usual. You can fill the fields in manually.', 'err');
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
## Data store from a form (not an element - an event action)
|
|
327
|
+
|
|
328
|
+
A form talks to a data store through an **event action**, not a dedicated element. On any
|
|
329
|
+
element's `field-events`, add an `Event` with `action: "RUN_DATA_STORE_OPERATION"` and a
|
|
330
|
+
config:
|
|
331
|
+
|
|
332
|
+
```json
|
|
333
|
+
{ "action": "RUN_DATA_STORE_OPERATION",
|
|
334
|
+
"config": {
|
|
335
|
+
"dataStoreId": "<uuid>",
|
|
336
|
+
"operation": "READ", // READ | ADD | UPDATE | DELETE
|
|
337
|
+
"inputMap": [{ "id": 0, "left": "page", "right": "1" },
|
|
338
|
+
{ "id": 1, "left": "countPerPage", "right": "1000" }],
|
|
339
|
+
"outputMap": [{ "id": 0, "left": "rows", "right": "<target var/element>" }] } }
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Canonical fields: `page`, `countPerPage`, `rows`, `success`. At runtime the form calls
|
|
343
|
+
`api/Form/dataStore/{id}/rows` (scoped to the template's workspace, PRC-5559). For reading
|
|
344
|
+
a data store from a PROCESS (not a form) use the **Query Store** action (see
|
|
345
|
+
`../PROCESIO-CONNECTORS-NOTES.md`). The process-designer data-store node adds the control
|
|
346
|
+
types `data-store-mapper` / `data-store-decisional` (`FeComponentType` 46 / 47) with a
|
|
347
|
+
richer decisional operator set (BETWEEN, IN/BELONGS, IS_EMPTY→IsNull, IS_NOT_EMPTY→IsNotNull).
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
# 07 — Shipping it: tooling, testing, recovery
|
|
2
|
+
|
|
3
|
+
How the CSS and JS get onto a live form without destroying it, how to test before
|
|
4
|
+
you publish, and how to get back when you do not.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. Never use `form-edit` to restyle an existing form
|
|
9
|
+
|
|
10
|
+
`form-edit` is a **desired-state** editor: it rebuilds the whole DTO from a config.
|
|
11
|
+
Pointing it at a large hand-authored form to change one thing means re-declaring
|
|
12
|
+
every element — or losing them. On a form with a hundred-plus hand-built elements,
|
|
13
|
+
that is the end of the form.
|
|
14
|
+
|
|
15
|
+
Use the **surgical** actions. Each does a read-modify-write on the live DTO and
|
|
16
|
+
touches exactly one thing:
|
|
17
|
+
|
|
18
|
+
| Action | Touches | Everything else |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| `form-get-code` | nothing (read) | — |
|
|
21
|
+
| `form-set-code` | `Data.code` only | elements, theme, data model, events byte-identical |
|
|
22
|
+
| `form-get-element-events` | nothing (read) | — |
|
|
23
|
+
| `form-set-element-event` | one element's one event config | every sibling byte-identical |
|
|
24
|
+
| `form-get-element` | nothing (read) | — |
|
|
25
|
+
| `form-set-element-config` | one element's plain configs | every sibling byte-identical |
|
|
26
|
+
| `form-set-element-chains` | the ordered event chains of the listed element triggers, in ONE save | every other element byte-identical; kept events verbatim |
|
|
27
|
+
|
|
28
|
+
Every write path maps the GET's camelCase onto the PUT's PascalCase envelope
|
|
29
|
+
explicitly, so an unexpected extra field is never echoed back.
|
|
30
|
+
|
|
31
|
+
### `form-set-element-config` — content and per-field rules belong in the DTO
|
|
32
|
+
|
|
33
|
+
`label`, `placeholder`, `required`, `regex`, `visible`, `tooltip`, `defaultValue`.
|
|
34
|
+
Rewriting a banner from the form-level JS instead is a trap worth naming: it is
|
|
35
|
+
invisible in the designer, it has to be re-applied on every render, and it fights the
|
|
36
|
+
runtime's own MutationObserver.
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# long HTML from a file, so the copy lives under version control
|
|
40
|
+
python scripts/run-tool.py procesio form-set-element-config \
|
|
41
|
+
--id <form-id> --element idhead --set-file label=elements/idhead.html --dry-run
|
|
42
|
+
|
|
43
|
+
# scalars are parsed as JSON when they parse, so this stores a real boolean
|
|
44
|
+
python scripts/run-tool.py procesio form-set-element-config \
|
|
45
|
+
--id <form-id> --element intro1 --set visible=false
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Two refusals it makes on purpose, both before writing anything:
|
|
49
|
+
|
|
50
|
+
- **a config the element does not already carry.** Adding one would also need a
|
|
51
|
+
data-model attribute whose id equals the new config's id; without it the designer
|
|
52
|
+
renders raw guids and values never flow ([01](01-ANATOMY.md) §5).
|
|
53
|
+
- **an event config.** Those go through `form-set-element-event`, which resolves
|
|
54
|
+
process-variable names to guids and enforces one event per trigger.
|
|
55
|
+
|
|
56
|
+
Config **ids are preserved** on every rewrite — a fresh id there breaks every value
|
|
57
|
+
path pointing at that attribute.
|
|
58
|
+
|
|
59
|
+
## 2. The loop
|
|
60
|
+
|
|
61
|
+
**Check the key on each installation before the first write.** `form-set-code` encrypts
|
|
62
|
+
with the key stored for the call's environment (§3), and refuses when there is none
|
|
63
|
+
rather than borrow another installation's. A wrong key stored under the right name still
|
|
64
|
+
gets through: the write succeeds and the form goes blank ([08](08-PITFALLS.md)). So first
|
|
65
|
+
read back the code of a form whose CSS was written in the designer, on the same
|
|
66
|
+
installation:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
python scripts/run-tool.py procesio form-get-code --id <designer-edited-form> \
|
|
70
|
+
--css-out check.css
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
If it does not decrypt, stop there: the stored key is wrong for this installation (§3).
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# 1. Pull the current code down to files
|
|
77
|
+
python scripts/run-tool.py procesio form-get-code --id <form-id> \
|
|
78
|
+
--css-out form.css --js-out form.js
|
|
79
|
+
|
|
80
|
+
# 2. Edit form.css / form.js locally, in a real editor, under version control
|
|
81
|
+
|
|
82
|
+
# 3. Preview the write without performing it
|
|
83
|
+
python scripts/run-tool.py procesio form-set-code --id <form-id> \
|
|
84
|
+
--css-file form.css --js-file form.js --dry-run
|
|
85
|
+
|
|
86
|
+
# 4. Ship
|
|
87
|
+
python scripts/run-tool.py procesio form-set-code --id <form-id> \
|
|
88
|
+
--css-file form.css --js-file form.js
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
Success looks like:
|
|
92
|
+
|
|
93
|
+
```json
|
|
94
|
+
{"updated": true, "css_bytes": 24157, "javascript_bytes": 28793, "elements": 135}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Check `elements` on every write.** It is the count on the DTO you just PUT back.
|
|
98
|
+
If it ever drops, you are not doing what you think you are doing — stop.
|
|
99
|
+
|
|
100
|
+
### Omitting one side preserves it
|
|
101
|
+
|
|
102
|
+
Passing only `--css-file` keeps the existing JavaScript untouched, and vice versa.
|
|
103
|
+
Restyling never silently drops the behaviour layer.
|
|
104
|
+
|
|
105
|
+
### Every overwrite is recoverable from the tool output
|
|
106
|
+
|
|
107
|
+
`form-set-code` returns the **previous** decrypted css/js under `previous`. Pipe the
|
|
108
|
+
output to a file when you are doing something risky, and a mistaken overwrite is a
|
|
109
|
+
copy-paste away from being undone:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
python scripts/run-tool.py procesio form-set-code --id <form-id> \
|
|
113
|
+
--js-file form.js > /tmp/last-write.json
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### A 2xx is not a save: `form-set-code` reads the form back
|
|
117
|
+
|
|
118
|
+
The platform has answered form writes with 2xx while storing nothing: `PUT /api/FormTemplate`
|
|
119
|
+
moved `updatedOn` but left every `Data` field as it was (the code, even `browserTitle`), and
|
|
120
|
+
`POST /api/FormTemplate` and `.../duplicate` returned forms with `data: null` (seen on
|
|
121
|
+
Internal-PROD 2026-10-18, every payload shape, PascalCase and camelCase alike; the designer UI
|
|
122
|
+
saves through the same endpoint, so it is not a client bug). The public page then keeps serving
|
|
123
|
+
the old code, which looks exactly like a CDN cache that never expires.
|
|
124
|
+
|
|
125
|
+
So `form-set-code` re-reads the form after the PUT and returns `verified: true`, or fails with
|
|
126
|
+
**`not_persisted`** (details: `sent_bytes`, `stored_bytes`, `kept_previous`). On that error,
|
|
127
|
+
create a tiny scratch form (`POST /api/FormTemplate` with `data: {elements: []}`) and read it
|
|
128
|
+
back: `data: null` means the platform is not storing form content at all, so stop retrying and
|
|
129
|
+
report it; real data means another editor saved the form between your read and your write.
|
|
130
|
+
|
|
131
|
+
## 3. Credentials
|
|
132
|
+
|
|
133
|
+
Two different secrets that look alike — both short opaque tokens:
|
|
134
|
+
|
|
135
|
+
| Secret | What it does |
|
|
136
|
+
|---|---|
|
|
137
|
+
| the workspace **API key** (name + value) | gets you **at** the form (auth) |
|
|
138
|
+
| `agents-and-tools:procesio:form-code-key@<environment>` | gets you **into** `Data.code` (AES passphrase), one per installation |
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
python scripts/set-credential.py procesio form-code-key@Internal-QA
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
The form-code passphrase is **installation-wide**: it decrypts the code blob of every
|
|
145
|
+
form on that installation, and it cannot be cheaply rotated. Treat it accordingly —
|
|
146
|
+
never in a file, never in a chat, never in a log.
|
|
147
|
+
|
|
148
|
+
**One key per installation, stored per environment.** The platform team confirmed it:
|
|
149
|
+
the key is the same on every workspace of an installation and is not guaranteed to
|
|
150
|
+
match on another. An environment is how this tool names an installation, so the key is
|
|
151
|
+
stored as `form-code-key@<environment>`. The bare `form-code-key` still works as the
|
|
152
|
+
default environment's key, the same rule as a credential with no environment binding,
|
|
153
|
+
and the tool never uses it for any other environment. A missing key is an error that
|
|
154
|
+
names the secret to store.
|
|
155
|
+
|
|
156
|
+
**It is not a secret from the people who open a form.** The renderer decrypts
|
|
157
|
+
`Data.code` in the visitor's browser, so the passphrase reaches every browser that loads
|
|
158
|
+
a form, and anyone who can open a form can read its CSS and JavaScript. Keep the key out
|
|
159
|
+
of files, chats and logs as the rules require. Treat the form code itself as public: no
|
|
160
|
+
credentials, no internal names, nothing you would not print on the page.
|
|
161
|
+
|
|
162
|
+
### Diagnosing a decrypt failure
|
|
163
|
+
|
|
164
|
+
A wrong passphrase and a corrupt blob are indistinguishable at the API layer: both
|
|
165
|
+
surface as a `UnicodeDecodeError` after AES has run and emitted garbage. To tell
|
|
166
|
+
them apart, round-trip `encrypt_code` / `decrypt_code` with a throwaway key. If that
|
|
167
|
+
works, the cipher is fine and the **key** is wrong.
|
|
168
|
+
|
|
169
|
+
## 4. Test on a replica, not on the live form
|
|
170
|
+
|
|
171
|
+
The most expensive mistake available here is publishing straight to a live process
|
|
172
|
+
or a live public form. Two levels of testing, and both are cheap:
|
|
173
|
+
|
|
174
|
+
**A local HTML replica.** Save a rendered copy of the form, inline your CSS and JS,
|
|
175
|
+
and open it in a browser. Because the installer falls back to `window` when there is
|
|
176
|
+
no parent frame ([02](02-CODE-INJECTION.md) §4), the same file runs unchanged. This
|
|
177
|
+
catches the majority of DOM and timing bugs, and it lets you *measure* a transition
|
|
178
|
+
instead of guessing:
|
|
179
|
+
|
|
180
|
+
**Replicate the whole flow, not one screen.** A single-step mock cannot exercise the
|
|
181
|
+
two things most likely to break — the step gate and whatever bridges the DOM to the
|
|
182
|
+
platform's field model — so those are exactly what nothing tests. A replica worth
|
|
183
|
+
building carries: a fake `window.ProcesioForm.data.fields` with the DTO's own names,
|
|
184
|
+
`required` flags and regexes; the form's own element-event visibility logic; the REAL
|
|
185
|
+
`data-element-id` values; and a step change that **destroys and rebuilds** the controls
|
|
186
|
+
(`box.innerHTML = …`), because that is what makes "state stored on a node" fail here
|
|
187
|
+
the same way it fails live. Give it a harness row of buttons for the states that are
|
|
188
|
+
otherwise unreachable (pick each branch, simulate the process result landing, fill the
|
|
189
|
+
current step) and a `?raf=timeout` switch so it can be driven in a background tab.
|
|
190
|
+
|
|
191
|
+
```js
|
|
192
|
+
// in the page console — prove the class actually lifts
|
|
193
|
+
setTimeout(() => console.log('at120',
|
|
194
|
+
box.classList.contains('ux-leaving'), getComputedStyle(box).opacity), 120);
|
|
195
|
+
setTimeout(() => console.log('at600',
|
|
196
|
+
box.classList.contains('ux-leaving'), getComputedStyle(box).opacity), 600);
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
Run the same navigation **twice** and confirm nothing accumulates — a second copy of
|
|
200
|
+
a listener, a class that never clears, a growing node count.
|
|
201
|
+
|
|
202
|
+
**A small public test form on the live renderer**, for runtime mechanics a replica
|
|
203
|
+
cannot reproduce (debounce timing, which chain fires when, the lock during a chain).
|
|
204
|
+
Build the smallest form that exercises the mechanism (`form-create`, a stepper with
|
|
205
|
+
two or three steps, the same `form.js`), give it a CustomUrl + `IsPrivate: false`,
|
|
206
|
+
wire it with the same tool calls you will use on the real form, and drive it
|
|
207
|
+
headless with the `web` tool. A saved session that is an EMPTY storageState
|
|
208
|
+
(`{"cookies": [], "origins": []}`) is an anonymous browser. `eval` steps read live
|
|
209
|
+
state (an input's `.value` property, `disabled`, which step is rendered) and can time
|
|
210
|
+
a click. Delete the form and its CustomUrl afterwards. This is how a login-gated
|
|
211
|
+
production form can still be changed on evidence: the gate blocks the headless run
|
|
212
|
+
on the real form, not on the copy of its mechanism.
|
|
213
|
+
|
|
214
|
+
**A duplicated form is the quickest test bench for a restyle.** `form-duplicate` keeps every
|
|
215
|
+
element id and the data model's root id (the ORIGINAL form id), so every value path and
|
|
216
|
+
event mapping still resolves in the copy (verified 2026-10-22). The copy comes back as a
|
|
217
|
+
draft named `… (Copy)`: publish it (`form-update --status 1 --state true --is-private false`),
|
|
218
|
+
then bend it into each state you need to see. Make the hidden sections visible, put a base64
|
|
219
|
+
PDF in a file viewer's `src` (a raw base64 string renders), drop a load process's
|
|
220
|
+
`outputMap` so it cannot hide what you made visible, or swap a submit button's RUN_PROCESS
|
|
221
|
+
for a MAP_FORM_DATA that shows the success section. A state that real data cannot reach
|
|
222
|
+
(no valid token left, a success that writes to a database) gets tested there, on the real
|
|
223
|
+
renderer, with the exact build you will ship.
|
|
224
|
+
|
|
225
|
+
**A duplicated process**, for anything on the process side. `procesio` can duplicate
|
|
226
|
+
a process; change the copy, run the copy, and promote the change only once it works.
|
|
227
|
+
Editing a live process that a public form is calling means every submission in
|
|
228
|
+
flight is your test.
|
|
229
|
+
|
|
230
|
+
**State plainly what you verified.** "Verified on the local replica" and "verified on
|
|
231
|
+
the live form" are different claims. Do not let one stand in for the other.
|
|
232
|
+
|
|
233
|
+
**Test the code you ship.** If the build minifies or bundles the scripts, point the
|
|
234
|
+
replica at the built files. A replica that loads the sources leaves the shipped code with
|
|
235
|
+
no browser test at all. Static checks are weaker still on built output: one that read
|
|
236
|
+
minified CSS raised a false alarm, and the rendered page, measured with
|
|
237
|
+
`getComputedStyle`, settled it.
|
|
238
|
+
|
|
239
|
+
**Some failures exist only on the live form, signed in.** A replica that draws its own
|
|
240
|
+
select hides a list the live form never hands over, and the first-frame flash needs the
|
|
241
|
+
real renderer (both in [08](08-PITFALLS.md)). Open the live form and log what the page
|
|
242
|
+
does every 50 ms. That is how both were found.
|
|
243
|
+
|
|
244
|
+
## 5. Keep the source under version control — outside the framework
|
|
245
|
+
|
|
246
|
+
The CSS and JS are the form's real source. `Data.code` is a deployment target, not a
|
|
247
|
+
repository: it is encrypted, it has no history, and it cannot be diffed.
|
|
248
|
+
|
|
249
|
+
Keep the files in the user-data area (`context-state-knowledge/resources/...`), not
|
|
250
|
+
in `tools/` — a specific client's form is user data, and the framework/user-data
|
|
251
|
+
boundary is hard. What belongs in the framework is the **generalized** knowledge:
|
|
252
|
+
this guide.
|
|
253
|
+
|
|
254
|
+
Alongside the CSS and JS, keep the process artifacts that are equally
|
|
255
|
+
un-round-trippable — prompts, request bodies, the process definition — so a rebuild
|
|
256
|
+
does not start from a screenshot.
|
|
257
|
+
|
|
258
|
+
**Build each form from source in every workspace. Do not import it in.** An import keeps
|
|
259
|
+
the form's id ([PROCESIO-API-NOTES](../PROCESIO-API-NOTES.md), *What an API import
|
|
260
|
+
carries*), so one id then lives in several workspaces, and the copies do not fail
|
|
261
|
+
together. Seen once: after a platform change, two imported copies came back empty and
|
|
262
|
+
would not open, while the original kept its content. Rebuilt from source with new ids,
|
|
263
|
+
they were back in minutes. Deleting a form touches only its own workspace, which is what
|
|
264
|
+
makes that repair safe; prove it on a throwaway form before you rely on it. Find forms by
|
|
265
|
+
name, never by a stored id, and let no save write when the read before it came back
|
|
266
|
+
empty. The tool's surgical actions refused in exactly that case.
|
|
267
|
+
|
|
268
|
+
## 6. Write the reasoning into the file, at the top
|
|
269
|
+
|
|
270
|
+
Both files should open with a header stating **how the thing runs** and **which rules
|
|
271
|
+
must never be broken**, with the symptom attached. This is not decoration: `Data.code`
|
|
272
|
+
carries no history and the next person to open it — including you, in three months —
|
|
273
|
+
has no other way to know.
|
|
274
|
+
|
|
275
|
+
```css
|
|
276
|
+
/* Two rules this file must never break, both learned on the live form:
|
|
277
|
+
- NO `overflow: hidden` on `.form-builder--form` — it kills page scrolling.
|
|
278
|
+
- NO `transform` on `.form-builder--form` — it makes the card the containing
|
|
279
|
+
block for `position: fixed` descendants, so the renderer's pinned footer
|
|
280
|
+
lands on top of the content. Entrances animate opacity only. */
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
The test for a good comment here: it names the **symptom** a future reader would
|
|
284
|
+
otherwise chase, not just the rule.
|
|
285
|
+
|
|
286
|
+
## 7. Before you touch a shared form
|
|
287
|
+
|
|
288
|
+
- Confirm the form id and the workspace, out loud, before the first write.
|
|
289
|
+
- `form-get-code` first, always — even when you are sure the form has no code. The
|
|
290
|
+
output *is* your backup.
|
|
291
|
+
- One change per write when debugging. Two changes in one write means a regression
|
|
292
|
+
has two suspects.
|
|
293
|
+
- After any change to a manifest or a contract, update the manifest in the same
|
|
294
|
+
commit (Hard rule 4) and re-run the tool's tests before publishing.
|