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,309 @@
|
|
|
1
|
+
# 02 — How form-level CSS and JavaScript actually run
|
|
2
|
+
|
|
3
|
+
**This is the prerequisite for everything else.** The execution model is not what
|
|
4
|
+
it looks like from the designer, and code written on the wrong assumption appears
|
|
5
|
+
to work on first load and then quietly stops.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Where the code lives
|
|
10
|
+
|
|
11
|
+
`Data.code` is the designer's "Switch to code" editor. It holds one object:
|
|
12
|
+
|
|
13
|
+
```json
|
|
14
|
+
{"JAVASCRIPT": "…", "CSS": "…"}
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
stored **AES-encrypted**: CryptoJS `AES.encrypt(text, passphrase)` — i.e. OpenSSL
|
|
18
|
+
AES-256-CBC, key + IV derived by `EVP_BytesToKey(MD5, 1 iteration)`, serialized as
|
|
19
|
+
`base64("Salted__" + salt + ciphertext)`. The passphrase is a **static key, one per
|
|
20
|
+
installation**, stored in the OS credential store per environment
|
|
21
|
+
(`agents-and-tools:procesio:form-code-key@<environment>`, see
|
|
22
|
+
[07](07-DEPLOY-WORKFLOW.md) §3) and never in a file.
|
|
23
|
+
|
|
24
|
+
There is **no plaintext CSS/JS field on the DTO**. The frontend holds `code` as a
|
|
25
|
+
plaintext `{JAVASCRIPT, CSS}` object in memory; the host webapp does the AES step.
|
|
26
|
+
Confirmed with the platform team: no unencrypted path exists.
|
|
27
|
+
|
|
28
|
+
**`{"JAVASCRIPT": null, "CSS": null}` is a normal decrypt result**, not a corrupt
|
|
29
|
+
blob — it is the designer's initial state, so every form that never opened "Switch
|
|
30
|
+
to code" carries it. Normalize `null → ""` before doing anything involving a length
|
|
31
|
+
or a concatenation.
|
|
32
|
+
|
|
33
|
+
## 2. The CSS - injected as a `<style>`, SCOPED to the form (changed in v3.0.0, 2026-10)
|
|
34
|
+
|
|
35
|
+
The renderer prepends a `<style>` element inside the form root, and since prod
|
|
36
|
+
user-playground v1.115.0 (ui-builder 0.185.0) it **scopes** the CSS first: every
|
|
37
|
+
selector is rewritten to `sel:where([data-form-css-scope=<id>], ...)`, so a rule
|
|
38
|
+
matches only the form root and what is inside it. The earlier rule here (a style
|
|
39
|
+
element is document-scoped, so page-level selectors work) is no longer true.
|
|
40
|
+
|
|
41
|
+
What no longer matches:
|
|
42
|
+
|
|
43
|
+
- rules for `body`, `html`, `:root`, the host page's chrome and the builder;
|
|
44
|
+
- `:root` custom properties, which therefore no longer reach the form. Declare them
|
|
45
|
+
on a selector for an element inside the form instead;
|
|
46
|
+
- tooltips and date-picker popups, which no longer get the form CSS.
|
|
47
|
+
|
|
48
|
+
What changes on the way in:
|
|
49
|
+
|
|
50
|
+
- comments and CSS the scoper cannot parse are dropped, with no error, so when a
|
|
51
|
+
rule seems to do nothing, check that it survived;
|
|
52
|
+
- `@keyframes` and `@font-face` are moved into a layer.
|
|
53
|
+
|
|
54
|
+
What is still global:
|
|
55
|
+
|
|
56
|
+
- a `<style>` inside a paragraph's or heading's HTML;
|
|
57
|
+
- `@import`;
|
|
58
|
+
- JS that injects a `<style>` into `window.parent.document` (the runtime pattern in
|
|
59
|
+
§4 can do this when a rule genuinely has to reach the page).
|
|
60
|
+
|
|
61
|
+
How the rewrite works (verified live): the **last compound** of every selector gets
|
|
62
|
+
`:where([data-form-css-scope="<formId>"], [data-form-css-scope="<formId>"] *)` appended.
|
|
63
|
+
So `.card {}` becomes `.card:where(...)`, `#app *` becomes `#app :where(...)`, `:root {}`
|
|
64
|
+
becomes `:root:where(...)` and `html, body {}` becomes `html:where(...), body:where(...)`.
|
|
65
|
+
`@keyframes`, `@import` and `@media` wrappers survive, and the rules inside `@media` are
|
|
66
|
+
rewritten the same way. The attribute sits on the form-builder elements
|
|
67
|
+
(`.form-builder-view--content` and `.form-builder--form`).
|
|
68
|
+
|
|
69
|
+
**What breaks: UI the JS renders OUTSIDE the form container.** A full-page app, a modal
|
|
70
|
+
or an overlay appended to `document.body` gets no styles at all, and `:root` variables and
|
|
71
|
+
`html` / `body` rules stop applying, because `<html>` and `<body>` are not inside the
|
|
72
|
+
scope. A form whose UI stays inside the form container is not affected.
|
|
73
|
+
|
|
74
|
+
**The fix (verified live on full-page forms):** before mounting, copy the scope id from
|
|
75
|
+
the form container onto `<html>`. Then `:root:where([attr])` matches and every element on
|
|
76
|
+
the page matches `[attr] *`:
|
|
77
|
+
|
|
78
|
+
```js
|
|
79
|
+
var host = document.querySelector('[data-form-css-scope]');
|
|
80
|
+
if (host && !document.documentElement.hasAttribute('data-form-css-scope'))
|
|
81
|
+
document.documentElement.setAttribute('data-form-css-scope',
|
|
82
|
+
host.getAttribute('data-form-css-scope'));
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Run it inside the same "wait until the form's elements exist" loop the code already
|
|
86
|
+
uses: the attribute only appears once the form has rendered. Setting the attribute only
|
|
87
|
+
on your own mounted root is NOT enough when the CSS uses `:root` variables or `html` /
|
|
88
|
+
`body` rules. `form-set-code` warns when the JS mounts on `document.body`, or the CSS
|
|
89
|
+
styles `:root` / `html` / `body`, without propagating the attribute.
|
|
90
|
+
|
|
91
|
+
The scoping broke forms that mount UI outside the container when it shipped, and a revert
|
|
92
|
+
was under discussion at the time of writing (2026-10-21). The fix above is harmless if the
|
|
93
|
+
scoping is reverted, so apply it regardless; drop the lint only once a revert is in prod.
|
|
94
|
+
|
|
95
|
+
### Global CSS from the first frame: `@import` of a `data:` stylesheet (verified 2026-10-22)
|
|
96
|
+
|
|
97
|
+
The attribute fix needs the JS, which arrives about a second after the form renders, so
|
|
98
|
+
anything it styles outside the container (the topbar, `html` / `body`) shows unstyled for
|
|
99
|
+
that second. An `@import` survives the scoper with its URL untouched, and the imported
|
|
100
|
+
sheet is **not scoped**. So the few rules that must be right from the first frame go in a
|
|
101
|
+
base64 `data:` import at the top of the form CSS:
|
|
102
|
+
|
|
103
|
+
```css
|
|
104
|
+
@import url("data:text/css;base64,<base64 of: .pds-c-topbar{display:none!important} html,body{background:#…!important}>");
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Measured on a public form: the topbar node never rendered visibly, not even for one
|
|
108
|
+
100 ms sample. Keep that sheet tiny and generate it in a build step from a readable file.
|
|
109
|
+
Have the runtime check a custom property the import sets (`html{--x-critical:1}`) and
|
|
110
|
+
inject the same rules as a `<style>` when it is missing, so the page still recovers if a
|
|
111
|
+
later release starts dropping data imports.
|
|
112
|
+
|
|
113
|
+
The branding class is also filtered: `js/form-builder/css.ts` replaces that
|
|
114
|
+
literal class string with a random number so it cannot be hidden.
|
|
115
|
+
|
|
116
|
+
## 3. The JavaScript — the part that surprises everyone
|
|
117
|
+
|
|
118
|
+
> Form-level JS is replayed by the renderer as a **synthetic `RUN_JAVASCRIPT`
|
|
119
|
+
> event**, on mount **and on every re-trigger**, inside a **throwaway sandbox
|
|
120
|
+
> iframe whose window is destroyed and rebuilt each time.**
|
|
121
|
+
|
|
122
|
+
Three consequences, and every one of them has bitten:
|
|
123
|
+
|
|
124
|
+
1. **Nothing survives the run.** Listeners, `MutationObserver`s, timers, module
|
|
125
|
+
state — all die with the iframe. Code that "worked once and then stopped" is
|
|
126
|
+
almost always this.
|
|
127
|
+
2. **It runs more than once.** Every re-trigger executes the whole file again.
|
|
128
|
+
Un-guarded code installs a second copy of every handler; symptoms are doubled
|
|
129
|
+
toasts, doubled ripples, doubled process launches.
|
|
130
|
+
3. **The sandbox is not the page.** `document` inside the sandbox is the iframe's
|
|
131
|
+
own. The real form is in `window.parent.document` — the platform confirms this
|
|
132
|
+
itself: the JS slot's shipped boilerplate reads
|
|
133
|
+
`console.log(window.parent.document); -> to access the DOM`.
|
|
134
|
+
|
|
135
|
+
**Sandbox lifetime (v3.0.0, 2026-10).** At most **5** form-fill sandboxes are live at
|
|
136
|
+
once; one is destroyed after **60 s** with no messages; and a run counts as finished
|
|
137
|
+
after a **100 ms** quiet period. So work a run starts and leaves pending (a
|
|
138
|
+
`setTimeout`, a slow `await`) may outlive the run's own lifetime and be lost with
|
|
139
|
+
its sandbox. Finish the run's work promptly, and put anything long-lived in the
|
|
140
|
+
parent-page runtime of §4.
|
|
141
|
+
|
|
142
|
+
## 4. The pattern that works: installer + runtime
|
|
143
|
+
|
|
144
|
+
Write **two layers**. The file itself is only an *installer*; the real code is a
|
|
145
|
+
function that gets injected once into the parent document, where it keeps its own
|
|
146
|
+
scope and lives as long as the page does.
|
|
147
|
+
|
|
148
|
+
```js
|
|
149
|
+
function UX_RUNTIME() {
|
|
150
|
+
if (window.__uxFormRuntime) { return; } // guard #2: the payload
|
|
151
|
+
window.__uxFormRuntime = true;
|
|
152
|
+
|
|
153
|
+
/* …everything: listeners, MutationObserver, timers, state… */
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* -- installer: put the runtime in the parent page, exactly once ------------ */
|
|
157
|
+
(function () {
|
|
158
|
+
try {
|
|
159
|
+
var W = window.parent && window.parent !== window ? window.parent : window;
|
|
160
|
+
var D = W.document;
|
|
161
|
+
if (!D || !D.body || D.getElementById('ux-runtime')) { return; } // guard #1
|
|
162
|
+
var s = D.createElement('script');
|
|
163
|
+
s.id = 'ux-runtime';
|
|
164
|
+
s.textContent = '(' + UX_RUNTIME.toString() + ')();';
|
|
165
|
+
D.body.appendChild(s);
|
|
166
|
+
} catch (e) {
|
|
167
|
+
// Cross-origin parent, or no parent at all: nothing to install, and the CSS
|
|
168
|
+
// layer still stands on its own.
|
|
169
|
+
}
|
|
170
|
+
})();
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Why each piece is exactly this way:
|
|
174
|
+
|
|
175
|
+
- **`fn.toString()`** carries the source across the boundary with no escaping
|
|
176
|
+
problems. Do not build the payload as a string literal — you will fight quoting
|
|
177
|
+
forever and every edit risks a syntax error you cannot see until runtime.
|
|
178
|
+
- **Two guards, not one.** The DOM id guard stops a second `<script>` from being
|
|
179
|
+
appended; the `window.__uxFormRuntime` flag stops a second *execution* if the
|
|
180
|
+
script somehow runs again. They protect different failures.
|
|
181
|
+
- **`window.parent !== window`** — the same file must also work when it is not
|
|
182
|
+
framed (a preview, a local replica). Falling back to `window` keeps one code
|
|
183
|
+
path for both.
|
|
184
|
+
- **The `try/catch` is deliberate.** A cross-origin parent throws on `.document`.
|
|
185
|
+
There is nothing to do about it and nothing to report: the CSS layer still
|
|
186
|
+
works, so the form degrades rather than breaking.
|
|
187
|
+
|
|
188
|
+
### The runtime is closure-scoped — that is the point
|
|
189
|
+
|
|
190
|
+
Because the payload runs as one IIFE in the parent document, everything it declares
|
|
191
|
+
is private to it. Expose only what other code genuinely needs, on `window`:
|
|
192
|
+
|
|
193
|
+
```js
|
|
194
|
+
window.UXToast = function (message, kind) { … }; // callable from element-event JS
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 5. Idempotency is a property of every function you write, not just the installer
|
|
198
|
+
|
|
199
|
+
The runtime installs once, but **inside** it you are reacting to a DOM that the
|
|
200
|
+
renderer rebuilds constantly. Every function that touches the DOM must be safe to
|
|
201
|
+
run a hundred times. The discipline is: **mark what you have already done, on the
|
|
202
|
+
node.**
|
|
203
|
+
|
|
204
|
+
```js
|
|
205
|
+
function addHint(el) {
|
|
206
|
+
if (q('.ux-hint', el)) { return; } // already has one
|
|
207
|
+
…
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
function decorateNav() {
|
|
211
|
+
all('.pds-c-button', box).forEach(function (btn) {
|
|
212
|
+
if (btn.getAttribute('data-ux-nav')) { return; } // already swapped
|
|
213
|
+
…
|
|
214
|
+
btn.setAttribute('data-ux-nav', kind);
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
A `data-*` attribute or the presence of your own injected child is the marker. Do
|
|
220
|
+
**not** keep a `Set` of nodes you have processed: the renderer destroys and
|
|
221
|
+
recreates nodes, so your set fills with corpses while the fresh nodes go
|
|
222
|
+
unprocessed.
|
|
223
|
+
|
|
224
|
+
## 6. The recompute loop
|
|
225
|
+
|
|
226
|
+
Because controls are recreated rather than hidden, there is no useful "on change"
|
|
227
|
+
event for structure. The working model is: **one idempotent `refresh()` that
|
|
228
|
+
recomputes everything from the current DOM, scheduled on a frame, driven by a
|
|
229
|
+
MutationObserver plus the interaction events.**
|
|
230
|
+
|
|
231
|
+
```js
|
|
232
|
+
var pending = false;
|
|
233
|
+
|
|
234
|
+
function refresh() {
|
|
235
|
+
pending = false;
|
|
236
|
+
/* recompute EVERYTHING from scratch: step position, gating, hints,
|
|
237
|
+
validation, decorations. No incremental state. */
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function schedule() {
|
|
241
|
+
if (pending) { return; } // coalesce a burst of mutations into one pass
|
|
242
|
+
pending = true;
|
|
243
|
+
raf(refresh);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
['input', 'change', 'click'].forEach(function (t) {
|
|
247
|
+
D.addEventListener(t, schedule, true); // capture: nothing can stop it
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
var mo = new MutationObserver(function () { schedule(); });
|
|
251
|
+
|
|
252
|
+
(function start() {
|
|
253
|
+
var host = q('.form-builder--form-body') || D.body;
|
|
254
|
+
if (!host) { return setTimeout(start, 120); } // the runtime may beat the render
|
|
255
|
+
mo.observe(host, { childList: true, subtree: true, characterData: true });
|
|
256
|
+
schedule();
|
|
257
|
+
})();
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
Points that matter:
|
|
261
|
+
|
|
262
|
+
- **`raf` + a `pending` flag** collapse a storm of mutations into a single pass. A
|
|
263
|
+
step change fires dozens of mutations; without coalescing you run `refresh()`
|
|
264
|
+
dozens of times per frame.
|
|
265
|
+
- **Capture-phase listeners** (`true`) cannot be blocked by a control that stops
|
|
266
|
+
propagation.
|
|
267
|
+
- **The retry loop in `start()`** exists because the runtime can be installed
|
|
268
|
+
before the form body exists.
|
|
269
|
+
- **`refresh()` is total, not incremental.** It never asks "what changed" — it
|
|
270
|
+
recomputes the whole visible state. This is the only model that survives nodes
|
|
271
|
+
being destroyed underneath you.
|
|
272
|
+
|
|
273
|
+
## 7. Reaching the platform's own model
|
|
274
|
+
|
|
275
|
+
`window.ProcesioForm` exists at runtime and exposes `.data.fields` — a map of field
|
|
276
|
+
state. It is reachable and occasionally the only way to do something (clearing a
|
|
277
|
+
radio group, for instance, since a radio cannot be un-clicked).
|
|
278
|
+
|
|
279
|
+
**It lives in the trigger sandbox, not on the page.** The sandbox builds it and posts every
|
|
280
|
+
write to the parent (`SET_VARIABLE_VALUE`); `typeof window.ProcesioForm` on the parent page
|
|
281
|
+
is `undefined` (measured 2026-10-22). So a runtime installed in the parent per §4 cannot read
|
|
282
|
+
it: derive state from the DOM there (a signature pad's ink, for instance, by sampling its
|
|
283
|
+
canvas pixels), or read it in element-event JS.
|
|
284
|
+
|
|
285
|
+
Treat it as a **last resort, not an API**: it is internal, undocumented, and can
|
|
286
|
+
change. Guard every access:
|
|
287
|
+
|
|
288
|
+
```js
|
|
289
|
+
var PF = window.ProcesioForm;
|
|
290
|
+
if (PF && PF.data && PF.data.fields) { … }
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
**Prefer clicking the real control.** The renderer is Vue-bound: setting
|
|
294
|
+
`input.checked` or `input.value` behind its back styles the control without ever
|
|
295
|
+
updating the form's value, so the field looks filled and submits empty. See
|
|
296
|
+
[04-INTERACTION-RECIPES.md](04-INTERACTION-RECIPES.md) §2.
|
|
297
|
+
|
|
298
|
+
## 8. Two-layer split: what goes in CSS, what goes in JS
|
|
299
|
+
|
|
300
|
+
| Put it in CSS | Put it in JS |
|
|
301
|
+
|---|---|
|
|
302
|
+
| every animation and transition | deciding *when* a class applies |
|
|
303
|
+
| every visual state (`.is-on`, `.ux-gated`, `.ux-invalid`) | adding and removing those classes |
|
|
304
|
+
| responsive rules, reduced-motion | reading values, validating, mapping |
|
|
305
|
+
| anything that must work if the JS fails | anything requiring knowledge of state |
|
|
306
|
+
|
|
307
|
+
The rule: **JS only ever toggles classes; CSS decides what a class looks like.**
|
|
308
|
+
This keeps the form presentable if the runtime fails to install (cross-origin
|
|
309
|
+
parent, script error) and makes every visual change reviewable in one file.
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
# 03 — The runtime DOM: selectors, structure, and what you may rely on
|
|
2
|
+
|
|
3
|
+
The reference you need open while writing CSS or any `querySelector`. Two selector
|
|
4
|
+
families, two very different levels of trust.
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## 1. The two families
|
|
9
|
+
|
|
10
|
+
### `.form-builder--*` — the renderer's own classes. **Trustworthy.**
|
|
11
|
+
|
|
12
|
+
They live in this platform's own SCSS, they are stable, and they are the ones to
|
|
13
|
+
build on.
|
|
14
|
+
|
|
15
|
+
| Selector | What it is |
|
|
16
|
+
|---|---|
|
|
17
|
+
| `.form-builder--form` | the card — the outermost form container |
|
|
18
|
+
| `.form-builder--form-body` | the scrolling body inside the card |
|
|
19
|
+
| `.form-builder--element[data-element-id]` | **one control** — the unit you iterate |
|
|
20
|
+
| `.form-builder--columns` / `--column` | layout containers |
|
|
21
|
+
| `.form-builder--stepper` | the stepper as a whole |
|
|
22
|
+
| `.form-builder--stepper--container` | the **active step's content** |
|
|
23
|
+
| `.form-builder--stepper--nav` / `--nav--item` | the platform's own step indicator |
|
|
24
|
+
| `.form-builder--stepper--buttons` | the nav button bar |
|
|
25
|
+
| `.form-builder--stepper--buttons--next` | the next-button host |
|
|
26
|
+
| `.form-builder--input` / `--select` / `--checkbox` / `--radiobox` / `--file-upload` | control wrappers by type |
|
|
27
|
+
| `.form-builder--file-upload--description` | the dropzone's helper line |
|
|
28
|
+
| `.form-builder--button` | a button control |
|
|
29
|
+
|
|
30
|
+
### `.pds-c-*` — the design system. **Use with care.**
|
|
31
|
+
|
|
32
|
+
These come from the `@procesio/procesio-design-system` npm package, whose internals
|
|
33
|
+
are **not in this repo**. Only the ones the renderer's own SCSS references are safe;
|
|
34
|
+
anything deeper must be verified against a live render before you rely on it.
|
|
35
|
+
|
|
36
|
+
| Selector | What it is |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `.pds-c-input-group--wrapper` | the box around an input |
|
|
39
|
+
| `.pds-c-input-group--wrapper--focused` | focused state (also use `:focus-within`) |
|
|
40
|
+
| `.pds-c-input-group--wrapper--is-error` | platform validation error state |
|
|
41
|
+
| `.pds-c-input-group--label` | **the field's label** — your primary identification handle |
|
|
42
|
+
| `.pds-c-input-group--message--is-error` | the error message node |
|
|
43
|
+
| `.pds-c-input-group--square` | the checkbox square |
|
|
44
|
+
| `.pds-c-radiobox` / `.pds-c-radiobox--is-checked` | radio dot and its checked state |
|
|
45
|
+
| `.pds-c-button` / `.pds-c-button--solid-primary` / `.pds-c-button--small` | buttons and variants |
|
|
46
|
+
| `.pds-c-step--header--circle` `[--active]` | the platform stepper's circles |
|
|
47
|
+
| `.pds-c-step-connector` | the line between them |
|
|
48
|
+
| `.pds-c-modal--dialog--upload-icon` | the upload glyph |
|
|
49
|
+
| `.form-builder--select .multiselect__tags` / `.multiselect__option--selected` | the select is vue-multiselect underneath |
|
|
50
|
+
|
|
51
|
+
## 2. Structural facts you can build on
|
|
52
|
+
|
|
53
|
+
**A control is `.form-builder--element[data-element-id]`.** Elements nest (a column
|
|
54
|
+
is also an element), so "a leaf control" is:
|
|
55
|
+
|
|
56
|
+
```js
|
|
57
|
+
function fields() {
|
|
58
|
+
return all('.form-builder--element[data-element-id]').filter(function (el) {
|
|
59
|
+
return q('input, textarea, select', el) && // has a real control…
|
|
60
|
+
!q('.form-builder--element[data-element-id]', el); // …and is a leaf
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**The active step's content is `.form-builder--stepper--container`.** Its direct
|
|
66
|
+
element children are the controls of the current step — that is the handle for
|
|
67
|
+
staggered entrances and for the leave/arrive transition:
|
|
68
|
+
|
|
69
|
+
```css
|
|
70
|
+
.form-builder--stepper--container > .form-builder--element { … }
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
**Controls are recreated, not hidden** (`v-if`). So:
|
|
74
|
+
- entrance animations re-fire on every step change — free, and desirable;
|
|
75
|
+
- **exit transitions are impossible** — by the time you would animate it out, the
|
|
76
|
+
node is gone. Animate the *container*, not the departing control ([05](05-STEPPER-AND-MOTION.md) §4);
|
|
77
|
+
- never store state on a node; recompute it ([02](02-CODE-INJECTION.md) §6).
|
|
78
|
+
|
|
79
|
+
## 3. Identify fields by LABEL, not by id
|
|
80
|
+
|
|
81
|
+
Element ids change whenever a control is rebuilt in the designer. Labels are what
|
|
82
|
+
the form actually promises to the person filling it in, and they change only when
|
|
83
|
+
the meaning changes.
|
|
84
|
+
|
|
85
|
+
```js
|
|
86
|
+
function norm(s) { // fold diacritics + case + whitespace
|
|
87
|
+
return String(s || '').toLowerCase()
|
|
88
|
+
.replace(/[ăâ]/g, 'a').replace(/[îi]/g, 'i').replace(/[șş]/g, 's')
|
|
89
|
+
.replace(/[țţ]/g, 't').replace(/\s+/g, ' ');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
var LABELS = [
|
|
93
|
+
['repciserie', 'id doc representative — series'], // ORDER MATTERS:
|
|
94
|
+
['ciserie', 'id doc — series'], // the longer, more specific
|
|
95
|
+
['cnp', 'personal number'], // label must be tested FIRST
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
function fieldKey(el) {
|
|
99
|
+
var lbl = q('.pds-c-input-group--label', el);
|
|
100
|
+
var n = norm(lbl ? lbl.textContent : el.textContent);
|
|
101
|
+
for (var i = 0; i < LABELS.length; i++) {
|
|
102
|
+
if (n.indexOf(LABELS[i][1]) > -1) { return LABELS[i][0]; }
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**Order the list from most specific to least.** A substring match on a shorter
|
|
109
|
+
label will swallow the longer one — `'id doc — series'` matches inside
|
|
110
|
+
`'id doc representative — series'`, so the representative's field would be keyed
|
|
111
|
+
wrongly if it came second.
|
|
112
|
+
|
|
113
|
+
Normalize diacritics on **both** sides of every comparison. A form written in
|
|
114
|
+
Romanian will otherwise match `ț` against `t` and fail for no visible reason.
|
|
115
|
+
|
|
116
|
+
## 4. Detect state from TEXT when class matching is unreliable
|
|
117
|
+
|
|
118
|
+
Step wrappers come from the design-system package, and matching them by class has
|
|
119
|
+
already failed once on a live form. Reading the visible text of the step container
|
|
120
|
+
is more robust, because the banner text is the form's own content:
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
var STEPS = [
|
|
124
|
+
{ label: 'Applicant type', marks: ['who is requesting'] },
|
|
125
|
+
{ label: 'Identification', marks: ['identification details'] },
|
|
126
|
+
];
|
|
127
|
+
|
|
128
|
+
function currentStep() {
|
|
129
|
+
var host = q('.form-builder--stepper--container') || q('.form-builder--form-body');
|
|
130
|
+
if (!host) { return -1; }
|
|
131
|
+
var text = norm(host.innerText || host.textContent);
|
|
132
|
+
for (var i = 0; i < STEPS.length; i++) {
|
|
133
|
+
for (var j = 0; j < STEPS[i].marks.length; j++) {
|
|
134
|
+
if (text.indexOf(STEPS[i].marks[j]) > -1) { return i; }
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return -1; // unknown — see below
|
|
138
|
+
}
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
**Return a sentinel for "unknown" and honour it.** When the step cannot be
|
|
142
|
+
identified, leave the indicator exactly as it was rather than guessing. Wrong
|
|
143
|
+
information is worse than a stale frame — a progress bar that jumps to 100% because
|
|
144
|
+
the match failed actively misleads.
|
|
145
|
+
|
|
146
|
+
## 5. CSS traps specific to this renderer
|
|
147
|
+
|
|
148
|
+
### A hand-built node renders unstyled: the CSS is Vue-SCOPED
|
|
149
|
+
|
|
150
|
+
Every platform-rendered element carries a `data-v-<hash>` attribute, and the rules are
|
|
151
|
+
written as `.pds-c-message[data-v-<hash>] { … }`. A node built with `createElement` has no
|
|
152
|
+
such attribute, so copying the platform's class list is **not** enough — the scoped rules
|
|
153
|
+
never match it. The symptom is a widget that works but looks wrong.
|
|
154
|
+
|
|
155
|
+
Never hardcode the hash; it changes on every frontend rebuild. Clone an existing native
|
|
156
|
+
node of the same kind instead — `cloneNode(true)` carries the scope attributes, the inner
|
|
157
|
+
markup and the theme for free.
|
|
158
|
+
|
|
159
|
+
Worked example, with the inner-structure details and the "exclude your own node from the
|
|
160
|
+
template query" trap:
|
|
161
|
+
[`../dto/form/description.md`](../dto/form/description.md).
|
|
162
|
+
|
|
163
|
+
### `overflow: hidden` on `.form-builder--form` kills page scrolling
|
|
164
|
+
|
|
165
|
+
The card is the scroll context. Clipping it makes the page unscrollable and the
|
|
166
|
+
lower half of a long form unreachable. If you need something clipped to the card's
|
|
167
|
+
rounded corners, **paint it as a background** — backgrounds are clipped to
|
|
168
|
+
`border-radius` automatically:
|
|
169
|
+
|
|
170
|
+
```css
|
|
171
|
+
.form-builder--form {
|
|
172
|
+
background-image: linear-gradient(90deg, #1E67D2 0%, #4FA8F5 50%, #1E67D2 100%);
|
|
173
|
+
background-size: 720px 4px;
|
|
174
|
+
background-repeat: repeat-x; /* MUST tile, see below */
|
|
175
|
+
background-position: 0 0;
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### `transform` on `.form-builder--form` breaks the pinned footer
|
|
180
|
+
|
|
181
|
+
A `transform` on an ancestor makes that ancestor the **containing block** for
|
|
182
|
+
`position: fixed` descendants. The renderer's pinned footer then anchors to the
|
|
183
|
+
card instead of the viewport and lands on top of the content. **Entrance animations
|
|
184
|
+
on the card must animate `opacity` only** — never `transform`, `filter`,
|
|
185
|
+
`perspective`, or `will-change: transform`.
|
|
186
|
+
|
|
187
|
+
### An animated background must tile
|
|
188
|
+
|
|
189
|
+
Animating `background-position` on a `no-repeat` gradient slides it off-screen and
|
|
190
|
+
the element goes blank for the rest of the cycle. Set `repeat-x`, make the gradient
|
|
191
|
+
start and end on the same colour, and travel **exactly one tile per cycle**:
|
|
192
|
+
|
|
193
|
+
```css
|
|
194
|
+
@keyframes tide { from { background-position: 0 0; } to { background-position: 720px 0; } }
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### Inline styles on the form's own markup beat your stylesheet
|
|
198
|
+
|
|
199
|
+
If the form author wrote `style="border-left: 4px solid #2578E9"` in an HTML
|
|
200
|
+
paragraph, only `!important` can override it:
|
|
201
|
+
|
|
202
|
+
```css
|
|
203
|
+
.ux-choice--on [style*="border-left"] { border-left-color: #409920 !important; }
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
The `[style*="…"]` attribute selector is how you target "whatever element carries
|
|
207
|
+
that inline rule" without knowing its structure.
|
|
208
|
+
|
|
209
|
+
### An `<img>` icon cannot be recoloured with `color`
|
|
210
|
+
|
|
211
|
+
Icon-font-as-image services (iconify and similar) bake the colour into the URL. A
|
|
212
|
+
CSS `filter` only approximates the target colour and tints the whole glyph.
|
|
213
|
+
**Rewrite the URL parameter instead:**
|
|
214
|
+
|
|
215
|
+
```js
|
|
216
|
+
var want = on ? '%23409920' : '%232578E9';
|
|
217
|
+
var next = icon.getAttribute('src').replace(/color=%23[0-9A-Fa-f]{6}/, 'color=' + want);
|
|
218
|
+
if (next !== icon.getAttribute('src')) { icon.setAttribute('src', next); }
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
The equality check keeps the attribute write out of the MutationObserver loop when
|
|
222
|
+
nothing changed — otherwise you feed your own observer.
|
|
223
|
+
|
|
224
|
+
### The card is often taller than the viewport
|
|
225
|
+
|
|
226
|
+
Centring an overlay indicator *inside* the card can park it below the fold. Use
|
|
227
|
+
`position: sticky` on the inner block so it stays on screen wherever the reader is
|
|
228
|
+
scrolled:
|
|
229
|
+
|
|
230
|
+
```css
|
|
231
|
+
.ux-veil__inner { position: sticky; top: 40vh; }
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Platform defaults that fight a redesign (measured 2026-10-22)
|
|
235
|
+
|
|
236
|
+
- **The page scrolls in `.form-builder-view--content`**, not in `body` or `main`. Fixed UI
|
|
237
|
+
you mount on `body` sits above it; give that element the top padding a fixed header needs.
|
|
238
|
+
- **`.form-builder--section--container`** carries a 1px border, a light background, a 4px
|
|
239
|
+
radius and 16px padding even when the section's own `style` config sets none. Reset all
|
|
240
|
+
four, or every redesigned section sits inside a faint grey box.
|
|
241
|
+
- **`.form-builder--button` has a fixed height** (the theme's button height, 40px). Make the
|
|
242
|
+
`<button>` taller and anything you append after it overlaps it; set `height: auto` on the
|
|
243
|
+
wrapper. Its `.pds-c-button--dropdown` sibling is an empty split-button part; hide it.
|
|
244
|
+
- **A paragraph's HTML is rendered through DOMPurify into the live page, next to Bootstrap.**
|
|
245
|
+
Generic class names in authored markup collide with Bootstrap rules: an SVG `<circle
|
|
246
|
+
class="badge">` vanished because `.badge:empty { display: none }`. Prefix every class.
|
|
247
|
+
|
|
248
|
+
### File viewer (INLINE) and signature pad: what is inside
|
|
249
|
+
|
|
250
|
+
- File viewer: `.form-builder--file-viewer` > `--container` > `--container--viewer` (the
|
|
251
|
+
internal scroller, `max-height` around 640px) > `.vue-pdf-embed`, one `<canvas>` per page.
|
|
252
|
+
While a file loads the container shows `--container--loading`; a bad file shows
|
|
253
|
+
`--container--failed`; no `src` yet shows `--container--empty-message`. "Empty" also shows
|
|
254
|
+
briefly while a process-output file is still being fetched, so wait a few seconds before
|
|
255
|
+
you treat it as final. Count rendered pages by counting the canvases.
|
|
256
|
+
- Signature pad: `.form-builder--signature-pad` > `--canvas-wrapper` > `canvas`, then a
|
|
257
|
+
footer with the platform's Clear button. The pad paints a white background into the canvas,
|
|
258
|
+
so ink = any pixel clearly darker than white (sample a downscaled copy after `pointerup`
|
|
259
|
+
and after Clear). A `ResizeObserver` **clears and redraws** the pad whenever the canvas
|
|
260
|
+
size changes, so never animate the canvas or its wrapper's padding; set the size once.
|
|
261
|
+
|
|
262
|
+
### Table + dynamic-table-row: what is inside (measured on a live form, 2026-10-22)
|
|
263
|
+
|
|
264
|
+
A table with a dynamic row renders TWO `table.pds-c-table`: the Table control's own (header
|
|
265
|
+
only) and, inside its `tbody`, the dynamic row's table, whose `thead` exists but is
|
|
266
|
+
`display: none` (`--no-header`). Each item of the dynamic row is nested:
|
|
267
|
+
`div.form-builder--table-dynamic-row--container--item[data-row-index]` > `td.form-builder--table-static-row`
|
|
268
|
+
> `tr.form-builder--table-static-row--container` > **`tr.pds-c-table--row`** > `td.pds-c-table--cell`.
|
|
269
|
+
Both of those `tr` are **`display: flex`**, so the cells are flex items, not table cells: widths
|
|
270
|
+
set on `td` act as flex-basis and the header table (a real table) does not line up with them on
|
|
271
|
+
its own. Make the header row flex too (`thead.pds-c-table--header > tr { display: flex }`), give
|
|
272
|
+
`th:nth-child(n)` and the row's `td:nth-child(n)` the same `flex: 0 0 <w>`, let one column take
|
|
273
|
+
the rest (`flex: 1 1 auto; min-width: 0`) in both, and give both rows the same 1px border (the
|
|
274
|
+
header's transparent): the label then sits exactly over its column (measured: every left edge
|
|
275
|
+
and width equal to the pixel). Style the ROW as the card (border, radius, background), not the
|
|
276
|
+
cells.
|
|
277
|
+
|
|
278
|
+
- Helper rows `tr.pds-c-table--row.pds-c-table--row--before/--after` also carry
|
|
279
|
+
`pds-c-table--row`: select data rows with
|
|
280
|
+
`tr.pds-c-table--row:not(.pds-c-table--row--before):not(.pds-c-table--row--after)`, as a
|
|
281
|
+
DESCENDANT (they are not children of `tbody`).
|
|
282
|
+
- Every header cell has the id `th<columnKey>` (`thstatus`, `thid`); map a column by that id in
|
|
283
|
+
the ROW's own table (`tr.closest('table')`). Counting `thead th` under the control counts both
|
|
284
|
+
tables. The first column is the index column when `hasIndexColumn` is on.
|
|
285
|
+
- A cell's text sits in `.form-builder--table-cell > … > .form-builder--table-cell--container--text`;
|
|
286
|
+
`.form-builder--table-cell` is a ~54px block. To relabel a cell the renderer owns (translate a
|
|
287
|
+
status, shorten an id), never rewrite the text node (Vue patches it back): put the label in a
|
|
288
|
+
data attribute on the `td`, hide `.form-builder--table-cell` in that `td`, and paint
|
|
289
|
+
`td[data-x]::after { content: attr(data-x) }`.
|
|
290
|
+
- A control placed in a column (the row's button) renders once per row with the SAME
|
|
291
|
+
`data-element-id`; find "this row's button" from the row.
|
|
292
|
+
|
|
293
|
+
### File-upload used as a download (process output)
|
|
294
|
+
|
|
295
|
+
`.form-builder--file-upload` > `.pds-c-modal--upload` > `.pds-c-modal--dialog--content` > … >
|
|
296
|
+
`.pds-c-modal--dialog--content--action` (`--first` holds the file name, `--actions--icon` is the
|
|
297
|
+
download icon). With no file the same control shows the upload drop zone instead, which invites
|
|
298
|
+
an upload on a read-only screen: hide it with
|
|
299
|
+
`.form-builder--file-upload:not(:has(.pds-c-modal--dialog--content--action))`.
|
|
300
|
+
|
|
301
|
+
**Driving it from your own download menu (measured 2026-10-22).** The download icon is
|
|
302
|
+
`i.pds-c-modal--dialog--content--action--actions--icon[role=button][aria-label="Download file"]`
|
|
303
|
+
(text `download`; an editable control also has a delete icon next to it, so select by the label,
|
|
304
|
+
never by position). Clicking it makes no request: the platform already holds the file it fetched
|
|
305
|
+
after the run ([06](06-PROCESS-INTEGRATION.md) §3c), wraps it in a `Blob` of the real type
|
|
306
|
+
(`application/pdf`, `…wordprocessingml.document`), calls `URL.createObjectURL` and clicks an
|
|
307
|
+
`<a download="<file name>">` on that `blob:` URL. `element.click()` on the icon works while the
|
|
308
|
+
control's host is `display: none`, so the visible UI can be one custom menu per document while
|
|
309
|
+
the file-upload controls stay rendered (`visible: true`, see [01](01-ANATOMY.md)) and unseen. The
|
|
310
|
+
file name for the menu is the text of `.pds-c-modal--dialog--content--action--first`.
|
|
311
|
+
|
|
312
|
+
**Print from the same file.** There is no print action. Arm a short window, click the PDF
|
|
313
|
+
control's icon, keep the `Blob` your `URL.createObjectURL` wrapper sees with a `pdf` type, and in a
|
|
314
|
+
wrapper of `HTMLAnchorElement.prototype.click` cancel that one `blob:` click (the platform may
|
|
315
|
+
revoke its own URL right after, so make a fresh one from the kept Blob). Load it into a hidden
|
|
316
|
+
same-origin `<iframe>` and call `contentWindow.print()` on load. Measured: in Chrome the frame
|
|
317
|
+
loads as `application/pdf` and `print()` opens the dialog with nothing saved. Where
|
|
318
|
+
`navigator.pdfViewerEnabled === false` (PDF viewing turned off, and Playwright's default
|
|
319
|
+
headless shell) the frame does not render the PDF, it DOWNLOADS it under the blob's GUID, so
|
|
320
|
+
skip the frame there and let the normal download run. Safari and Firefox print such a frame
|
|
321
|
+
blank or refuse it: open the PDF in a new tab instead (inside the click, or the pop-up blocker
|
|
322
|
+
stops it).
|
|
323
|
+
|
|
324
|
+
**A menu inside the kit's document card is clipped** by the card's `overflow: hidden` (it is there
|
|
325
|
+
only for the rounded corners). Put the radius on the bar (top) and on the viewer scroller (bottom)
|
|
326
|
+
and let the card overflow, or the open menu is cut at the card's edge on a phone.
|
|
327
|
+
|
|
328
|
+
## 6. Responsive and reduced motion
|
|
329
|
+
|
|
330
|
+
Side-by-side columns truncate every label on a phone. Cover both layout modes —
|
|
331
|
+
whichever the renderer uses, the other declaration is inert:
|
|
332
|
+
|
|
333
|
+
```css
|
|
334
|
+
@media (max-width: 760px) {
|
|
335
|
+
.form-builder--columns { flex-wrap: wrap; grid-template-columns: 1fr; }
|
|
336
|
+
.form-builder--column { flex: 1 1 100%; min-width: 0; }
|
|
337
|
+
}
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Honour the motion preference. One block covers the whole layer:
|
|
341
|
+
|
|
342
|
+
```css
|
|
343
|
+
@media (prefers-reduced-motion: reduce) {
|
|
344
|
+
.form-builder--form *, .form-builder--form *::before, .form-builder--form *::after,
|
|
345
|
+
.ux-toast, .ux-veil, .ux-veil__drop span {
|
|
346
|
+
animation-duration: 1ms !important;
|
|
347
|
+
animation-iteration-count: 1 !important;
|
|
348
|
+
transition-duration: 1ms !important;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
```
|
|
352
|
+
|
|
353
|
+
## 7. Use the theme's variables, define your own on the card
|
|
354
|
+
|
|
355
|
+
Declare your design tokens on `.form-builder--form` so they cascade to everything
|
|
356
|
+
you write, and derive them from the theme's existing colours rather than inventing
|
|
357
|
+
new ones (a palette is usually a hard requirement on a client form):
|
|
358
|
+
|
|
359
|
+
```css
|
|
360
|
+
.form-builder--form {
|
|
361
|
+
--ux-ease: cubic-bezier(0.22, 1, 0.36, 1);
|
|
362
|
+
--ux-fast: 160ms; --ux-mid: 300ms; --ux-slow: 520ms;
|
|
363
|
+
--ux-ink: #123E7E; --ux-accent: #2578E9; --ux-line: #D6E2F0;
|
|
364
|
+
--ux-ring: rgba(37, 120, 233, .16);
|
|
365
|
+
}
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
The platform's own theme variables (`--c-neutral--500`, `--c-primary`, `--h-input`,
|
|
369
|
+
`--p-form`, `--gap-columns`, …) are available and should be preferred wherever one
|
|
370
|
+
exists — they keep your layer consistent with a theme change made in the designer.
|