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,346 @@
|
|
|
1
|
+
# Form Template sub-tool
|
|
2
|
+
|
|
3
|
+
Create/edit/publish a PROCESIO **form**. The layout is a tree of controls in
|
|
4
|
+
`Data.elements`. **Proven live (2026-06-24):** the runtime renders from `elements`
|
|
5
|
+
— the encrypted `Data.code` blob is NOT needed (a form with `code:""` rendered
|
|
6
|
+
fine), so forms are fully buildable server-side.
|
|
7
|
+
|
|
8
|
+
## Config
|
|
9
|
+
|
|
10
|
+
```json
|
|
11
|
+
{
|
|
12
|
+
"name": "Registration",
|
|
13
|
+
"type": "general",
|
|
14
|
+
"browserTitle": "Register",
|
|
15
|
+
"elements": [
|
|
16
|
+
{"type": "heading", "label": "Registration Form"},
|
|
17
|
+
{"type": "paragraph","label": "<p>Please fill in your details.</p>"},
|
|
18
|
+
{"type": "input", "label": "Full Name", "name": "fullName", "required": true, "placeholder": "John Doe"},
|
|
19
|
+
{"type": "number-input", "label": "Age", "name": "age"},
|
|
20
|
+
{"type": "select", "label": "Country", "name": "country", "options": ["Romania", "USA"]},
|
|
21
|
+
{"type": "radiobox", "label": "Plan", "name": "plan", "options": ["Free", "Pro"]},
|
|
22
|
+
{"type": "checkbox", "label": "Subscribe", "name": "subscribe"},
|
|
23
|
+
{"type": "textarea", "label": "Comments", "name": "comments"},
|
|
24
|
+
{"type": "section", "label": "Group", "children": [ {"type": "input", "label": "Nested"} ]},
|
|
25
|
+
{"type": "button", "label": "Submit", "submit": true}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
- **elements** — each control: `type` + common props (`label`, `name`, `required`,
|
|
31
|
+
`placeholder`, `tooltip`, `readonly`, `visible`, `default`). `options` for
|
|
32
|
+
select/radiobox/dropdown (strings or `{name,value}`). `children` for containers
|
|
33
|
+
(section/columns/column/tabs/tab). `configs` (object) sets any raw config key.
|
|
34
|
+
- **control types** (from harvested goldens): heading, paragraph, input, textarea,
|
|
35
|
+
number-input, datetime-input, select, dropdown, radiobox, checkbox, button,
|
|
36
|
+
divider, section, columns, column, tabs, tab, table, image, file-upload,
|
|
37
|
+
file-viewer, icon, list, approval, … (see `dto/form/elements/`).
|
|
38
|
+
- **type** — `general` (1) or `usertask` (0). When omitted, a form whose controls carry an
|
|
39
|
+
assignee or approver (or that has an `assignee` control) is built as `usertask`, like the
|
|
40
|
+
designer saves it; otherwise `general`. **publish** — Status PUBLISHED(1)/DRAFT(0).
|
|
41
|
+
- **data model** — the builder writes the same form data model the designer writes for a NEW
|
|
42
|
+
form: top-level `instance, flow, fields, preventFormSubmit, browserTitle` and
|
|
43
|
+
`dataModelAttributeFormatVersion: "1"` (field attributes named exactly as the element name).
|
|
44
|
+
Captured from a designer save on QA, 2026-09-25.
|
|
45
|
+
|
|
46
|
+
## Events, triggers, tasks, themes (Phase 2)
|
|
47
|
+
|
|
48
|
+
- **events** — per control: `"events":[{"on":"click","do":"js","code":"alert(1)"}]`.
|
|
49
|
+
`on` ∈ click/input/change/focus/blur/hover/ready/open/close/tabchange/rowadded/
|
|
50
|
+
rowdeleted/paginated/stepchange/nextstep/previousstep/beforeapprove/afterapprove/
|
|
51
|
+
beforereject/afterreject/beforeapprovalsubmit/afterapprovalsubmit/messagesfetch/
|
|
52
|
+
messagesent (each fires on a control that has that slot; type/key verified vs
|
|
53
|
+
ui-builder trigger.ts + EventType enum).
|
|
54
|
+
`do` ∈ **map** (`mapping:[{to,value|from}]`), **process** (`processId,syncRun,
|
|
55
|
+
inputs:[{to,from}],outputs`), **js** (`code`), **form** → EventAction.TRIGGER_FORM
|
|
56
|
+
(`formId`,`mapping`).
|
|
57
|
+
- **tasks/assignees** — `assignee`/`assigneeReplacement` on section/tabs/table;
|
|
58
|
+
`approver`/`approverReplacement` on the `approval` control. The form's top-level
|
|
59
|
+
**`Assignees`** list is what the designer shows as the task routing: rows
|
|
60
|
+
`{StepId, OrderId, Type, Users:[{UserId}]}`, `StepId` = the element id (or a dynamic table
|
|
61
|
+
row's approval-step id), `Type 1` = assignee, `Type 2` = approver. It is DERIVED from those
|
|
62
|
+
configs the way the designer's save does (`builder.derive_assignees`): one ASSIGNEE step per
|
|
63
|
+
control with assignee users, then one APPROVER step per approval control and per visible
|
|
64
|
+
dynamic-row approval step, `OrderId` 1, 2, 3… within each list, users as `{userId}` (the
|
|
65
|
+
platform adds the names). `form-create` / `form-edit` write it; `form-add-element`,
|
|
66
|
+
`form-delete-element` and `form-set-element-config` re-derive it when the change touches who
|
|
67
|
+
works or approves a step, and report the before/after. A config-level `assignees` list still
|
|
68
|
+
wins verbatim. Checked against 19 designer-saved forms on QA (2026-10-05): identical lists.
|
|
69
|
+
(Until 2026-10-05 the builder left the list empty and the workaround was to PUT the GET echo
|
|
70
|
+
with `Assignees` added; that is no longer needed.)
|
|
71
|
+
- **theme** — `"theme":{"--c-primary":"#0039e3","--p-form":"24px"}` overrides the
|
|
72
|
+
form theme variables (colors, fonts, spacing, per-control styling). ~190 vars in 18
|
|
73
|
+
groups (see `data_shell.json` / `docs_info/form-theme.ts`).
|
|
74
|
+
- **form CSS / JavaScript** — the designer's "Switch to code" editor:
|
|
75
|
+
`"css":"...", "javascript":"..."` (or `"code":{"css","javascript"}`). Encrypted into
|
|
76
|
+
`Data.code` (CryptoJS AES; key in Credential Manager, one per environment:
|
|
77
|
+
`procesio/form-code-key@<environment>`). Empty →
|
|
78
|
+
`code:""`. See `code_cipher.py` + `FORM-STYLING-NOTES.md`.
|
|
79
|
+
- **per-component style** — on any field/container control:
|
|
80
|
+
`"style":{"--h-input":"50px","--c-input-background":"--c-neutral--50"}`. Only the
|
|
81
|
+
control's CSS-group vars are valid (input/number/datetime/textarea/select → Input group);
|
|
82
|
+
color vars take a theme color variable, not a hex. Stored as enabled CSSProperty[] in the
|
|
83
|
+
element's `style` config.
|
|
84
|
+
- **all properties** — any control config is settable via the named convenience
|
|
85
|
+
keys (label, placeholder, required, options, src, width, …) or the raw `configs`
|
|
86
|
+
passthrough; containers nest via `children` (built FLAT with `parentId`, the
|
|
87
|
+
structure PROCESIO renders).
|
|
88
|
+
- **table** — `{"type":"table","label":"Items","columns":[{"key":"product","label":"Product","cell":{"type":"input"}},{"key":"qty","label":"Qty","cell":{"type":"number-input"}}]}`
|
|
89
|
+
builds the table + a row + the cell controls (wired via `childrenIdPerColumn`).
|
|
90
|
+
Also `section`/`columns`(+`column`)/`tabs`(+`tab`) containers with `children`.
|
|
91
|
+
|
|
92
|
+
## Submit / status messages (`Data.messages`, verified live 2026-09-30)
|
|
93
|
+
|
|
94
|
+
The screen shown after submit comes from `Data.messages`, a list of
|
|
95
|
+
`{type, title, text, customizable}` seeded from `data_shell.json` in ENGLISH
|
|
96
|
+
(`SUBMIT_SUCCESS` = "Your message has been sent. Thank you for filling out our form!").
|
|
97
|
+
Types: SUBMIT_SUCCESS, SUBMIT_FOR_APPROVAL_SUCCESS, APPROVE_SUCCESS, REJECT_SUCCESS,
|
|
98
|
+
SUBMIT_FAILED, FILES_UPLOAD_FAILED, NOT_FOUND, NOT_ALLOWED, NOT_AUTHORIZED
|
|
99
|
+
(`ui-builder-main/src/js/model/index.ts`). For a non-English form, localize at least
|
|
100
|
+
SUBMIT_SUCCESS and SUBMIT_FAILED: `form-get`, edit the entries, then
|
|
101
|
+
`form-update --data-file` with `{"messages":[...the FULL list...]}` (send the whole list).
|
|
102
|
+
|
|
103
|
+
**Readable public URL.** Besides `forms.procesio.app/{tinyUrl}`, a form's CustomUrl slug is
|
|
104
|
+
served at `forms.procesio.app/{masterSlug}/{workspaceSlug}/{formSlug}`; read the two parent
|
|
105
|
+
slugs with `get-customurl-workspace-master` and `get-customurl-workspace`.
|
|
106
|
+
|
|
107
|
+
## Form JavaScript: fields are keyed LOWERCASE (critical, 2026-07-27)
|
|
108
|
+
|
|
109
|
+
> **Cause found (2026-09-25, confirmed 2026-10-05).** The re-key below comes from the data
|
|
110
|
+
> model's `dataModelAttributeFormatVersion`. The designer reads a form with no version as the
|
|
111
|
+
> legacy format `"0"` (user-playground `Builder.component.vue`), and under `"0"` its save
|
|
112
|
+
> renames every field attribute to camelCase-of-lowercase (`Form.model.ts::
|
|
113
|
+
> generateFormDataModel`; measured: `RequestText` → `requesttext`, and the 2026-10-01
|
|
114
|
+
> measurements below). Under `"1"` it keeps the name as written. Designer-made forms carry
|
|
115
|
+
> `"1"`; this builder wrote no version until 2026-10-05, which is why API-built forms were
|
|
116
|
+
> re-keyed on their first designer save. **It now writes `"1"`**: measured on QA 2026-10-05,
|
|
117
|
+
> `orderList`, `order_id` and `Customer_First_Name` survived a designer re-publish and form JS
|
|
118
|
+
> read them as written. So `formlint.lint_field_names` warns only for a form WITHOUT the
|
|
119
|
+
> version. Forms already saved as `"0"` keep their re-keyed names, so the case-insensitive
|
|
120
|
+
> lookup below is still the safe way to read fields in a script that may run on such a form.
|
|
121
|
+
|
|
122
|
+
**`ProcesioForm.data.fields` keys are the field name LOWERCASED** (and a UI save re-derives them). JS is case-sensitive, so a camelCase reference like `ProcesioForm.data.fields.locuiesteDetalii` (or `.zonaFormular`, `.actProprietate`) is `undefined` — the event fires but silently does NOTHING (this cost days on Uranus 100: a UI save lowercased the keys and every camelCase visibility/hide/file-wrap toggle broke, while the config still looked perfect). **ALWAYS reference form fields case-insensitively** in any control/FORM_LOAD RUN_JAVASCRIPT. Prelude, then use `fld(name)`:
|
|
123
|
+
|
|
124
|
+
**Corrected 2026-10-01, measured: a designer save re-keys the fields.** A form built through
|
|
125
|
+
the API (`form-create`) keeps its names exactly as written. One save and Publish in the
|
|
126
|
+
designer changed them: a camelCase name came back all lowercase, and a snake_case one came
|
|
127
|
+
back camelCase (`orderList` to `orderlist`, `order_id` to `orderId`). Both fit one rule: split the name on underscores, lowercase the parts, join
|
|
128
|
+
them in camelCase. A name with no separator therefore comes out all lowercase, which is
|
|
129
|
+
what the note above saw. (Two names measured; hyphens and spaces were not tested.) So the
|
|
130
|
+
trap springs late, the first time anyone saves an API-built form in the designer, and a
|
|
131
|
+
lowercase snake_case name is not safe either. Only a single lowercase word survives
|
|
132
|
+
unchanged. Read everything else through a lookup that ignores case AND separators, as
|
|
133
|
+
below. The same save also adds a select's `sourceType` and `sourceValue` to the data
|
|
134
|
+
model. `form-create` left them out until 2026-10-01 and now writes them for a static
|
|
135
|
+
option list (`todo/procesio-form-create-select-source-in-data-model.md`). When a config gives no `name`, the builder now derives a single lowercase word from the label (`Company Name` becomes `companyname`), so an auto-named field survives a designer save unchanged; an explicit name is kept verbatim, and `form-create` / `form-edit` return a `warnings` entry when a name is not a single lowercase word. (Since 2026-10-05 the builder writes `dataModelAttributeFormatVersion: "1"`, under which a designer save keeps names as written, so that warning now fires only for a form without the version; see the note at the top of this section.)
|
|
136
|
+
|
|
137
|
+
```js
|
|
138
|
+
var F=ProcesioForm.data.fields;var _fl={};for(var _k in F){_fl[_k.toLowerCase().replace(/[_-]/g,'')]=F[_k];}
|
|
139
|
+
function fld(n){return _fl[String(n).toLowerCase().replace(/[_-]/g,'')];}
|
|
140
|
+
var x=fld("locuiesteDetalii"); if(x){ x.visible=need; x.required=need; }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Applies to EVERY field reference: visibility toggles, submit-button hide/show, file-value wrapping, reading another field’s `.value`, etc. (`f.locuieste` only “works” because it has no uppercase letter to lose.)
|
|
144
|
+
|
|
145
|
+
## Control wiring cookbook (verified live 2026-06-29)
|
|
146
|
+
|
|
147
|
+
- **image** — `src` must be a LIVE url (a 404 shows the alt text as broken "brand"). Use
|
|
148
|
+
`{"type":"image","src":"https://…","alt":"…","width":200}`.
|
|
149
|
+
- **dropdown** — it is an action MENU, not a value field. Populate via
|
|
150
|
+
`configs:{items:[{id:<guid>,icon:"content_copy",label:"Duplicate",type:"BUTTON"},{type:"DIVIDER"}]}`.
|
|
151
|
+
- **file-viewer** — `src` is `URL_OR_FILE` → accepts a plain URL. Preview a doc with
|
|
152
|
+
`{"type":"file-viewer","src":"https://…/x.pdf","configs":{"viewerType":"INLINE","allowedFileTypes":["pdf"],"viewerHeadline":"…"}}`.
|
|
153
|
+
Empty src renders "Field source not set".
|
|
154
|
+
- **multiple file-upload / array-valued controls** — a `file-upload` (or `select`) with `multiple:true`, plus `list`/`table`/`dynamic-table-row`, are ARRAY-valued: the builder types their `value` config **`isList:true` + default `[]`** (helper `_value_is_list`) AND the DM `value` attribute `isList:true`. REQUIRED — else the runtime emits a SINGLE object for one uploaded file and a `List<File>` process input fails AT LAUNCH: `Error generating fileId … item is not an array: StartObject` (statusCode 373). Confirmed by Liza; locked by `test_form_events.py`.
|
|
155
|
+
- **conditional field visibility (show/hide one field based on another's value)** — verified live
|
|
156
|
+
2026-07-24 (confirmed by Liza). A `RUN_JAVASCRIPT` **INPUT** event on the trigger control that
|
|
157
|
+
toggles the target field's `.visible` AND `.required` together. TWO things that MUST be right,
|
|
158
|
+
or it silently fails:
|
|
159
|
+
1. **The target field must start REGISTERED.** Set the field `visible:true` in the config so
|
|
160
|
+
PROCESIO instantiates it, then hide it on load with a **form-level `FORM_LOAD`
|
|
161
|
+
`RUN_JAVASCRIPT`** (`ProcesioForm.data.fields.<field>.visible=false; …required=false;`). A
|
|
162
|
+
field that starts `visible:false` is NEVER instantiated → `ProcesioForm.data.fields.<field>`
|
|
163
|
+
is `undefined` → the toggle throws `Cannot set properties of undefined (setting 'visible')`
|
|
164
|
+
and the field can never appear. (This is the whole bug — NOT that hiding "destroys" the
|
|
165
|
+
element; a registered field toggles both ways fine.)
|
|
166
|
+
2. **A radio/select `.value` is a plain STRING** (the selected option's text, e.g.
|
|
167
|
+
`"Nu, e închiriat…"`), NOT an object — compare it directly, no `typeof v==='object'` /
|
|
168
|
+
`v.value` / `v.label` handling.
|
|
169
|
+
Event code: `var f=ProcesioForm.data.fields; var v=(f.locuieste.value||''); var need=(v.indexOf('Nu')===0); var x=f.locuiesteDetalii; if(x){x.visible=need; x.required=need;}`.
|
|
170
|
+
Guard the read (`var x=…; if(x){…}`). Toggling `.required` with `.visible` keeps a hidden field
|
|
171
|
+
from blocking submit. NOTE: PROCESIO's `rules-visibility` config ("Visibility:" panel) is NOT a
|
|
172
|
+
field-condition rule — it's only user-access (`all`/`task-assignees`/`custom`); use the JS event
|
|
173
|
+
above for value-driven visibility.
|
|
174
|
+
- **chart** — types `bar`/`line`/`combo`/`pie` (+ flags `donut`/`stacked`/`horizontal`/`smooth`).
|
|
175
|
+
Data via `configs`: `categoriesSourceType:"JSON"` + `categoriesSourceValue` = a JSON STRING of
|
|
176
|
+
labels; `seriesSourceType:"JSON"` + `seriesSourceValue` = a JSON STRING. Cartesian series =
|
|
177
|
+
`[{name,data:[..],type?,smooth?,yAxisIndex?}]` (combo sets per-series `type`+`yAxisIndex` for
|
|
178
|
+
dual-axis); pie/donut series = flat `[{name,value}]`. `colors` is a JSON-string array. Canonical
|
|
179
|
+
examples: `docs_info/Exports/charts.procesio`.
|
|
180
|
+
- **side-panel** — set `configs:{buttonText:"…",sidePanelTitle:"…"}`; its `children` render a
|
|
181
|
+
full mini-form inside the slide-over. AVOID `select`/`dropdown` inside a side-panel: their
|
|
182
|
+
pop-up overlay mis-positions and offsets the panel layout (the panel is a fixed/transformed
|
|
183
|
+
container). Use `radiobox`/`checkbox`/`input` (inline) for choices in a side panel.
|
|
184
|
+
- **chat (reply via a process)** — verified live 2026-06-29. The chat renders from its `value`
|
|
185
|
+
array (`Chat.component.vue`: `messages = JSON.stringify(attrs.value)`); a static mount `value`
|
|
186
|
+
does NOT render, but a reactive value-write does. Wire the reply on **`messagesent`**:
|
|
187
|
+
`events:[{"on":"messagesent","do":"process","processId":…,"syncRun":true,"inputs":[{"to":"history","from":"<chatName>"}],"outputs":[{"to":"<chatName>","from":"<msgsVar>"}]}]`.
|
|
188
|
+
On send the chat appends the user message to `value` then fires the event, so `history`
|
|
189
|
+
(<- chat value) already includes it; the process returns the FULL updated array -> written back
|
|
190
|
+
to chat value -> re-renders. The chat value attr is auto-typed json+isList (builder `_VALUE_LIST`).
|
|
191
|
+
Produce the array with a **Node** action (`return msgs;` -> bind `List Result` = a clean array;
|
|
192
|
+
JS `setOutput` wraps `{result}` and won't map cleanly — see process `description.md` Scripting).
|
|
193
|
+
Message schema (team-confirmed): required `_id, content, senderId, roomId, timestamp`(string).
|
|
194
|
+
A bot reply's **`senderId` = `"procesio"`** (baked-in bot user → renders on the other side; user
|
|
195
|
+
messages use the live currentUserId); **`roomId` MUST equal `rooms[0].roomId`** or it's filtered
|
|
196
|
+
out → "No messages"; **do NOT set a `date` field** (it created empty date-separator badges — use
|
|
197
|
+
`timestamp`). The component creates USER messages with `timestamp:""` (empty), so user bubbles
|
|
198
|
+
show no time — since the process returns the whole list, **backfill any empty `timestamp`** (e.g.
|
|
199
|
+
`for (m of msgs) if(!m.timestamp) m.timestamp="HH:MM"`) before returning. **Local time:** the Node
|
|
200
|
+
action runs server-side in UTC, so a raw `new Date()` shows SERVER time, not the user's. Pass the
|
|
201
|
+
browser UTC offset into the process and compute local time: a hidden `input` field set by form JS
|
|
202
|
+
(`-new Date().getTimezoneOffset()` minutes), added to the chat's RUN_PROCESS `inputs` (e.g.
|
|
203
|
+
`{to:"tzOffset", from:"tzoffset"}`), then in Node `const d=new Date(Date.now()+off*60000)` and read
|
|
204
|
+
`d.getUTCHours()/getUTCMinutes()` (correct regardless of server TZ). Optional: `username,
|
|
205
|
+
date, system, avatar, seen`. `onMessagesFetch` fires ONCE on
|
|
206
|
+
mount to load history; `onMessageSent` → process returns the ENTIRE list. Wire the reply on
|
|
207
|
+
`messagesent` only (reusing the reply process on `messagesfetch` stuck the chat on "loading" in
|
|
208
|
+
testing). Set `configs:{userId, rooms:[{roomId,roomName,users}]}`.
|
|
209
|
+
- **CSS stacking gotcha:** never put `animation`/`transform`/`opacity<1`/`filter` on the
|
|
210
|
+
control wrapper `.form-builder--element` — each becomes its own stacking context that traps
|
|
211
|
+
a select/dropdown overlay (the `.multiselect__content-wrapper`, z-index 50) UNDER the later
|
|
212
|
+
sibling controls (it renders transparent / behind, e.g. behind a button). Verify overlay
|
|
213
|
+
stacking with `document.elementFromPoint` (web tool `eval` step).
|
|
214
|
+
- **interactive widgets (5-star rating, char counter, live greeting)** — done in form-level
|
|
215
|
+
JavaScript, NOT a control. The JS runs inside `iframe.trigger-sandbox`, so the form doc is
|
|
216
|
+
`window.parent.document`; build into a control wrapper by id (e.g. `#starIcon`) and keep it
|
|
217
|
+
alive with a small `setInterval` (tabs render lazily). DON'T force a font on `#app *` — it
|
|
218
|
+
turns Material-Icons ligatures (info/close) into literal text; scope fonts to text elements.
|
|
219
|
+
- **The `trigger-sandbox` iframe is TRANSIENT — never leave a listener or timer inside it
|
|
220
|
+
(proven live 2026-08-05).** Form-level JS is executed by injecting it into an
|
|
221
|
+
`iframe.trigger-sandbox` whose `srcdoc` the platform rewrites per run, and the iframe is
|
|
222
|
+
REMOVED from the DOM afterwards. Removing an iframe destroys its JS realm, so every
|
|
223
|
+
`addEventListener` and `setInterval` registered from that code dies with it — while any DOM
|
|
224
|
+
node the code created in the parent document REMAINS. The failure is therefore silent and
|
|
225
|
+
deeply misleading: the widget renders correctly at form load, then freezes at whatever value it
|
|
226
|
+
last showed, with no console error and the node still on screen. It looks like "the widget
|
|
227
|
+
broke on <some user action>" when in truth the action merely coincided with the teardown.
|
|
228
|
+
Confirmed by a controlled A/B: an interval registered inside a transient iframe advanced 0
|
|
229
|
+
ticks after removal, while one injected into the parent kept ticking.
|
|
230
|
+
**The fix — hoist the code into the parent realm.** From the sandbox, append a `<script>` to
|
|
231
|
+
`window.parent.document` whose body is the widget, so the closure, its listeners and its timer
|
|
232
|
+
all belong to the parent window, which outlives the sandbox:
|
|
233
|
+
```js
|
|
234
|
+
var D = window.parent.document;
|
|
235
|
+
if (D.getElementById("my-widget")) return; // idempotent: the sandbox may re-run
|
|
236
|
+
function widget() { /* runs in the parent; `document` IS the form document */ }
|
|
237
|
+
var s = D.createElement("script");
|
|
238
|
+
s.id = "my-widget";
|
|
239
|
+
s.textContent = "(" + widget.toString() + ")();";
|
|
240
|
+
D.body.appendChild(s);
|
|
241
|
+
```
|
|
242
|
+
Use `Function.prototype.toString()` rather than a hand-escaped string literal — the widget stays
|
|
243
|
+
readable and there is no quote-escaping to get wrong. Give the injected `<script>` a stable `id`
|
|
244
|
+
and bail out when it already exists, or a sandbox re-run installs a second copy with a second
|
|
245
|
+
interval. Anything that must merely RUN ONCE at load (seeding a value, a one-shot toggle) is
|
|
246
|
+
fine directly in the sandbox; only continuous behaviour needs hoisting.
|
|
247
|
+
The installer pattern itself — parent realm, stable id guard, `fn.toString()` — is
|
|
248
|
+
documented in full in [`../../FORM-DEV-GUIDE/02-CODE-INJECTION.md`](../../FORM-DEV-GUIDE/02-CODE-INJECTION.md)
|
|
249
|
+
sections 3 and 4. What this entry adds is the controlled A/B that MEASURES the
|
|
250
|
+
teardown: 0 ticks after removal inside the sandbox, versus an interval injected into
|
|
251
|
+
the parent that kept running.
|
|
252
|
+
- **The form UI is styled with Vue SCOPED CSS — a hand-built node renders UNSTYLED (2026-08-05).**
|
|
253
|
+
Every platform-rendered element carries a `data-v-<hash>` attribute and the stylesheet is written
|
|
254
|
+
as `.pds-c-message[data-v-<hash>] { display:flex; … }`. A node built with `createElement` has no
|
|
255
|
+
such attribute, so the scoped rules never match it: copying the platform's class list alone is
|
|
256
|
+
NOT enough. The symptom is a widget that works but looks wrong — in the observed case the message
|
|
257
|
+
container fell back to `display:block`, stacking the icon above the text instead of beside it,
|
|
258
|
+
while the identical-looking native node next to it was `flex`. **Never hardcode the hash** (it
|
|
259
|
+
changes on every frontend rebuild). Instead **clone an existing native node of the same kind**
|
|
260
|
+
and overwrite its text — `cloneNode(true)` carries the scope attributes, the exact inner markup
|
|
261
|
+
and the theme, for free:
|
|
262
|
+
```js
|
|
263
|
+
var tpl = document.querySelector(".pds-c-message-info:not(.my-widget)");
|
|
264
|
+
var node = tpl ? tpl.cloneNode(true) : buildFallback(); // fallback: also set inline display:flex
|
|
265
|
+
node.classList.add("my-widget");
|
|
266
|
+
```
|
|
267
|
+
Exclude your own node from the template query or the second render clones the clone. Also mirror
|
|
268
|
+
the native inner structure when hand-building: the icon is a `<div class="pds-c-message--icon">`
|
|
269
|
+
WRAPPING an `<i class="material-icons …">`, and the text is a `<div class="pds-c-message--text">`
|
|
270
|
+
— not `<i>`/`<span>` carrying those classes directly.
|
|
271
|
+
**Prefer avoiding the whole problem:** when a control has a config that renders the node natively
|
|
272
|
+
(e.g. a non-empty `info-text`), set it in the designer and have the widget merely rewrite that
|
|
273
|
+
node's text. Two forms that differ only by such a config will otherwise diverge visually while
|
|
274
|
+
running byte-identical JS — which reads as "the same script broke on the other form".
|
|
275
|
+
- **`info-text` is NOT writable from `ProcesioForm.data.fields` (verified live 2026-08-05).**
|
|
276
|
+
The runtime renders it from the element's STATIC config array
|
|
277
|
+
(`Element.component.vue`: `v-if="getConfigValueByKey(element.configs,'info-text')"`), not from
|
|
278
|
+
the reactive field-value object. The field object exposes only `value`, `visible`, `required`,
|
|
279
|
+
`readonly` — so `…fields.<name>.infoText = …` is a silent no-op, and there is no
|
|
280
|
+
`setConfigValue`-style API exposed to form JS. Two consequences: (a) drive any live text
|
|
281
|
+
(character counters, running totals, remaining-quota hints) by writing the **DOM node**, not a
|
|
282
|
+
config; (b) when `info-text` is EMPTY the message component is never rendered at all (`v-if` on
|
|
283
|
+
a truthy value), so there is no node to write into — either set a non-empty `info-text` in the
|
|
284
|
+
designer so the platform renders `.pds-c-message-info`, or create that node yourself. A robust
|
|
285
|
+
widget does both: reuse `host.querySelector('.pds-c-message-info')` if present, else append a
|
|
286
|
+
node carrying the platform's own classes
|
|
287
|
+
(`pds-c-message pds-c-message-info pds-c-message-small pds-c-message-ghost pds-u-m--t--8`)
|
|
288
|
+
so it inherits the theme. **The control's DOM `id` equals its `name` config** and sits on the
|
|
289
|
+
`.pds-c-input-group` wrapper, not on the `<input>`/`<textarea>` — so `getElementById(<name>)`
|
|
290
|
+
then `.querySelector('textarea')` is the reliable way in, and renaming the field breaks the
|
|
291
|
+
selector. Bind updates with a capturing `input` listener filtered to that element (cheap: it
|
|
292
|
+
only acts on the one field) plus a small `setInterval` for lazy/re-rendered containers; guard
|
|
293
|
+
the write with an `if (node.textContent !== next)` so the interval costs nothing when idle.
|
|
294
|
+
A DOM-injected node survives the element's normal re-renders (validation state changes), but it
|
|
295
|
+
is invisible to the designer — it lives only in the form JS.
|
|
296
|
+
- **form JS that handles dropdown/menu item clicks** — use ONE document click listener (clicks
|
|
297
|
+
aren't continuous → no layout thrash/flicker; never a document-wide `input` listener or
|
|
298
|
+
`setInterval` poll). **CRITICAL gotcha (verified 2026-06-29):** to detect WHICH menu item was
|
|
299
|
+
clicked, do NOT substring-match `textContent` up the ancestor chain — an ancestor holds the
|
|
300
|
+
WHOLE menu, so every label (incl. "Clear form") is present and a click ANYWHERE outside the open
|
|
301
|
+
dropdown fires the first-matched action (this CLEARED the form on outside-click). Match only an
|
|
302
|
+
element whose own text contains **exactly one** known label (a single item); ignore any node
|
|
303
|
+
holding >1 (the menu container / page wrapper). Framework inputs are controlled — clear/set via
|
|
304
|
+
the native value setter + `input`+`change` events (`HTMLInputElement.prototype` value setter),
|
|
305
|
+
not `el.value=`. Verify by reproducing: set fields, open the menu, click OUTSIDE → fields must be
|
|
306
|
+
UNCHANGED; then click the real item → it acts.
|
|
307
|
+
- **responsive table (no horizontal scroll)** — default cell inputs are ~fixed-width and the table
|
|
308
|
+
is `table-layout:auto`, so >3 columns overflow. Force fluid equal columns:
|
|
309
|
+
`#app .pds-c-table{width:100%!important;table-layout:fixed}`, `th,td{min-width:0!important;overflow:hidden}`,
|
|
310
|
+
`.pds-c-input-group--field/--wrapper{width:100%!important;min-width:0!important}`,
|
|
311
|
+
`[class*=table][class*=scroll], .form-builder--table{overflow-x:visible!important}`.
|
|
312
|
+
|
|
313
|
+
## API contract (verified live 2026-06-24)
|
|
314
|
+
|
|
315
|
+
- **Create:** `POST /api/FormTemplate` (`FormTemplateDto`) — client supplies `Id`, returns it.
|
|
316
|
+
- **Get:** `GET /api/FormTemplate/{id}`. **Edit:** `PUT /api/FormTemplate`. **Delete:** `DELETE /api/FormTemplate/{id}`.
|
|
317
|
+
- **Publish:** `Status=1` + `State=true` on the body (or `PATCH /api/FormTemplate/{id}?state=true`).
|
|
318
|
+
- **Public vs private:** DTO field `IsPrivate` (config key `isPrivate`, default false; designer
|
|
319
|
+
"Make form public" toggle = `!isPrivate`). **`isPrivate:false` is necessary but NOT sufficient:**
|
|
320
|
+
a form that **contains an approval control** — or has assignees/approvers — can ONLY be private;
|
|
321
|
+
the platform disables the toggle and keeps it private regardless of the config value (the
|
|
322
|
+
presence of the approval control, not a configured approver, triggers this). To truly make a form
|
|
323
|
+
public, remove any approval control / assignees / approvers. Verify the actual toggle state in
|
|
324
|
+
the designer, not just the DTO field.
|
|
325
|
+
- **Render:** create a CustomUrl — `POST /api/CustomUrl/FormTemplate {Type:3, EntityType:1, EntityId, Url}`
|
|
326
|
+
→ `tinyUrl`; open **`https://forms.procesio.app/{tinyUrl}`**. (A bare `/forms/{id}`
|
|
327
|
+
has no workspace context and 404s — the CustomUrl carries the workspace.)
|
|
328
|
+
- **Query-param pre-fill (VALIDATED live, undocumented by PROCESIO):** the public form
|
|
329
|
+
reads URL query parameters and pre-fills any control whose **binding `name`** equals
|
|
330
|
+
the query key. Open `…/{tinyUrl}?<controlName>=<value>` and the control renders with
|
|
331
|
+
that value. Verified 2026-07-22: a form with controls `name:"cod"` + `name:"apartament"`
|
|
332
|
+
opened at `?cod=TEST123&apartament=27` rendered both inputs pre-filled. The match is on
|
|
333
|
+
the control's config `name` (the field/binding name), NOT the DOM `id`/`name` (which are
|
|
334
|
+
empty on the rendered `<input>`). Use this to seed a form from a link (e.g. a per-record
|
|
335
|
+
token). Unmatched params are ignored.
|
|
336
|
+
**Also works on a PRIVATE form** (one with an approval control) opened by a signed-in user: measured
|
|
337
|
+
2026-10, six `?name=value` params pre-filled their inputs with no console or network errors. Use it
|
|
338
|
+
to hand an approver a link that carries the record's data when the triggering action cannot.
|
|
339
|
+
|
|
340
|
+
## How it builds (template-merge)
|
|
341
|
+
|
|
342
|
+
Each control clones a captured golden element (`dto/form/elements/<type>.json`) so
|
|
343
|
+
every config field stays valid; the builder assigns fresh ids, pins a clean
|
|
344
|
+
`section`/`parentId` (golden elements were harvested from arbitrary containers),
|
|
345
|
+
forces `visible:true`, resets `required`/placeholders, and overrides the semantic
|
|
346
|
+
configs. theme/messages/dataModel/variables come from `data_shell.json`.
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dc5057d1-7bac-5f57-b464-57089ffa4a36",
|
|
3
|
+
"category": "fields",
|
|
4
|
+
"type": "approval",
|
|
5
|
+
"configs": [
|
|
6
|
+
{
|
|
7
|
+
"id": "09f55d0d-e541-5f56-892f-18c0931f5ec3",
|
|
8
|
+
"key": "label",
|
|
9
|
+
"label": "Label",
|
|
10
|
+
"placeholder": "Add label here",
|
|
11
|
+
"category": "content",
|
|
12
|
+
"subCategory": "general",
|
|
13
|
+
"type": "input",
|
|
14
|
+
"value": "Approval step",
|
|
15
|
+
"exposed": true
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"id": "a38f2e9f-cbe1-5c48-ba9d-6229558ddee7",
|
|
19
|
+
"key": "tooltip",
|
|
20
|
+
"label": "Tooltip",
|
|
21
|
+
"placeholder": "Add tooltip here",
|
|
22
|
+
"tooltip": "Tooltip can only be displayed with Label",
|
|
23
|
+
"category": "content",
|
|
24
|
+
"subCategory": "general",
|
|
25
|
+
"type": "input",
|
|
26
|
+
"value": "",
|
|
27
|
+
"exposed": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "7e5c5930-1c7d-54d5-8314-ab28390a9e1c",
|
|
31
|
+
"key": "description",
|
|
32
|
+
"label": "Description",
|
|
33
|
+
"placeholder": "Add text here",
|
|
34
|
+
"category": "content",
|
|
35
|
+
"subCategory": "general",
|
|
36
|
+
"type": "input",
|
|
37
|
+
"value": "Please review this submission and approve/reject.",
|
|
38
|
+
"exposed": true
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "a25cc026-4324-512c-9f16-81773fa820dc",
|
|
42
|
+
"key": "info-text",
|
|
43
|
+
"label": "Info text",
|
|
44
|
+
"placeholder": "Add info text here",
|
|
45
|
+
"category": "content",
|
|
46
|
+
"subCategory": "general",
|
|
47
|
+
"type": "input",
|
|
48
|
+
"value": "",
|
|
49
|
+
"exposed": true
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "1701612b-4ee5-5a15-a17e-ee414514c2c1",
|
|
53
|
+
"key": "visible",
|
|
54
|
+
"label": "Visible",
|
|
55
|
+
"category": "content",
|
|
56
|
+
"subCategory": "general",
|
|
57
|
+
"type": "toggle",
|
|
58
|
+
"value": true,
|
|
59
|
+
"exposed": true
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"id": "59e20081-ac77-5378-9a83-ad3099302807",
|
|
63
|
+
"key": "comment",
|
|
64
|
+
"label": "Comment",
|
|
65
|
+
"placeholder": "",
|
|
66
|
+
"category": "content",
|
|
67
|
+
"subCategory": "general",
|
|
68
|
+
"type": "hidden",
|
|
69
|
+
"value": "",
|
|
70
|
+
"exposed": true
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"id": "e32a20e7-5e43-50df-95e3-6b21a10ab948",
|
|
74
|
+
"key": "responseDate",
|
|
75
|
+
"label": "Response date",
|
|
76
|
+
"placeholder": "",
|
|
77
|
+
"category": "content",
|
|
78
|
+
"subCategory": "general",
|
|
79
|
+
"type": "hidden",
|
|
80
|
+
"value": null,
|
|
81
|
+
"exposed": true
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "c3038a05-34b7-5232-8f41-f09f18b8d99b",
|
|
85
|
+
"key": "responseUser",
|
|
86
|
+
"label": "Response user",
|
|
87
|
+
"placeholder": "",
|
|
88
|
+
"category": "content",
|
|
89
|
+
"subCategory": "general",
|
|
90
|
+
"type": "hidden",
|
|
91
|
+
"value": null,
|
|
92
|
+
"exposed": true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"id": "b9a25636-e5cd-57f9-9bf6-c4100369a34a",
|
|
96
|
+
"key": "response",
|
|
97
|
+
"label": "Response",
|
|
98
|
+
"placeholder": "",
|
|
99
|
+
"category": "content",
|
|
100
|
+
"subCategory": "general",
|
|
101
|
+
"type": "hidden",
|
|
102
|
+
"value": null,
|
|
103
|
+
"exposed": true
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"id": "70a2a842-0f88-5396-85cc-e632f265ada7",
|
|
107
|
+
"key": "name",
|
|
108
|
+
"label": "Name",
|
|
109
|
+
"category": "content",
|
|
110
|
+
"subCategory": "general",
|
|
111
|
+
"type": "copyable-input",
|
|
112
|
+
"value": "Approval",
|
|
113
|
+
"hasTopDivider": true,
|
|
114
|
+
"exposed": true,
|
|
115
|
+
"events": [
|
|
116
|
+
"EMIT_ELEMENTS_UPDATE"
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"id": "c321b7b1-1f06-5adc-8bf4-0515020392ff",
|
|
121
|
+
"key": "id",
|
|
122
|
+
"label": "ID",
|
|
123
|
+
"placeholder": "Add ID here",
|
|
124
|
+
"category": "content",
|
|
125
|
+
"subCategory": "general",
|
|
126
|
+
"type": "copyable-input",
|
|
127
|
+
"value": "approval",
|
|
128
|
+
"exposed": true
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"id": "e2c20d67-d165-57cc-b234-b9edccee8c32",
|
|
132
|
+
"key": "approver",
|
|
133
|
+
"label": "Approver",
|
|
134
|
+
"placeholder": "Select name",
|
|
135
|
+
"category": "content",
|
|
136
|
+
"subCategory": "approvals",
|
|
137
|
+
"type": "user-select",
|
|
138
|
+
"value": ""
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "1092181b-d9bc-55c5-8614-a49350321c8c",
|
|
142
|
+
"key": "approverReplacement",
|
|
143
|
+
"label": "Approver replacement",
|
|
144
|
+
"category": "content",
|
|
145
|
+
"subCategory": "approvals",
|
|
146
|
+
"type": "approver-replacement",
|
|
147
|
+
"value": null
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"id": "83a53e18-ff68-524c-bb53-905c74792658",
|
|
151
|
+
"key": "additionalApprovers",
|
|
152
|
+
"label": "",
|
|
153
|
+
"category": "content",
|
|
154
|
+
"subCategory": "task-assignee",
|
|
155
|
+
"type": "hidden",
|
|
156
|
+
"value": []
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"id": "1e45aa83-3f52-5fd0-903a-5b74c226af2d",
|
|
160
|
+
"key": "commentRequiredOnApprove",
|
|
161
|
+
"label": "Is comment required on approve",
|
|
162
|
+
"category": "content",
|
|
163
|
+
"subCategory": "validation",
|
|
164
|
+
"type": "required-comment",
|
|
165
|
+
"value": false,
|
|
166
|
+
"exposed": true
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"id": "8c015e51-ef4d-5679-8c17-6d5a1159509f",
|
|
170
|
+
"key": "commentRequiredOnReject",
|
|
171
|
+
"label": "Is comment required on reject",
|
|
172
|
+
"category": "content",
|
|
173
|
+
"subCategory": "validation",
|
|
174
|
+
"type": "hidden",
|
|
175
|
+
"value": false,
|
|
176
|
+
"exposed": true
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"id": "6f2c9b03-c4ae-548c-a5e2-141fe1ff3268",
|
|
180
|
+
"key": "onInputEvents",
|
|
181
|
+
"label": "onInput",
|
|
182
|
+
"category": "content",
|
|
183
|
+
"subCategory": "events",
|
|
184
|
+
"type": "field-events",
|
|
185
|
+
"value": null
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
"id": "9e30bc34-e3dd-5ba2-9a1b-d20a7321fb9e",
|
|
189
|
+
"key": "onBeforeApproveEvents",
|
|
190
|
+
"label": "onBeforeApprove",
|
|
191
|
+
"tooltip": "Triggered once Approve button is clicked but before the form is submitted",
|
|
192
|
+
"category": "content",
|
|
193
|
+
"subCategory": "events",
|
|
194
|
+
"type": "field-events",
|
|
195
|
+
"value": null
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
"id": "08142bb8-6e86-52fa-91fc-75921e8aa04e",
|
|
199
|
+
"key": "onBeforeRejectEvents",
|
|
200
|
+
"label": "onBeforeReject",
|
|
201
|
+
"tooltip": "Triggered once Reject button is clicked but before the form is submitted",
|
|
202
|
+
"category": "content",
|
|
203
|
+
"subCategory": "events",
|
|
204
|
+
"type": "field-events",
|
|
205
|
+
"value": null
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"id": "06444609-2c4d-5210-b49e-92389213381e",
|
|
209
|
+
"key": "onBeforeApprovalSubmitEvents",
|
|
210
|
+
"label": "onBeforeSubmit",
|
|
211
|
+
"tooltip": "Triggered once any Approval's button is clicked but before the form is submitted",
|
|
212
|
+
"category": "content",
|
|
213
|
+
"subCategory": "events",
|
|
214
|
+
"type": "field-events",
|
|
215
|
+
"value": null
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
"id": "fef86e40-fc6c-520c-bd07-6aaab9345173",
|
|
219
|
+
"key": "onAfterApproveEvents",
|
|
220
|
+
"label": "onAfterApprove",
|
|
221
|
+
"tooltip": "Triggered once Approve button is clicked but after the form is submitted",
|
|
222
|
+
"category": "content",
|
|
223
|
+
"subCategory": "events",
|
|
224
|
+
"type": "field-events",
|
|
225
|
+
"value": null
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
"id": "772caf56-471e-5c4f-97c0-83da94299e23",
|
|
229
|
+
"key": "onAfterRejectEvents",
|
|
230
|
+
"label": "onAfterReject",
|
|
231
|
+
"tooltip": "Triggered once Reject button is clicked but after the form is submitted",
|
|
232
|
+
"category": "content",
|
|
233
|
+
"subCategory": "events",
|
|
234
|
+
"type": "field-events",
|
|
235
|
+
"value": null
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"id": "2339b4a5-d535-5d8c-9fdd-a2cef89031d7",
|
|
239
|
+
"key": "onAfterApprovalSubmitEvents",
|
|
240
|
+
"label": "onAfterSubmit",
|
|
241
|
+
"tooltip": "Triggered once any Approval's button is clicked but after the form is submitted",
|
|
242
|
+
"category": "content",
|
|
243
|
+
"subCategory": "events",
|
|
244
|
+
"type": "field-events",
|
|
245
|
+
"value": null
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"id": "56060b99-bbd1-54a7-ad23-1ec50d184bfa",
|
|
249
|
+
"key": "style",
|
|
250
|
+
"label": "Style",
|
|
251
|
+
"category": "styling",
|
|
252
|
+
"subCategory": "general",
|
|
253
|
+
"type": "hidden",
|
|
254
|
+
"value": []
|
|
255
|
+
}
|
|
256
|
+
],
|
|
257
|
+
"parentId": null,
|
|
258
|
+
"section": "body"
|
|
259
|
+
}
|