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,600 @@
|
|
|
1
|
+
# 04 — Interaction recipes
|
|
2
|
+
|
|
3
|
+
Working patterns for the things a professional form actually needs: reading and
|
|
4
|
+
writing values, hiding controls, gating navigation, turning static markup into a
|
|
5
|
+
control, per-field validation, localized messages, feedback. Every snippet here
|
|
6
|
+
runs **inside the runtime payload** described in
|
|
7
|
+
[02-CODE-INJECTION.md](02-CODE-INJECTION.md) and assumes its helpers:
|
|
8
|
+
|
|
9
|
+
```js
|
|
10
|
+
var D = document;
|
|
11
|
+
function q(s, r) { return (r || D).querySelector(s); }
|
|
12
|
+
function all(s, r) { return Array.prototype.slice.call((r || D).querySelectorAll(s)); }
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 1. Read a field's value
|
|
18
|
+
|
|
19
|
+
```js
|
|
20
|
+
function isFilled(el) {
|
|
21
|
+
if (q('input[type=checkbox], input[type=radio]', el)) {
|
|
22
|
+
return !!q('input:checked', el);
|
|
23
|
+
}
|
|
24
|
+
var f = q('input, textarea, select', el);
|
|
25
|
+
return !!(f && String(f.value || '').trim());
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Checkboxes and radios are checked-state, everything else is `.value`. Always
|
|
30
|
+
`.trim()` — a space is not a value.
|
|
31
|
+
|
|
32
|
+
## 2. Write a value: **click the control, never set the property**
|
|
33
|
+
|
|
34
|
+
The renderer is Vue-bound. Setting `input.checked = true` or `input.value = 'x'`
|
|
35
|
+
behind Vue's back changes what the user sees and **does not update the form's
|
|
36
|
+
value** — the field looks filled and submits empty. Click the real control:
|
|
37
|
+
|
|
38
|
+
```js
|
|
39
|
+
function radioFor(kind) {
|
|
40
|
+
var hit = null;
|
|
41
|
+
all('.form-builder--radiobox label').forEach(function (l) {
|
|
42
|
+
if (hit) { return; }
|
|
43
|
+
if (norm(l.textContent).trim() === kind) { hit = l; }
|
|
44
|
+
});
|
|
45
|
+
return hit;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
var label = radioFor('individual');
|
|
49
|
+
if (label) { label.click(); } // Vue sees this and updates the model
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
For text inputs, if you genuinely must write programmatically, set the value **and**
|
|
53
|
+
dispatch the events Vue listens for:
|
|
54
|
+
|
|
55
|
+
```js
|
|
56
|
+
function setText(el, value) {
|
|
57
|
+
var f = q('input, textarea', el);
|
|
58
|
+
if (!f) { return; }
|
|
59
|
+
f.value = value;
|
|
60
|
+
f.dispatchEvent(new Event('input', { bubbles: true }));
|
|
61
|
+
f.dispatchEvent(new Event('change', { bubbles: true }));
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Prefer to avoid this entirely. If values come from a process, let the event's
|
|
66
|
+
`outputMap` write them natively — see [06](06-PROCESS-INTEGRATION.md).
|
|
67
|
+
|
|
68
|
+
### Clearing a radio group
|
|
69
|
+
|
|
70
|
+
A radio cannot be un-clicked. Clear the model where it is reachable, then the DOM:
|
|
71
|
+
|
|
72
|
+
```js
|
|
73
|
+
function clearChoice() {
|
|
74
|
+
var PF = window.ProcesioForm;
|
|
75
|
+
if (PF && PF.data && PF.data.fields) {
|
|
76
|
+
var f = PF.data.fields;
|
|
77
|
+
for (var k in f) {
|
|
78
|
+
if (norm(k).indexOf('clienttype') > -1 && f[k]) { f[k].value = ''; }
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
CHOICES.forEach(function (c) {
|
|
82
|
+
var l = radioFor(c), i = l && q('input', l);
|
|
83
|
+
if (i && i.checked) { i.checked = false; }
|
|
84
|
+
var dot = l && q('.pds-c-radiobox', l);
|
|
85
|
+
if (dot) { dot.classList.remove('pds-c-radiobox--is-checked'); }
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
**Do not re-dispatch `change` here.** On a Vue-bound group that handler reads the
|
|
91
|
+
option's value and would simply re-select what you just cleared.
|
|
92
|
+
|
|
93
|
+
## 3. Hide a control — one class, `display: none`
|
|
94
|
+
|
|
95
|
+
```css
|
|
96
|
+
.ux-gated { display: none !important; }
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
```js
|
|
100
|
+
el.classList.toggle('ux-gated', shouldHide);
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**`display: none`, not `visibility` or `opacity`.** A control you can still reach
|
|
104
|
+
with Tab but cannot see is a worse bug than a visible one — it traps keyboard users
|
|
105
|
+
in an invisible field. Hide the **whole element wrapper**
|
|
106
|
+
(`b.closest('.form-builder--element')`), not just the inner button, so no empty row
|
|
107
|
+
is left behind.
|
|
108
|
+
|
|
109
|
+
## 4. Gate a navigation button on a condition
|
|
110
|
+
|
|
111
|
+
Hide the button's host rather than disabling it — a disabled control invites
|
|
112
|
+
clicking; an absent one reads as "not yet".
|
|
113
|
+
|
|
114
|
+
```js
|
|
115
|
+
function gateNext(ready) {
|
|
116
|
+
var next = q('.ux-nav--next');
|
|
117
|
+
if (!next) { return; }
|
|
118
|
+
var host = next.closest('.form-builder--stepper--buttons--next') || next;
|
|
119
|
+
host.classList.toggle('ux-gated', !ready);
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
The `|| next` fallback matters: the host wrapper is not guaranteed to exist in
|
|
124
|
+
every renderer version, and falling back to the button itself keeps the behaviour
|
|
125
|
+
correct rather than silently doing nothing.
|
|
126
|
+
|
|
127
|
+
### Gate the form's own tail buttons on the phase
|
|
128
|
+
|
|
129
|
+
Buttons that belong to a later view (a generated contract, a confirmation screen)
|
|
130
|
+
are often visible on a fresh load because the form's own logic only hides them
|
|
131
|
+
inside a click handler that has never run. Gate them on an observable phase:
|
|
132
|
+
|
|
133
|
+
```js
|
|
134
|
+
function gateTail() {
|
|
135
|
+
var filling = !!q('.form-builder--stepper'); // stepper on screen = still filling in
|
|
136
|
+
tailButtons().forEach(function (b) {
|
|
137
|
+
var host = b.closest('.form-builder--element') || b;
|
|
138
|
+
host.classList.toggle('ux-gated', filling);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 5. Turn static markup into a control (description cards as a selector)
|
|
144
|
+
|
|
145
|
+
The pattern: the radio group is the *real* control but carries no explanation; the
|
|
146
|
+
descriptive cards carry everything and are what people aim at. Make the cards
|
|
147
|
+
clickable, hide the radio group, keep the radio as the source of truth.
|
|
148
|
+
|
|
149
|
+
```js
|
|
150
|
+
function wireChoiceCards() {
|
|
151
|
+
choiceCards().forEach(function (card) {
|
|
152
|
+
var kind = choiceKind(card.textContent);
|
|
153
|
+
|
|
154
|
+
if (!card.getAttribute('data-ux-choice')) { // idempotent: wire once
|
|
155
|
+
card.setAttribute('data-ux-choice', kind);
|
|
156
|
+
card.setAttribute('role', 'button'); // it is a control now —
|
|
157
|
+
card.setAttribute('tabindex', '0'); // say so, and be reachable
|
|
158
|
+
card.classList.add('ux-choice');
|
|
159
|
+
|
|
160
|
+
var pick = function (e) {
|
|
161
|
+
e.preventDefault();
|
|
162
|
+
if (radioChecked(kind)) { clearChoice(); } // 2nd click deselects
|
|
163
|
+
else { var l = radioFor(kind); if (l) { l.click(); } }
|
|
164
|
+
schedule();
|
|
165
|
+
};
|
|
166
|
+
card.addEventListener('click', pick);
|
|
167
|
+
card.addEventListener('keydown', function (e) {
|
|
168
|
+
if (e.key === 'Enter' || e.key === ' ') { pick(e); }
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
var on = radioChecked(kind); // state read from the RADIO
|
|
173
|
+
card.classList.toggle('ux-choice--on', on);
|
|
174
|
+
card.setAttribute('aria-pressed', on ? 'true' : 'false');
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
Then hide the raw group: `radioHost.classList.add('ux-gated')`.
|
|
180
|
+
|
|
181
|
+
**The state is always read back from the real control**, never remembered on the
|
|
182
|
+
card. That is what keeps the two in sync when the renderer rebuilds the step.
|
|
183
|
+
|
|
184
|
+
Locating the cards without ids — match on content, and require a discriminator that
|
|
185
|
+
separates the descriptive card from the radio label itself:
|
|
186
|
+
|
|
187
|
+
```js
|
|
188
|
+
function choiceCards() {
|
|
189
|
+
return all('.form-builder--column .form-builder--element').filter(function (el) {
|
|
190
|
+
if (q('.form-builder--element', el)) { return false; } // leaves only
|
|
191
|
+
var t = norm(el.textContent);
|
|
192
|
+
return !!choiceKind(t) && t.indexOf('i am requesting a contract') > -1;
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
## 6. Replace button text with an icon
|
|
198
|
+
|
|
199
|
+
```js
|
|
200
|
+
var ARROW = {
|
|
201
|
+
next: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" ' +
|
|
202
|
+
'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
|
|
203
|
+
'<path d="M5 12h14"/><path d="M12 5l7 7-7 7"/></svg>'
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
function decorateNav() {
|
|
207
|
+
var box = q('.form-builder--stepper--buttons');
|
|
208
|
+
if (!box) { return; }
|
|
209
|
+
all('.pds-c-button', box).forEach(function (btn) {
|
|
210
|
+
if (btn.getAttribute('data-ux-nav')) { return; } // already swapped
|
|
211
|
+
var label = norm(btn.textContent);
|
|
212
|
+
var isPrev = label.indexOf('back') > -1 || btn.classList.contains('pds-c-button--small');
|
|
213
|
+
var isNext = label.indexOf('continue') > -1 ||
|
|
214
|
+
btn.classList.contains('pds-c-button--solid-primary');
|
|
215
|
+
if (!isPrev && !isNext) { return; }
|
|
216
|
+
var kind = isPrev && !isNext ? 'prev' : 'next';
|
|
217
|
+
var name = kind === 'prev' ? 'Back to the previous step' : 'Continue to the next step';
|
|
218
|
+
btn.setAttribute('data-ux-nav', kind);
|
|
219
|
+
btn.classList.add('ux-nav', 'ux-nav--' + kind);
|
|
220
|
+
btn.setAttribute('title', name);
|
|
221
|
+
btn.setAttribute('aria-label', name); // the glyph alone is not a name
|
|
222
|
+
btn.innerHTML = ARROW[kind];
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
**Identify by text AND by variant class.** Text alone breaks when the form is
|
|
228
|
+
retitled or translated; the class alone breaks when two buttons share a variant.
|
|
229
|
+
Requiring either, and disambiguating when both match, survives both.
|
|
230
|
+
|
|
231
|
+
**`aria-label` is not optional here.** Replacing the only text with a glyph removes
|
|
232
|
+
the button's accessible name; without the label a screen reader announces "button".
|
|
233
|
+
|
|
234
|
+
## 7. Per-field validation with your own rules
|
|
235
|
+
|
|
236
|
+
The platform validates required/format at its level. Add rules that read as
|
|
237
|
+
*guidance*, in a different colour from the platform's own error so the two never
|
|
238
|
+
compete:
|
|
239
|
+
|
|
240
|
+
```js
|
|
241
|
+
var RULES = {
|
|
242
|
+
cnp: [/^\d{13}$/, 'The personal number has exactly 13 digits.'],
|
|
243
|
+
ciserie: [/^[A-Za-z]{2}$/, 'The series is exactly 2 letters.'],
|
|
244
|
+
cui: [/^(RO)?\d{2,10}$/i,'The tax code has 2 to 10 digits, with or without RO.'],
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
function validate(el, key) {
|
|
248
|
+
var rule = RULES[key];
|
|
249
|
+
var f = q('input, textarea', el);
|
|
250
|
+
var v = String((f && f.value) || '').trim();
|
|
251
|
+
var bad = !!(rule && v && !rule[0].test(v)); // empty is NOT invalid — that's "required"
|
|
252
|
+
el.classList.toggle('ux-invalid', bad);
|
|
253
|
+
|
|
254
|
+
var msg = q('.ux-rule', el);
|
|
255
|
+
if (bad && !msg) {
|
|
256
|
+
msg = D.createElement('small');
|
|
257
|
+
msg.className = 'ux-rule';
|
|
258
|
+
msg.textContent = rule[1];
|
|
259
|
+
el.appendChild(msg);
|
|
260
|
+
} else if (!bad && msg) {
|
|
261
|
+
msg.parentNode.removeChild(msg);
|
|
262
|
+
}
|
|
263
|
+
return !bad && !!v; // "ok" = present AND well-formed
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
An empty value is a *required* problem, not a *format* problem — flagging it as
|
|
268
|
+
malformed while the user is still typing is hostile. Note the create/remove pair:
|
|
269
|
+
the function is idempotent, so it can run on every keystroke.
|
|
270
|
+
|
|
271
|
+
```css
|
|
272
|
+
.ux-invalid .pds-c-input-group--wrapper {
|
|
273
|
+
border-color: #C77700 !important;
|
|
274
|
+
box-shadow: inset 3px 0 0 #C77700 !important; /* amber: present but malformed */
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 8. Localize the platform's validation copy
|
|
279
|
+
|
|
280
|
+
The control library emits English. Rewrite the messages in place:
|
|
281
|
+
|
|
282
|
+
```js
|
|
283
|
+
var MSG = [
|
|
284
|
+
[/^\s*this field is required\.?\s*$/i, 'Acest câmp este obligatoriu.'],
|
|
285
|
+
[/^\s*invalid email\.?\s*$/i, 'Adresă de e-mail invalidă.'],
|
|
286
|
+
[/^\s*this field is invalid\.?\s*$/i, 'Valoare invalidă.'],
|
|
287
|
+
];
|
|
288
|
+
|
|
289
|
+
function localize() {
|
|
290
|
+
all('.pds-c-input-group--message--is-error, [class*="message"][class*="error"]')
|
|
291
|
+
.forEach(function (n) {
|
|
292
|
+
var t = n.textContent;
|
|
293
|
+
for (var i = 0; i < MSG.length; i++) {
|
|
294
|
+
if (MSG[i][0].test(t)) { n.textContent = MSG[i][1]; return; }
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
**Anchored regexes** (`^…$`), so a message that merely *contains* the English
|
|
301
|
+
phrase is not mangled. Rewriting `textContent` (not `innerHTML`) keeps it safe.
|
|
302
|
+
This runs inside `refresh()`, so a message re-rendered by the platform is
|
|
303
|
+
re-localized on the next pass.
|
|
304
|
+
|
|
305
|
+
## 9. Per-field helper text
|
|
306
|
+
|
|
307
|
+
```js
|
|
308
|
+
var HINTS = [
|
|
309
|
+
['personal number', 'Exactly <b>13 digits</b>, as printed on the ID document.'],
|
|
310
|
+
['e-mail', 'You will receive the <b>confirmation</b> here.'],
|
|
311
|
+
];
|
|
312
|
+
|
|
313
|
+
function addHint(el) {
|
|
314
|
+
if (q('.ux-hint', el)) { return; } // idempotent
|
|
315
|
+
var lbl = q('.pds-c-input-group--label', el);
|
|
316
|
+
var text = hintFor(lbl ? lbl.textContent : el.textContent);
|
|
317
|
+
if (!text) { return; }
|
|
318
|
+
var s = D.createElement('small');
|
|
319
|
+
s.className = 'ux-hint';
|
|
320
|
+
s.innerHTML = text; // your own literals — safe
|
|
321
|
+
el.appendChild(s);
|
|
322
|
+
}
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
`innerHTML` is acceptable **only** because the string is your own literal. Never
|
|
326
|
+
build one from a field value or a process result.
|
|
327
|
+
|
|
328
|
+
## 10. Completion feedback
|
|
329
|
+
|
|
330
|
+
```js
|
|
331
|
+
fields().forEach(function (el) { el.classList.toggle('ux-filled', isFilled(el)); });
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
```css
|
|
335
|
+
.form-builder--element.ux-filled
|
|
336
|
+
.pds-c-input-group--wrapper:not(.pds-c-input-group--wrapper--is-error) {
|
|
337
|
+
border-color: rgba(64, 153, 32, .45);
|
|
338
|
+
box-shadow: inset 3px 0 0 rgba(64, 153, 32, .5); /* INSET: cannot overhang a column */
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
Use an **inset** shadow. An outer glow overhangs the column boundary and collides
|
|
343
|
+
with the neighbouring field on a two-column layout.
|
|
344
|
+
|
|
345
|
+
## 11. A toast the rest of the form can call
|
|
346
|
+
|
|
347
|
+
```js
|
|
348
|
+
window.UXToast = function (message, kind) {
|
|
349
|
+
var t = D.createElement('div');
|
|
350
|
+
t.className = 'ux-toast' + (kind ? ' ux-toast--' + kind : '');
|
|
351
|
+
t.textContent = message;
|
|
352
|
+
D.body.appendChild(t);
|
|
353
|
+
raf(function () { t.classList.add('ux-toast--in'); }); // next frame: transition runs
|
|
354
|
+
setTimeout(function () {
|
|
355
|
+
t.classList.remove('ux-toast--in');
|
|
356
|
+
setTimeout(function () { if (t.parentNode) { t.parentNode.removeChild(t); } }, 400);
|
|
357
|
+
}, 4200);
|
|
358
|
+
};
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
The `raf` before adding the class is what makes the entrance animate: a class set
|
|
362
|
+
in the same frame as the insertion produces no transition. Exposing it on `window`
|
|
363
|
+
lets per-element event JS ([01](01-ANATOMY.md) §6) call it too.
|
|
364
|
+
|
|
365
|
+
## 12. Ripple on any button
|
|
366
|
+
|
|
367
|
+
```js
|
|
368
|
+
D.addEventListener('pointerdown', function (e) {
|
|
369
|
+
var btn = e.target && e.target.closest && e.target.closest('.pds-c-button');
|
|
370
|
+
if (!btn) { return; }
|
|
371
|
+
var r = btn.getBoundingClientRect();
|
|
372
|
+
var size = Math.max(r.width, r.height);
|
|
373
|
+
var ink = D.createElement('span');
|
|
374
|
+
ink.className = 'ux-ripple';
|
|
375
|
+
ink.style.width = ink.style.height = size + 'px';
|
|
376
|
+
ink.style.left = (e.clientX - r.left - size / 2) + 'px';
|
|
377
|
+
ink.style.top = (e.clientY - r.top - size / 2) + 'px';
|
|
378
|
+
btn.appendChild(ink);
|
|
379
|
+
setTimeout(function () { if (ink.parentNode) { ink.parentNode.removeChild(ink); } }, 620);
|
|
380
|
+
}, true);
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
One delegated listener covers every button that will ever exist, including ones the
|
|
384
|
+
renderer has not created yet. The button needs `position: relative; overflow: hidden`.
|
|
385
|
+
|
|
386
|
+
## 13. Drag state on a file dropzone
|
|
387
|
+
|
|
388
|
+
```js
|
|
389
|
+
['dragenter', 'dragover'].forEach(function (t) {
|
|
390
|
+
D.addEventListener(t, function (e) {
|
|
391
|
+
var z = e.target && e.target.closest && e.target.closest('.form-builder--file-upload');
|
|
392
|
+
if (z) { z.classList.add('ux-drag'); }
|
|
393
|
+
}, true);
|
|
394
|
+
});
|
|
395
|
+
|
|
396
|
+
['dragleave', 'drop'].forEach(function (t) {
|
|
397
|
+
D.addEventListener(t, function () {
|
|
398
|
+
all('.form-builder--file-upload.ux-drag').forEach(function (z) {
|
|
399
|
+
z.classList.remove('ux-drag');
|
|
400
|
+
});
|
|
401
|
+
}, true);
|
|
402
|
+
});
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
The clear pass sweeps **all** zones rather than the event's target: `dragleave`
|
|
406
|
+
fires on children too, and targeted removal leaves zones stuck in the drag state.
|
|
407
|
+
|
|
408
|
+
## 14. Scroll to the top of the card on a step change
|
|
409
|
+
|
|
410
|
+
```js
|
|
411
|
+
if (active > -1 && active !== lastStep) {
|
|
412
|
+
if (lastStep > -1) { // not on first paint
|
|
413
|
+
var card = q('.form-builder--form');
|
|
414
|
+
if (card && card.scrollIntoView) {
|
|
415
|
+
card.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
lastStep = active;
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
Guarding on `lastStep > -1` stops the page from scrolling itself on the initial
|
|
423
|
+
render, which reads as the page fighting the user.
|
|
424
|
+
|
|
425
|
+
## 15. Gate a button whose click runs a chain of events
|
|
426
|
+
|
|
427
|
+
A button's `onClickEvents` is an ordered chain (e.g. `RUN_JAVASCRIPT` →
|
|
428
|
+
`RUN_PROCESS` → `MAP_FORM_DATA` → `RUN_JAVASCRIPT`). A validation placed in the
|
|
429
|
+
first `RUN_JAVASCRIPT` **cannot stop the rest of the chain** — a throw or `return`
|
|
430
|
+
there ends only that block; the process still launches. Two layers:
|
|
431
|
+
|
|
432
|
+
1. **Capture-phase guard in the runtime** (form-level JS, injected per §4 of
|
|
433
|
+
`02-CODE-INJECTION.md`): `document.addEventListener('click', fn, true)`, match
|
|
434
|
+
the button by `closest('[id="<button-id>"]')`, and on invalid state call
|
|
435
|
+
`preventDefault()` + `stopImmediatePropagation()` + `stopPropagation()`.
|
|
436
|
+
Document capture runs before the Vue handler on the button, so **no** event of
|
|
437
|
+
the chain fires. Expose the rules as one `check()` on `window`.
|
|
438
|
+
2. **Gate inside the chain's last block** (the one that navigates): re-run the same
|
|
439
|
+
`check()` and `throw` before `nextButton.click()`. This is the fallback when the
|
|
440
|
+
runtime did not load; the rules still live in one place.
|
|
441
|
+
|
|
442
|
+
Same trick for a checkbox that must not be ticked: intercept its click in capture
|
|
443
|
+
phase and `preventDefault()`. Do not rely on `input.disabled` alone — a Vue
|
|
444
|
+
re-render of the row can reset it. To untick a checkbox programmatically, `click()`
|
|
445
|
+
it (setting `.checked = false` does not reach the Vue model).
|
|
446
|
+
|
|
447
|
+
Checkboxes inside a `dynamic-table-row` repeat the same DOM `id` on every row —
|
|
448
|
+
select them with `querySelectorAll('[id="<id>"]')` and read the row's other
|
|
449
|
+
columns from the enclosing row's cells, in `tableColumnsSourceValue` order
|
|
450
|
+
(the cell markup is not yet confirmed on a live render — check it before relying
|
|
451
|
+
on the column index).
|
|
452
|
+
|
|
453
|
+
## 16. One click from a JS decision to a no-code reaction: the trigger field
|
|
454
|
+
|
|
455
|
+
The common wish: a JS validator decides, and on success the no-code layer locks the
|
|
456
|
+
step's fields, swaps Validate for Modify, reveals the next step and moves to it, all
|
|
457
|
+
from **one** click. The obvious chain (`JS validator` → `MAP_FORM_DATA when
|
|
458
|
+
<flag> EQUALS 1`) does not do that. Verified on a live form, three renderer facts
|
|
459
|
+
decide the design:
|
|
460
|
+
|
|
461
|
+
1. **An `input`/`number-input` value reaches the form model 500 ms after the DOM
|
|
462
|
+
write** (`Element.component.vue`, `onInputDebounced`). A MAP condition later in
|
|
463
|
+
the same chain reads the value from before the JS ran, so the first click never
|
|
464
|
+
passes. That is why these forms end up with "validate twice, then confirm".
|
|
465
|
+
2. **A field's own `onInputEvents` chain fires when that value lands**, including
|
|
466
|
+
a value written by JS through the native setter, and its conditions see the
|
|
467
|
+
new value. This is the hand-off point.
|
|
468
|
+
3. **While a button's chain runs, the whole form is locked** (every element is
|
|
469
|
+
`disabled`), so JS cannot click another form button mid-chain. The stepper's
|
|
470
|
+
own Next/Previous are not form elements and still work.
|
|
471
|
+
|
|
472
|
+
The pattern that follows, measured at about 0.8 s from click to the next step:
|
|
473
|
+
|
|
474
|
+
```
|
|
475
|
+
Validate click: loader.show → validator (writes flag "1"/"0") → request(flag, branch)
|
|
476
|
+
request(...): if flag is "1": remember a pending request, write the clicked
|
|
477
|
+
button's branch ("person", "company"…) into a hidden text
|
|
478
|
+
input `step-flow-branch`, then increment a hidden number-input
|
|
479
|
+
`step-flow-trigger` (native setter + input/change/blur, branch first)
|
|
480
|
+
trigger onInput: MAP when <flag step N> EQUALS 1 AND step-flow-branch EQUALS <branch>
|
|
481
|
+
→ lock step N, Validate hidden, Modify shown, step N+1 visible
|
|
482
|
+
(one MAP per step and branch; only the clicked one matches)
|
|
483
|
+
→ JS advance(): only with a pending request: click Next, reset
|
|
484
|
+
scroll, hide the loader
|
|
485
|
+
Modify click: MAP (unconditional): unlock step N, flag N = 0, swap the buttons,
|
|
486
|
+
hide steps N+1…, and reset them (unlock, flags 0, Validate shown)
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
Rules that keep it safe:
|
|
490
|
+
|
|
491
|
+
- **Only `request()` writes the trigger field.** Do not use the flag fields as
|
|
492
|
+
triggers. A MAP that writes a field fires that field's `onInput` chain
|
|
493
|
+
immediately, with no debounce. The Modify MAP and any reset would then start a
|
|
494
|
+
second chain in parallel, and the two chains' JS blocks share one sandbox iframe.
|
|
495
|
+
- **The trigger always changes** (increment it): a flag still at `1` from an
|
|
496
|
+
earlier pass would not change and would not fire anything.
|
|
497
|
+
- **`advance()` moves on only with a pending request**, and a watchdog (a few
|
|
498
|
+
seconds) hides the loader if the trigger chain never comes.
|
|
499
|
+
- **The button states its branch; never infer it from a Boolean form variable.**
|
|
500
|
+
When a step has variants (person / company, electricity / gas), the Validate
|
|
501
|
+
button that was clicked IS the branch, so it writes it. Measured live, a
|
|
502
|
+
condition on a Boolean form variable is not reliable here:
|
|
503
|
+
|
|
504
|
+
| variable holds | `IS_TRUE` | `IS_FALSE` |
|
|
505
|
+
|---|---|---|
|
|
506
|
+
| the text `"false"` / `"False"` (the designer's default) | **passes** | fails |
|
|
507
|
+
| `null` | fails | passes |
|
|
508
|
+
|
|
509
|
+
Any non-empty text counts as true. Variables that a render process fills later
|
|
510
|
+
still hold that text until the process result lands, and on a form with two
|
|
511
|
+
variants both "IS_TRUE" branches ran: two lock MAPs fought over which Modify
|
|
512
|
+
button to show, and the wrong one then unlocked the other variant's fields.
|
|
513
|
+
`formlint` (every `form-update` / `form-add-element`) and
|
|
514
|
+
`form-set-element-chains` now warn about this condition.
|
|
515
|
+
- **Previous needs no handler.** A MAP-set `disabled`/`visible` survives the
|
|
516
|
+
renderer destroying and rebuilding the step, so a step you come back to is still
|
|
517
|
+
locked and still shows Modify. The stepper's own Next stays available there,
|
|
518
|
+
because the following step is visible.
|
|
519
|
+
- **A hidden step drops out of the stepper**, and Next exists only while a later
|
|
520
|
+
step is visible. Hiding steps N+1… on Modify therefore removes Next until step
|
|
521
|
+
N is validated again.
|
|
522
|
+
|
|
523
|
+
Wire the chains with `form-set-element-chains` (a plan of ordered events per
|
|
524
|
+
element). It keeps the existing validator blocks by id and builds the MAP blocks
|
|
525
|
+
and conditions from element and variable names. Prove the mechanism on a small
|
|
526
|
+
public copy of the flow before touching a live form. [07](07-DEPLOY-WORKFLOW.md) §4
|
|
527
|
+
has the recipe.
|
|
528
|
+
|
|
529
|
+
## An interactive map (Leaflet) inside a form page
|
|
530
|
+
|
|
531
|
+
A slippy map works in a form page that is drawn by injected code (the installer
|
|
532
|
+
pattern in 02-CODE-INJECTION). Load the library from a CDN at runtime, the same
|
|
533
|
+
way as any other viewer: a `<link>` for `leaflet.css` added to the parent
|
|
534
|
+
document's head, then the script through the runtime's script loader. Nothing
|
|
535
|
+
needs to ship inside the form's own code, which matters because the code budget
|
|
536
|
+
per form is finite.
|
|
537
|
+
|
|
538
|
+
Rules that each cost a debugging round:
|
|
539
|
+
|
|
540
|
+
- **Measure the container before every camera move.** The form host shows the
|
|
541
|
+
page only after its own bootstrap, so a map created during build reads its
|
|
542
|
+
container as 0 x 0. Leaflet caches that size, and the first `flyTo` /
|
|
543
|
+
`flyToBounds` computes the zoom from it: the map lands at maximum zoom
|
|
544
|
+
somewhere in the ocean. Call `map.invalidateSize(false)` at the start of every
|
|
545
|
+
programmatic move, retry later if the size is still 0, and keep a
|
|
546
|
+
`ResizeObserver` on the container that calls `invalidateSize`.
|
|
547
|
+
- **Listen for `moveend` as well as `zoomend`.** An `invalidateSize` that lands
|
|
548
|
+
during a fly animation can stop it without a `zoomend`, so layers that are
|
|
549
|
+
toggled by zoom never appear. Bind the zoom-dependent logic to
|
|
550
|
+
`'zoomend moveend'` and run it once after the map is built.
|
|
551
|
+
- **Do not let the page reset size map tiles.** A rule such as
|
|
552
|
+
`img { max-width: 100% }` scoped to the page root breaks tile layout. Exempt the
|
|
553
|
+
map container: `#root .map img { max-width: none; max-height: none; }`.
|
|
554
|
+
- **Contain the map's stacking.** Leaflet panes use z-index 400 and up, and any
|
|
555
|
+
card positioned over the map needs more. Without a stacking context on the map
|
|
556
|
+
section those layers rise above the page's own modals. Give the section
|
|
557
|
+
`position: relative; z-index: 0; isolation: isolate`.
|
|
558
|
+
- **The page root is the scroller, so keep wheel zoom off until the map is
|
|
559
|
+
clicked** (`scrollWheelZoom: false`, enabled on the first map click), or
|
|
560
|
+
scrolling the page zooms the map instead. On touch devices, disable one-finger
|
|
561
|
+
dragging and drive the map with buttons, or it traps page scrolling.
|
|
562
|
+
- **Keep map objects on the map's own state, not on the data object.** When the
|
|
563
|
+
page renders from a cached copy first and then from fresh data, the fresh object
|
|
564
|
+
replaces the cached one. Markers stored on the old objects (for example
|
|
565
|
+
`amenity.marker`) silently stop updating. Copy the list into the map's own
|
|
566
|
+
state when the map is built.
|
|
567
|
+
- **Free satellite tiles without a key:** Esri World Imagery
|
|
568
|
+
(`server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}`)
|
|
569
|
+
plus the `Reference/World_Boundaries_and_Places` overlay for place names. The
|
|
570
|
+
attribution ("Imagery © Esri, Maxar, Earthstar Geographics") must stay visible.
|
|
571
|
+
- **Page-specific CSS.** When only one page of a multi-page app uses the map,
|
|
572
|
+
ship its stylesheet with that page alone. Concatenate a per-page CSS file at
|
|
573
|
+
build time instead of growing the shared stylesheet that every page carries.
|
|
574
|
+
|
|
575
|
+
## A static location map (Google Maps embed, no key) in paragraph content
|
|
576
|
+
|
|
577
|
+
For "show where we are" with one pin, an embed is enough. No library is needed.
|
|
578
|
+
Verified 2026-10-22:
|
|
579
|
+
|
|
580
|
+
- **Paragraph HTML cannot carry the `<iframe>`.** The renderer passes paragraph HTML
|
|
581
|
+
through DOMPurify, which drops iframes. Author a placeholder in the paragraph
|
|
582
|
+
(`<div class="x-map" data-map="<query>">` with a plain "open in Google Maps" link
|
|
583
|
+
inside as the fallback) and let the runtime insert the iframe.
|
|
584
|
+
- **Keyless URL:** `https://www.google.com/maps?q=<query>&z=16&hl=<lang>&output=embed`.
|
|
585
|
+
It redirects to `/maps/embed?...`, which sends no `X-Frame-Options` and no
|
|
586
|
+
`frame-ancestors`, so it frames fine. The forms host itself sends no CSP.
|
|
587
|
+
- **What the query decides.** A bare street address can come back with no pin at all.
|
|
588
|
+
"<Business name>, <street and number>, <city>" pins the business listing, labelled
|
|
589
|
+
with its name. In a frame about 260px tall Google leaves out the place card, which
|
|
590
|
+
would otherwise show the public rating; taller frames show it.
|
|
591
|
+
- **Mount it lazily.** Wait until the placeholder is near the screen, and skip it while
|
|
592
|
+
a loader is measuring network progress. Content inside a closed `<details>` still
|
|
593
|
+
reports client rects in Chrome, so check `el.closest('details:not([open])')`, not
|
|
594
|
+
only `getClientRects()`. Re-check on the `toggle` event (listen in the capture phase,
|
|
595
|
+
because it does not bubble).
|
|
596
|
+
- **Fade it in on the iframe's `load` event**, and add the loaded class on a timer as
|
|
597
|
+
well, so a blocked request never leaves a shimmer running forever. The pin sits at the
|
|
598
|
+
frame's centre, so an overlay pulse at `50% 50%` lands on the pin tip.
|
|
599
|
+
- **Directions link:** `https://www.google.com/maps/dir/?api=1&destination=<query>`.
|
|
600
|
+
|