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,142 @@
|
|
|
1
|
+
# PROCESIO form styling — RESOLVED & implemented (2026-06-25)
|
|
2
|
+
|
|
3
|
+
All four styling surfaces are now understood (verified against the ui-builder frontend
|
|
4
|
+
source in `docs_info/ui-builder-main`) and buildable via `builder.py`.
|
|
5
|
+
|
|
6
|
+
> **Building a real form?** This file is the reference for the four *surfaces*. The
|
|
7
|
+
> full development guide — execution model, DOM contract, interaction recipes,
|
|
8
|
+
> custom steppers and motion, process wiring, deployment, and the pitfall catalogue —
|
|
9
|
+
> is [`tools/procesio/FORM-DEV-GUIDE/`](../../FORM-DEV-GUIDE/00-INDEX.md). Those files
|
|
10
|
+
> are written to be attached as chat context.
|
|
11
|
+
|
|
12
|
+
## 1. Form Theme — ✅ implemented
|
|
13
|
+
`Data.theme`: 18 sections, ~190 CSS variables (`{label,types,properties:[{type,label,
|
|
14
|
+
value,cssVariable}]}`). Pass `theme:{"--c-primary":"#0039e3","--h-input":"44px"}`;
|
|
15
|
+
`_apply_theme` overrides by `cssVariable`. Form-wide, by control type. Defaults =
|
|
16
|
+
`docs_info/form-theme.ts` `getDefaultTheme()` (== `data_shell.json` theme).
|
|
17
|
+
|
|
18
|
+
## 2. Element event JavaScript — ✅ implemented
|
|
19
|
+
Per-control onClick/onInput/etc → `{action:"RUN_JAVASCRIPT", config:{code}}` (plaintext)
|
|
20
|
+
in the element's event config. `events:[{on:"click",do:"js",code:"..."}]`.
|
|
21
|
+
|
|
22
|
+
## 3. Per-component styling — ✅ implemented
|
|
23
|
+
Each element has a `{key:"style", category:"styling"}` config whose value is a
|
|
24
|
+
`CSSProperty[]` (`{label,value,cssVariable,type,enabled}`). The runtime
|
|
25
|
+
(`useThemable.themeStyle`) applies ONLY `enabled:true` props, overriding
|
|
26
|
+
`style[cssVariable]=value` (wrapping in `var(value)` when `type==css-variable-select`).
|
|
27
|
+
Build it by passing per-element `style:{cssVariable:value}`:
|
|
28
|
+
```json
|
|
29
|
+
{"type":"input","label":"Name","style":{"--h-input":"50px","--c-input-background":"--c-neutral--50"}}
|
|
30
|
+
```
|
|
31
|
+
- Valid vars = the element type's CSS group (frontend `getCssGroupByElementType`: FIRST
|
|
32
|
+
theme group whose `types` include the type — so input/number/datetime/textarea/select all
|
|
33
|
+
use the **Input** group). Unknown var → hard error (lists valid ones). Non-stylable types
|
|
34
|
+
(heading, paragraph, divider, image…) → error.
|
|
35
|
+
- For `css-variable-select` vars (colors) pass a theme color VARIABLE (e.g. `--c-neutral--50`),
|
|
36
|
+
NOT a hex — the runtime emits `var(<value>)`. Plain vars (height/padding) take raw values.
|
|
37
|
+
- Builder: `_apply_element_style` + `_style_props_for` (reads groups from `data_shell.json`).
|
|
38
|
+
|
|
39
|
+
## 4. Form-level CSS + JavaScript ("Switch to code") — ✅ implemented
|
|
40
|
+
Stored encrypted in `Data.code`. **Scheme (verified by decrypting real exports):**
|
|
41
|
+
`code = AES_encrypt( JSON.stringify({"JAVASCRIPT":js,"CSS":css}) )` using CryptoJS
|
|
42
|
+
`AES.encrypt(text, passphrase)` = OpenSSL AES-256-CBC, key+IV via EVP_BytesToKey(MD5,1),
|
|
43
|
+
output `base64("Salted__"+salt+ct)`. Passphrase = a static key.
|
|
44
|
+
- **Key is in Credential Manager**, one per installation, stored per environment as
|
|
45
|
+
`agents-and-tools:procesio:form-code-key@<environment>` (the bare `form-code-key` is
|
|
46
|
+
the default environment's; `tools/procesio/form_code_keys.py`) — NEVER in any file
|
|
47
|
+
(Hard rule 1). Declared in `tool.yaml` secrets.
|
|
48
|
+
- Build via `css:"..."` / `javascript:"..."` (or `code:{css,javascript}`) on the form
|
|
49
|
+
config. Empty → `code:""` (forms render fine without it). Impl: `code_cipher.py`
|
|
50
|
+
(`encrypt_code`/`decrypt_code`) + `builder._build_code`.
|
|
51
|
+
- The frontend itself only holds `code` as a plaintext `{JAVASCRIPT,CSS}` object and runs
|
|
52
|
+
the JS as a RUN_JAVASCRIPT form event at render; the host webapp does the AES step. There
|
|
53
|
+
is NO plaintext css/js field on the DTO (team confirmed: no unencrypted path).
|
|
54
|
+
|
|
55
|
+
## 5. Restyling an EXISTING form — use `form-set-code`, never `form-edit`
|
|
56
|
+
`form-edit` is a desired-state editor: it rebuilds the whole DTO from a config, so
|
|
57
|
+
pointing it at a large hand-authored form to change one field means re-declaring every
|
|
58
|
+
element or losing them. Use the surgical pair instead (handlers/form_code.py):
|
|
59
|
+
`form-get-code --id <id>` (decrypt) / `form-set-code --id <id> --css-file … --js-file …`
|
|
60
|
+
(GET → swap `Data.code` → PUT the same DTO back). Only `Data.code` changes; omitting one
|
|
61
|
+
of css/js preserves that side; the overwritten code comes back under `previous`, so a
|
|
62
|
+
mistaken overwrite is recoverable from the tool output alone.
|
|
63
|
+
- `PUT /api/FormTemplate` wants the PascalCase envelope (`Id/Name/IsPrivate/Type/Status/
|
|
64
|
+
State/Assignees/Data/CustomUrl`) while the GET returns it camelCase — map explicitly.
|
|
65
|
+
|
|
66
|
+
- **`{"JAVASCRIPT": null, "CSS": null}` is a NORMAL decrypt result, not a corrupt blob.**
|
|
67
|
+
The designer seeds both slots to null, so that is what every form that never opened
|
|
68
|
+
"Switch to code" carries — and a form can also carry a JS slot holding only the
|
|
69
|
+
designer's boilerplate comment. Normalize null → `""` before doing anything with a
|
|
70
|
+
length or a concatenation (`_decode` does; a `len(None)` crash here was a real bug).
|
|
71
|
+
- **A wrong passphrase and a corrupt blob are indistinguishable at the API layer**: both
|
|
72
|
+
surface as a `UnicodeDecodeError` after AES runs and emits garbage. Diagnose by
|
|
73
|
+
round-tripping `encrypt_code`/`decrypt_code` with a throwaway key — if that works, the
|
|
74
|
+
blob is fine and the KEY is wrong. Note also that the workspace API key (name + value)
|
|
75
|
+
and the form-code passphrase are DIFFERENT secrets that look alike (short opaque
|
|
76
|
+
tokens); the API key gets you *at* the form, the passphrase gets you *into* `Data.code`.
|
|
77
|
+
|
|
78
|
+
## 6. What the CSS and the JS can actually reach at runtime
|
|
79
|
+
- **CSS is injected as a `<style>` PREPENDED INSIDE the form root, and SCOPED to it**
|
|
80
|
+
(changed in v3.0.0, 2026-10; before, it styled the whole document and page-level
|
|
81
|
+
selectors worked). Every selector is rewritten to
|
|
82
|
+
`sel:where([data-form-css-scope=<id>], ...)`, matching the form root and its
|
|
83
|
+
descendants only. So rules for `body`, `:root`, `html`, the host chrome and the builder
|
|
84
|
+
match nothing, `:root` custom properties no longer reach the form, and tooltips and
|
|
85
|
+
date-picker popups no longer get the form CSS. Comments and unparsable CSS are dropped;
|
|
86
|
+
`@keyframes` / `@font-face` are moved into a layer. Still global: a `<style>` inside
|
|
87
|
+
paragraph/heading HTML, `@import`, and JS that injects a `<style>` into
|
|
88
|
+
`window.parent.document`. JS that renders UI OUTSIDE the form container (appended to
|
|
89
|
+
`document.body`, a modal or overlay, a full-page app) gets no styles, and `:root` /
|
|
90
|
+
`html` / `body` rules stop applying: before mounting, copy the container's
|
|
91
|
+
`data-form-css-scope` value onto `<html>` (inside the wait-for-render loop). Full rules
|
|
92
|
+
and the snippet in `tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md` §2.
|
|
93
|
+
- **The branding class is also filtered** (`js/form-builder/css.ts` replaces that literal
|
|
94
|
+
string with a random number so it cannot be hidden).
|
|
95
|
+
- **Form-level JS is replayed as a synthetic RUN_JAVASCRIPT event on mount and on every
|
|
96
|
+
re-trigger, inside a throwaway sandbox iframe whose window is destroyed and rebuilt each
|
|
97
|
+
time.** So anything that must OUTLIVE one run (listeners, MutationObservers, timers)
|
|
98
|
+
cannot live in that scope — it dies with the iframe. The pattern that works: from the
|
|
99
|
+
sandbox, inject a `<script>` ONCE into `window.parent.document`, carrying the real
|
|
100
|
+
runtime (`'(' + fn.toString() + ')();'` avoids escaping). Guard both layers with a
|
|
101
|
+
flag — the installer re-runs, and a second copy means doubled handlers. The platform
|
|
102
|
+
confirms the reach itself: the JS slot's shipped boilerplate reads
|
|
103
|
+
`console.log(window.parent.document); -> to access the DOM`.
|
|
104
|
+
- **Controls are re-created, not hidden**: `Element.component.vue` renders under `v-if`,
|
|
105
|
+
so toggling `visible` removes the node from the DOM. Entrance animations therefore fire
|
|
106
|
+
on every step change (good), but exit transitions are impossible (the node is gone), and
|
|
107
|
+
any state you attach to a node must be recomputed from a MutationObserver.
|
|
108
|
+
- **Runtime selectors** are two families: `.form-builder--*` (the renderer's own, e.g.
|
|
109
|
+
`--form`, `--form-body`, `--element[data-element-id]`, `--stepper--nav--item`,
|
|
110
|
+
`--stepper--container`, `--stepper--buttons`, `--input`, `--select`, `--checkbox`,
|
|
111
|
+
`--radiobox`, `--file-upload`, `--columns`, `--column`) and `.pds-c-*` from the design
|
|
112
|
+
system (`--input-group--wrapper` / `--wrapper--focused` / `--wrapper--is-error`,
|
|
113
|
+
`--input-group--label`, `--input-group--message--is-error`, `--input-group--square`,
|
|
114
|
+
`pds-c-radiobox--is-checked`, `pds-c-button--solid-primary`, `pds-c-step--header--circle`
|
|
115
|
+
`[--active]`, `pds-c-step-connector`). The `pds-c-*` INTERNALS are not in this repo
|
|
116
|
+
(they ship in `@procesio/procesio-design-system`), so only the ones the renderer's own
|
|
117
|
+
SCSS references are safe to target — anything deeper must be checked against a live
|
|
118
|
+
render first.
|
|
119
|
+
|
|
120
|
+
## Source of truth
|
|
121
|
+
`docs_info/ui-builder-main` is the actual frontend repo. Confirmed: its
|
|
122
|
+
`src/js/model/element/mock.ts` is byte-identical to `FormBuilder mock.ts` (our goldens come
|
|
123
|
+
from it), and its `src/js/model/config/index.ts` enums match `form-config-enums.ts` exactly.
|
|
124
|
+
|
|
125
|
+
## Dark theme + element alignment (2026-08)
|
|
126
|
+
|
|
127
|
+
**Dark theme.** A form carries both a light and a dark palette, swapped at runtime by
|
|
128
|
+
`themeMode`/`activeThemeMode` (getPaletteStyleSheet injects the active one). The 16-var
|
|
129
|
+
`DARK_PALETTE` (builder `_DARK_PALETTE`): `--c-primary` #4663f5, `--c-primary-variant`
|
|
130
|
+
#8aa0ff, `--c-error` #ff6b6b, `--c-success` #32d583, `--c-info` #53b1fd, and the neutrals
|
|
131
|
+
inverted `--c-neutral--900` #f8fafd … `--c-neutral--0` #141922. Opt in via config
|
|
132
|
+
`themeMode`/`themeDark`; default forms stay light-only. The exact DTO persistence key for
|
|
133
|
+
the dark palette is best-effort (`themeMode`/`themeDark` in Data) pending live confirmation.
|
|
134
|
+
|
|
135
|
+
**Element alignment.** Container elements accept three flex vars in their per-control
|
|
136
|
+
`style`, keyed by an element SCOPE suffix: `--fd-<scope>` (flex-direction / "Inner
|
|
137
|
+
direction"), `--jc-<scope>` (justify-content / "Inner main axis"), `--ai-<scope>`
|
|
138
|
+
(align-items / "Inner cross axis"). Scopes: section, list-item, column, step, tab,
|
|
139
|
+
side-panel (element types section, list, columns, stepper, tabs, side-panel). The builder
|
|
140
|
+
accepts them additively today (`_alignment_props`); when the golden `data_shell.json` is
|
|
141
|
+
refreshed from the launched `form-theme.ts` the golden's native definition (proper dropdown
|
|
142
|
+
type + option list) wins.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Form-control goldens: generated from the FormBuilder mock (DO NOT hand-edit)
|
|
2
|
+
|
|
3
|
+
`elements/<type>.json` (the per-control "goldens" the builder clones) are **generated**
|
|
4
|
+
from the FormBuilder source of truth `docs_info/FormBuilder mock.ts` by
|
|
5
|
+
`sync_from_mock.py`. Do not edit them by hand — your change will be overwritten on the
|
|
6
|
+
next sync. Change the mock (or `enum_map.json`) and re-run instead.
|
|
7
|
+
|
|
8
|
+
## The sync mechanism — `sync_from_mock.py`
|
|
9
|
+
```
|
|
10
|
+
python tools/procesio/dto/form/sync_from_mock.py # dry-run: what would change + unverified enums
|
|
11
|
+
python tools/procesio/dto/form/sync_from_mock.py --write # regenerate all elements/*.json
|
|
12
|
+
python tools/procesio/dto/form/sync_from_mock.py --check # exit 1 if goldens != mock (CI guard)
|
|
13
|
+
```
|
|
14
|
+
**When a new mock.ts arrives** (new control, changed control, new feature): drop it in
|
|
15
|
+
`docs_info/FormBuilder mock.ts`, run `--write`, eyeball the change list + the
|
|
16
|
+
"UNVERIFIED enum members" section, run the tests. That's the whole loop.
|
|
17
|
+
|
|
18
|
+
What it guarantees:
|
|
19
|
+
- **complete** — one golden per control the FormBuilder ships (33), incl. ones that
|
|
20
|
+
could never be harvested (chart, chat, assignee, signature-pad, stepper, step).
|
|
21
|
+
- **exact** — config keys, **render order** (= designer properties-panel order),
|
|
22
|
+
`type`/`category`/`subCategory`/`exposed`/`events` all come straight from the mock.
|
|
23
|
+
- **deterministic / repeatable** — same mock in → byte-identical files out (ids are
|
|
24
|
+
`uuid5`; the builder reassigns ids at build time so their values are cosmetic).
|
|
25
|
+
- **sound** — before writing it re-checks every regenerated golden against the previous
|
|
26
|
+
on-disk one and ABORTS if any *resolved enum value* of a shared config changed
|
|
27
|
+
(catches a wrong enum mapping). Adding keys a stale golden lacked is allowed.
|
|
28
|
+
|
|
29
|
+
## Enum resolution — authoritative, no guessing
|
|
30
|
+
The mock references config metadata via enums imported from `../config`. Resolution
|
|
31
|
+
precedence (highest first):
|
|
32
|
+
1. `docs_info/form-config-enums.ts` — the frontend's actual enum definitions (provided
|
|
33
|
+
verbatim by the team 2026-06-25). Parsed directly → every member is authoritative.
|
|
34
|
+
2. `enum_map.json` — committed fallback / manual override (used only for a member not
|
|
35
|
+
in the TS file).
|
|
36
|
+
3. rule `MEMBER → lower, '_'→'-'` — last resort, flagged **UNVERIFIED**.
|
|
37
|
+
|
|
38
|
+
`ElementType` and `ElementCategory` are defined **inside** the mock → parsed from it.
|
|
39
|
+
|
|
40
|
+
With the TS file present, **0 members are unverified**. Confirmed oddities the rule
|
|
41
|
+
alone would get wrong (now in the TS file): `READONLY_OR_DISABLED_TOGGLE →
|
|
42
|
+
"readonly-or-disabled"` (suffix dropped) and the misspelled `CONTOLS → "controls"`.
|
|
43
|
+
|
|
44
|
+
**When the frontend changes a config enum:** paste the updated enum into
|
|
45
|
+
`docs_info/form-config-enums.ts` and re-run `--write`. That's the whole enum-upkeep
|
|
46
|
+
story — no manual map editing.
|
|
47
|
+
|
|
48
|
+
## TEMPLATE_ONLY configs are intentionally excluded (DECISION — confirmed 2026-06-25)
|
|
49
|
+
Configs typed `TEMPLATE_ONLY` (templateLabel, variation, palette-only duplicates) live
|
|
50
|
+
only in the builder palette, never in an instantiated/saved control — so the generator
|
|
51
|
+
drops them. The golden mirrors **what the toolbar produces**, which is what the builder
|
|
52
|
+
must send. Their absence is correct, not drift. Do NOT re-add them: a real saved control
|
|
53
|
+
has none, and shipping them risks the platform's on-save compiler mishandling the element
|
|
54
|
+
and creates phantom data-model attributes. (To override anyway, the only change is to stop
|
|
55
|
+
skipping `type == "template-only"` in `sync_from_mock.py`.)
|
|
56
|
+
|
|
57
|
+
## Builder coupling (don't break these)
|
|
58
|
+
`builder._set_config` overrides a key **only if it already exists** in the golden — a
|
|
59
|
+
missing key = silent no-op. That's why golden completeness matters and why we generate
|
|
60
|
+
from the mock. Builder-critical keys verified present: `childrenIdPerColumn`, `rows`,
|
|
61
|
+
`columns`, `tabs`, `tableColumnsSourceType/Value`, canonical `value`
|
|
62
|
+
(`exposed:true` + `events:["EMIT_INPUT"]`).
|
|
63
|
+
|
|
64
|
+
## Files
|
|
65
|
+
- `sync_from_mock.py` — the generator (this mechanism).
|
|
66
|
+
- `../../docs_info/form-config-enums.ts` — AUTHORITATIVE frontend enum definitions
|
|
67
|
+
(parsed directly). Update this when the frontend changes a config enum.
|
|
68
|
+
- `enum_map.json` — committed fallback used only if the TS file is absent.
|
|
69
|
+
- `capture_goldens.py` — OLD harvest-from-exports approach, superseded by the above
|
|
70
|
+
(kept for reference / cross-checking against real saved forms).
|
|
71
|
+
- `elements.bak.premock/` — backup of the pre-sync harvested goldens (safe to delete
|
|
72
|
+
once you're happy: `rm -r elements.bak.premock`).
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# Form `RUN_PROCESS` synchronous result notes
|
|
2
|
+
|
|
3
|
+
These notes cover native form output mapping after a synchronous process event. They
|
|
4
|
+
are based on the form builder contract plus a live browser/process/ledger field trace
|
|
5
|
+
on 2026-09-05. The trace is historical and not a public proof packet; publication
|
|
6
|
+
of these notes does not reverify the deployed browser/runtime. Confirm compatibility
|
|
7
|
+
with the target runtime before relying on this response shape.
|
|
8
|
+
|
|
9
|
+
## Mapping direction
|
|
10
|
+
|
|
11
|
+
The form builder resolves both input and output mappings with the process variable on
|
|
12
|
+
the left and the form field value path on the right:
|
|
13
|
+
|
|
14
|
+
- input spec `{to: processVariable, from: formField}`;
|
|
15
|
+
- output spec `{to: formField, from: processVariable}`.
|
|
16
|
+
|
|
17
|
+
The process side must resolve to the stable process-variable GUID. Re-fetch and compare
|
|
18
|
+
mappings after any process edit that could replace variable IDs.
|
|
19
|
+
|
|
20
|
+
## Native synchronous writer contract
|
|
21
|
+
|
|
22
|
+
A successful synchronous process execution is not sufficient for visible output-map
|
|
23
|
+
updates. The form runtime's native writer consumes a process-variable collection from
|
|
24
|
+
the launch response's `content.variable` path. When the process custom response is an
|
|
25
|
+
arbitrary business object without a compatible `variable` member, the process can:
|
|
26
|
+
|
|
27
|
+
- finish successfully;
|
|
28
|
+
- write its database/data-store side effect;
|
|
29
|
+
- return a useful object to an API caller;
|
|
30
|
+
- yet leave the form's mapped result fields unchanged.
|
|
31
|
+
|
|
32
|
+
For a process shared by form, CLI, and subprocess callers, use a compatibility envelope
|
|
33
|
+
rather than replacing the established response:
|
|
34
|
+
|
|
35
|
+
```json
|
|
36
|
+
{
|
|
37
|
+
"decision": "<existing top-level field>",
|
|
38
|
+
"summary": "<existing top-level field>",
|
|
39
|
+
"next_action": "<existing top-level field>",
|
|
40
|
+
"duplicate": false,
|
|
41
|
+
"response": {"<optional complete original response>": "..."},
|
|
42
|
+
"variable": ["<exact live process-variable instance objects>"]
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
The example is structural, not a DTO to copy literally. Through an approved protected
|
|
47
|
+
inspection, establish the exact entry shape, IDs, value encoding, list flags and types
|
|
48
|
+
expected by the deployed runtime. Do not return the entire instance variable array:
|
|
49
|
+
only expose outputs the form caller is authorized to see, never credentials or internal
|
|
50
|
+
state. Keep existing permitted business fields at their established top-level paths.
|
|
51
|
+
|
|
52
|
+
Point the process custom response at the compatibility envelope and keep the ordinary
|
|
53
|
+
process outputs present. Bind any Node/Javascript Error output and set a nonzero timeout.
|
|
54
|
+
|
|
55
|
+
## Proof standard
|
|
56
|
+
|
|
57
|
+
A native output-mapping claim passes only when one real form interaction:
|
|
58
|
+
|
|
59
|
+
1. opens the published form in a clean browser context;
|
|
60
|
+
2. submits or clicks exactly once with a stable business key;
|
|
61
|
+
3. observes the real launch response;
|
|
62
|
+
4. updates the mapped fields automatically through the platform event path;
|
|
63
|
+
5. shows the expected decision and non-empty next action;
|
|
64
|
+
6. reconciles the exact process instance and storage side effect;
|
|
65
|
+
7. has no unexplained console, page, network, or response errors.
|
|
66
|
+
|
|
67
|
+
Do not call the SPA writer manually, patch result fields in the DOM, replay the request,
|
|
68
|
+
or feed an older instance into the writer as proof. Those techniques may diagnose the
|
|
69
|
+
expected shape, but they do not verify the native form path.
|
|
70
|
+
|
|
71
|
+
## Secret and compatibility rules
|
|
72
|
+
|
|
73
|
+
- Never store an access token as a form default or in plaintext form code.
|
|
74
|
+
- Exclude secrets before screenshot, log or response capture; masking afterward cannot
|
|
75
|
+
undo an earlier disclosure.
|
|
76
|
+
- Snapshot process variable IDs and the old custom-response shape before editing.
|
|
77
|
+
- Re-fetch dependent forms and subprocess mappings after the edit.
|
|
78
|
+
- Preserve direct CLI/subprocess response semantics; additive envelopes are safer than
|
|
79
|
+
replacing an established response object.
|
|
80
|
+
- Count the form-triggered process and every awaited/nested child in execution budgets.
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
"""Add one or more controls to a LIVE form, without disturbing anything already on it.
|
|
2
|
+
|
|
3
|
+
The gap this fills: `form-create` speaks an authoring config and `form-edit` rebuilds a whole form
|
|
4
|
+
from one, so neither can add a control to a form that was hand-built in the designer — the two
|
|
5
|
+
shapes are different languages (an authoring config has no element ids at all, see
|
|
6
|
+
PROCESIO-API-NOTES.md "form-create takes an AUTHORING CONFIG"). Every other form action here is
|
|
7
|
+
surgical; adding a control was the missing verb, and without it a new admin button meant
|
|
8
|
+
hand-writing a stored element DTO.
|
|
9
|
+
|
|
10
|
+
What makes a splice safe rather than a rebuild: PROCESIO backs each control with a data-model
|
|
11
|
+
sub-model whose id IS the element id, and whose attribute ids ARE that element's own config ids
|
|
12
|
+
(see `_build_data_model` in builder.py). New controls therefore contribute new sub-models and touch
|
|
13
|
+
nothing else — which is the whole point, because a RUN_PROCESS/MAP trigger references a field by the
|
|
14
|
+
path `root.fields.elementId.valueAttrId`. Regenerating the live model would silently break every
|
|
15
|
+
mapping already on the form, so this never rebuilds it; it appends to it.
|
|
16
|
+
|
|
17
|
+
Pure: takes the form as GET returns it, returns a NEW `Data` dict. The caller validates and PUTs.
|
|
18
|
+
"""
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import copy
|
|
22
|
+
import json
|
|
23
|
+
import re
|
|
24
|
+
import uuid
|
|
25
|
+
|
|
26
|
+
from tools.procesio.dto.form import builder
|
|
27
|
+
from tools.procesio.errors import UsageError
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _new_id(_ctx=None) -> str:
|
|
31
|
+
return str(uuid.uuid4())
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def _name_of(element: dict) -> str | None:
|
|
35
|
+
for c in element.get("configs") or []:
|
|
36
|
+
if c.get("key") == "name":
|
|
37
|
+
return c.get("value")
|
|
38
|
+
return None
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _sub_model(element: dict, fields_ns: str, ctx: dict) -> dict:
|
|
42
|
+
"""The `fields` sub-model for one control — element id, config ids, same as a full build.
|
|
43
|
+
|
|
44
|
+
Mirrors `builder._build_data_model`'s per-element branch. It is duplicated rather than shared
|
|
45
|
+
because that function rebuilds the WHOLE model from the shell, which is exactly what a splice
|
|
46
|
+
must not do to a designer-built form.
|
|
47
|
+
"""
|
|
48
|
+
eid = element["id"]
|
|
49
|
+
name = _name_of(element) or eid
|
|
50
|
+
sub = {"id": eid, "dataTypeId": eid, "name": name, "displayName": name,
|
|
51
|
+
"isDataModel": True, "isList": False, "isProcesio": False,
|
|
52
|
+
"isPublic": False, "parentDataTypeId": fields_ns, "jsonProperty": None,
|
|
53
|
+
"attributes": []}
|
|
54
|
+
for c in element.get("configs") or []:
|
|
55
|
+
shape = builder._dm_shape(element, c) # the same rule form-create applies
|
|
56
|
+
if shape is None:
|
|
57
|
+
continue
|
|
58
|
+
sub["attributes"].append(
|
|
59
|
+
builder._dm_attr(builder._attr_name(c["key"]), c.get("id") or _new_id(ctx),
|
|
60
|
+
shape[0], eid, shape[1]))
|
|
61
|
+
return sub
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# container type -> the config holding the ordered NAMES of the children it renders.
|
|
65
|
+
_LIST_CONFIG = {"tabs": "tabs", "table": "rows", "stepper": "steps"}
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def unreachable_in_row(elements: list, parent_id: str | None) -> str | None:
|
|
69
|
+
"""Warn when a control is being placed where no process map can read it.
|
|
70
|
+
|
|
71
|
+
A control inside a table row exists once per row, so a map reads it through the ROW - a
|
|
72
|
+
five-segment path ending at the child element, via the row's `$.fields` model attribute. A row
|
|
73
|
+
that was itself spliced in has no `$.fields`: this function builds a sub-model from an element's
|
|
74
|
+
own configs, and there is no way to add one afterwards that the runtime will honour. The control
|
|
75
|
+
then displays fine, accepts typing, and sends nothing, which looks like a broken save rather
|
|
76
|
+
than a control in the wrong place.
|
|
77
|
+
|
|
78
|
+
Returns the warning text, or None when the placement is fine.
|
|
79
|
+
"""
|
|
80
|
+
if not parent_id:
|
|
81
|
+
return None
|
|
82
|
+
by_id = {e.get("id"): e for e in elements}
|
|
83
|
+
node = by_id.get(parent_id)
|
|
84
|
+
seen = set()
|
|
85
|
+
while node is not None and node.get("id") not in seen:
|
|
86
|
+
seen.add(node.get("id"))
|
|
87
|
+
if node.get("type") == "dynamic-table-row":
|
|
88
|
+
name = _name_of(node) or node.get("id")
|
|
89
|
+
return (f"placed inside the table row {name!r}: a control there exists once per row, so "
|
|
90
|
+
f"a RUN_PROCESS map reading its own field path gets nothing. Address it through "
|
|
91
|
+
f"the row (formId.fieldsNs.rowId.$fieldsAttrId.childId), or - if that row has no "
|
|
92
|
+
f"'$.fields' attribute, which is the case for any row that was itself spliced in "
|
|
93
|
+
f"- put the control outside the row and copy the value out from the row's "
|
|
94
|
+
f"'$.item' when the panel opens.")
|
|
95
|
+
node = by_id.get(node.get("parentId"))
|
|
96
|
+
return None
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
def _resolve_parent(elements: list, parent: str | None) -> str | None:
|
|
100
|
+
if not parent:
|
|
101
|
+
return None
|
|
102
|
+
for el in elements:
|
|
103
|
+
if el.get("id") == parent or _name_of(el) == parent:
|
|
104
|
+
return el["id"]
|
|
105
|
+
known = ", ".join(sorted(n for n in (_name_of(e) for e in elements) if n))
|
|
106
|
+
raise UsageError(f"parent element not found: {parent!r}. Known element names: {known}")
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def add_elements(form: dict, specs: list, *, parent: str | None = None) -> dict:
|
|
110
|
+
"""Return a NEW `Data` with `specs` (authoring-config elements) appended.
|
|
111
|
+
|
|
112
|
+
`parent` places them inside an existing container, by element name or id; omitted, they land at
|
|
113
|
+
the top level. A duplicate control NAME is refused: the designer resolves a field path back to a
|
|
114
|
+
name, so two controls sharing one make every reference to it ambiguous.
|
|
115
|
+
"""
|
|
116
|
+
if not specs:
|
|
117
|
+
raise UsageError("nothing to add: pass at least one element spec")
|
|
118
|
+
|
|
119
|
+
data = copy.deepcopy(form.get("data") or form.get("Data") or {})
|
|
120
|
+
elements = data.get("elements") or []
|
|
121
|
+
existing_names = {n for n in (_name_of(e) for e in elements) if n}
|
|
122
|
+
|
|
123
|
+
parent_id = _resolve_parent(elements, parent)
|
|
124
|
+
|
|
125
|
+
# The field-name resolver walks from the form handle variable into Data.dataModel, so the model
|
|
126
|
+
# root, the field-path root and variables[0].id must be the SAME id (builder.build guards this
|
|
127
|
+
# on a full build). On a splice we adopt the LIVE id rather than deriving a new one.
|
|
128
|
+
handle = (data.get("variables") or [{}])[0]
|
|
129
|
+
root_id = data.get("dataModel", {}).get("id") or handle.get("id")
|
|
130
|
+
if not root_id:
|
|
131
|
+
raise UsageError("form has no dataModel root id; refusing to guess one")
|
|
132
|
+
|
|
133
|
+
ctx = {"form_id": form.get("id") or form.get("Id"), "dm_root_id": root_id,
|
|
134
|
+
"field_paths": {}, "value_attr_ids": {}, "new_id": _new_id,
|
|
135
|
+
"parent_id": parent_id}
|
|
136
|
+
|
|
137
|
+
added: list = []
|
|
138
|
+
for spec in specs:
|
|
139
|
+
name = spec.get("name") or builder._field_slug(spec.get("label") or spec.get("type") or "")
|
|
140
|
+
if name in existing_names:
|
|
141
|
+
raise UsageError(
|
|
142
|
+
f"the form already has a control named {name!r}; two controls with one name make "
|
|
143
|
+
f"every field reference to it ambiguous")
|
|
144
|
+
existing_names.add(name)
|
|
145
|
+
builder._build_element(spec, dict(ctx), added)
|
|
146
|
+
|
|
147
|
+
data["elements"] = elements + added
|
|
148
|
+
|
|
149
|
+
# A container does not draw a child just because the child points at it: `tabs` lists its tab
|
|
150
|
+
# NAMES and `table` lists its row names, and a spliced child that is missing from that list
|
|
151
|
+
# exists, saves, lints clean, and never appears on screen. Registering it here is the whole
|
|
152
|
+
# difference between a control that is there and one that only looks like it is.
|
|
153
|
+
if parent_id:
|
|
154
|
+
container = next((e for e in elements if e.get("id") == parent_id), None)
|
|
155
|
+
if container is not None:
|
|
156
|
+
key = _LIST_CONFIG.get(container.get("type"))
|
|
157
|
+
if key:
|
|
158
|
+
for c in container.get("configs") or []:
|
|
159
|
+
if c.get("key") == key:
|
|
160
|
+
listed = list(c.get("value") or [])
|
|
161
|
+
for el in added:
|
|
162
|
+
nm = _name_of(el)
|
|
163
|
+
if el.get("parentId") == parent_id and nm and nm not in listed:
|
|
164
|
+
listed.append(nm)
|
|
165
|
+
c["value"] = listed
|
|
166
|
+
|
|
167
|
+
model = data.setdefault("dataModel", {"id": root_id, "name": "form", "attributes": []})
|
|
168
|
+
attrs = model.setdefault("attributes", [])
|
|
169
|
+
fields = next((a for a in attrs if a.get("name") == "fields"), None)
|
|
170
|
+
if fields is None:
|
|
171
|
+
fields = {"id": builder._FIELDS_NS, "dataTypeId": builder._FIELDS_NS, "name": "fields",
|
|
172
|
+
"displayName": "fields", "isDataModel": True, "isList": False,
|
|
173
|
+
"isProcesio": False, "isPublic": True, "parentDataTypeId": root_id,
|
|
174
|
+
"jsonProperty": None, "attributes": []}
|
|
175
|
+
attrs.append(fields)
|
|
176
|
+
fields.setdefault("attributes", []).extend(
|
|
177
|
+
_sub_model(el, fields["id"], ctx) for el in added)
|
|
178
|
+
|
|
179
|
+
return data
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
def _descendants(elements: list, root_id: str) -> list:
|
|
183
|
+
"""Every element under `root_id`, however deep."""
|
|
184
|
+
out, frontier = [], {root_id}
|
|
185
|
+
while frontier:
|
|
186
|
+
kids = [e for e in elements if e.get("parentId") in frontier and e not in out]
|
|
187
|
+
if not kids:
|
|
188
|
+
break
|
|
189
|
+
out += kids
|
|
190
|
+
frontier = {k["id"] for k in kids}
|
|
191
|
+
return out
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def _references_to(data: dict, doomed_ids: set) -> list:
|
|
195
|
+
"""Where the rest of the form still points at one of `doomed_ids`.
|
|
196
|
+
|
|
197
|
+
A field VALUE PATH carries the element id, so a RUN_PROCESS input/output map, a visibility
|
|
198
|
+
condition or another control's event all show up as the id appearing outside the element
|
|
199
|
+
itself. Searching by id is exact; a reference made by NAME cannot be found this way, which
|
|
200
|
+
is why the report says so rather than implying the list is exhaustive.
|
|
201
|
+
"""
|
|
202
|
+
survivors = {"elements": [e for e in (data.get("elements") or [])
|
|
203
|
+
if e.get("id") not in doomed_ids],
|
|
204
|
+
"events": data.get("events"), "variables": data.get("variables")}
|
|
205
|
+
blob = json.dumps(survivors, ensure_ascii=False)
|
|
206
|
+
# Matched as a WHOLE token: a field path joins ids with dots, so an id must not be found
|
|
207
|
+
# merely because it is a substring of a longer one.
|
|
208
|
+
return sorted(i for i in doomed_ids
|
|
209
|
+
if re.search(r"(?<![0-9A-Za-z-])%s(?![0-9A-Za-z-])" % re.escape(i), blob))
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
def delete_element(form: dict, element: str, *, force: bool = False) -> tuple[dict, dict]:
|
|
213
|
+
"""Return (a NEW `Data` without `element`, report). The mirror of `add_elements`.
|
|
214
|
+
|
|
215
|
+
Removes the control from `Data.elements` AND its entry from the form's data model, leaving
|
|
216
|
+
every other element's id and field path untouched - the property that makes a splice safe
|
|
217
|
+
and is equally required here. A control that something still references is REFUSED unless
|
|
218
|
+
`force`, because a dangling field path is saved without any error and the control that
|
|
219
|
+
pointed at it then silently launches nothing.
|
|
220
|
+
"""
|
|
221
|
+
data = copy.deepcopy(form.get("data") or form.get("Data") or {})
|
|
222
|
+
elements = data.get("elements") or []
|
|
223
|
+
target = next((e for e in elements
|
|
224
|
+
if e.get("id") == element or _name_of(e) == element), None)
|
|
225
|
+
if target is None:
|
|
226
|
+
known = ", ".join(sorted(n for n in (_name_of(e) for e in elements) if n)[:20])
|
|
227
|
+
raise UsageError(f"no element with id or name {element!r} on this form; known: {known}")
|
|
228
|
+
|
|
229
|
+
kids = _descendants(elements, target["id"])
|
|
230
|
+
if kids and not force:
|
|
231
|
+
raise UsageError(
|
|
232
|
+
f"{_name_of(target) or target['id']!r} contains {len(kids)} control(s) "
|
|
233
|
+
f"({', '.join(str(_name_of(k) or k['id']) for k in kids[:6])}); delete those first, "
|
|
234
|
+
f"or pass --force to remove the whole subtree")
|
|
235
|
+
|
|
236
|
+
doomed = [target] + kids
|
|
237
|
+
doomed_ids = {e["id"] for e in doomed}
|
|
238
|
+
refs = _references_to(data, doomed_ids)
|
|
239
|
+
if refs and not force:
|
|
240
|
+
raise UsageError(
|
|
241
|
+
f"{_name_of(target) or target['id']!r} is still referenced by the form "
|
|
242
|
+
f"({len(refs)} id reference(s) outside the control itself: an event, a process "
|
|
243
|
+
f"input/output map or a visibility condition). Re-point or remove those first, or "
|
|
244
|
+
f"pass --force to delete anyway and break them")
|
|
245
|
+
|
|
246
|
+
data["elements"] = [e for e in elements if e["id"] not in doomed_ids]
|
|
247
|
+
|
|
248
|
+
# Un-register from a container's own list, the reverse of the splice.
|
|
249
|
+
for container in data["elements"]:
|
|
250
|
+
key = _LIST_CONFIG.get(container.get("type"))
|
|
251
|
+
if not key:
|
|
252
|
+
continue
|
|
253
|
+
for c in container.get("configs") or []:
|
|
254
|
+
if c.get("key") == key and isinstance(c.get("value"), list):
|
|
255
|
+
gone = {_name_of(e) for e in doomed}
|
|
256
|
+
c["value"] = [n for n in c["value"] if n not in gone]
|
|
257
|
+
|
|
258
|
+
# And from the data model, so the form stops advertising a field it no longer draws.
|
|
259
|
+
removed_attrs = 0
|
|
260
|
+
fields = next((a for a in (data.get("dataModel", {}).get("attributes") or [])
|
|
261
|
+
if a.get("name") == "fields"), None)
|
|
262
|
+
if fields:
|
|
263
|
+
before = len(fields.get("attributes") or [])
|
|
264
|
+
fields["attributes"] = [a for a in (fields.get("attributes") or [])
|
|
265
|
+
if a.get("id") not in doomed_ids]
|
|
266
|
+
removed_attrs = before - len(fields["attributes"])
|
|
267
|
+
|
|
268
|
+
report = {
|
|
269
|
+
"removed": [{"id": e["id"], "type": e.get("type"), "name": _name_of(e)} for e in doomed],
|
|
270
|
+
"descendants": len(kids),
|
|
271
|
+
"model_attributes_removed": removed_attrs,
|
|
272
|
+
"broken_references": refs if force else [],
|
|
273
|
+
"element_count": len(data["elements"]),
|
|
274
|
+
"note": ("references are found by element id; one made by NAME cannot be detected that "
|
|
275
|
+
"way, so check a condition that names the control"),
|
|
276
|
+
}
|
|
277
|
+
return data, report
|