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,594 @@
|
|
|
1
|
+
# Phase 4 — end-to-end use case (AAT_ "Company Intelligence Brief")
|
|
2
|
+
|
|
3
|
+
A full working demo in workspace **4Export** (`3fd85e9d-121e-415b-877f-f488cd685ce3`)
|
|
4
|
+
exercising every DTO sub-tool: 2 data models, 2 credentials, 1 document, 2 processes,
|
|
5
|
+
1 webhook, 1 form. All resources prefixed `AAT_`. Built entirely programmatically.
|
|
6
|
+
|
|
7
|
+
## Resource ids (4Export)
|
|
8
|
+
|
|
9
|
+
| Resource | id |
|
|
10
|
+
|---|---|
|
|
11
|
+
| Data model AAT_SearchHit | `f675610e-8ac9-40a3-a909-e963841b72c9` |
|
|
12
|
+
| Data model AAT_SearchReport | `cfa383c7-1a36-410b-852e-bcc57c53a614` |
|
|
13
|
+
| Credential AAT_GoogleSearch (REST API) | `77b6f02b-d111-4ff4-b67a-264b571b9957` |
|
|
14
|
+
| Credential AAT_SendGrid (SMTP) | `7b38b993-9141-4533-995d-44d73d9932fb` |
|
|
15
|
+
| Document AAT_CompanyBrief | `503f33b4-8653-497d-8f77-ae52d909cae1` |
|
|
16
|
+
| Webhook AAT_BriefRequested | `9b700656-4619-41e1-96ce-4be561fd7bc1` (model `9b3e2e82-b8c0-4a63-be98-4098e3e17d7f`, attr searchTerm `18c90bb9-391d-4853-a843-658afebd27a9`) |
|
|
17
|
+
| Process AAT_Process_Notify | `564d2934-ffb2-44a5-8d5e-4e0979b3ccaa` |
|
|
18
|
+
|
|
19
|
+
## Learnings (verified live 2026-06-24)
|
|
20
|
+
|
|
21
|
+
1. **Webhook -> process variable binding maps the WHOLE body, not a field.**
|
|
22
|
+
`WebhookVariables` is exactly `{VariableId, VariableType}` where VariableType
|
|
23
|
+
1=header, 2=query, 3=body (confirmed against real exported flows). There is NO
|
|
24
|
+
per-field mapping. The body (type 3) must bind to a **model-typed** process
|
|
25
|
+
variable whose DataType is the webhook's generated data model — then downstream
|
|
26
|
+
actions read its attributes. Binding the body to a *primitive* (string) variable
|
|
27
|
+
dumps the raw JSON (`{ "searchTerm": "..." }`) into it. Real exports confirm the
|
|
28
|
+
body var is model-typed (Type=10 input, DataType = a custom model id).
|
|
29
|
+
|
|
30
|
+
2. **Builder enhancement — attribute paths inside text templates.** To embed a
|
|
31
|
+
model attribute into a text field (email Subject = "Brief for <%0%> is ready"
|
|
32
|
+
where the value is `payload.searchTerm`), the process builder's `{template,vars}`
|
|
33
|
+
binding now accepts `vars` items as either a name string OR `{"var": name,
|
|
34
|
+
"path": ["attrIdOrName"]}`. `_make_parameter` builds the VariableAttributeDto
|
|
35
|
+
chain; `config.schema.json` `binding.template.vars.items` widened to `anyOf
|
|
36
|
+
[string, {var,path}]`. Without this, model attributes could not be placed into
|
|
37
|
+
text. (attr_index isn't pre-populated for webhook models, so pass the attribute
|
|
38
|
+
**id** in `path`.)
|
|
39
|
+
|
|
40
|
+
3. **REST API key credential — key as a query param.** For Google Custom Search
|
|
41
|
+
(needs `?key=...&cx=...`): REST API credential, Authentication method = "API key
|
|
42
|
+
authentication", Key=`key`, Value=`<apikey>`, **Header(`10101010-0001-0009`)=false,
|
|
43
|
+
Query Parameters(`10101010-0001-0010`)=true**. `/api/Credentials/test` with Test
|
|
44
|
+
endpoint `?cx=722c82f83dd77489f&q=...` returned a real `customsearch#search`
|
|
45
|
+
body -> placement confirmed. The action then adds `cx`+`q` query params.
|
|
46
|
+
|
|
47
|
+
4. **SendGrid over SMTP.** Credential type "Outbound e-mail (SMTP)":
|
|
48
|
+
Server=`smtp.sendgrid.net`, Port=`587`, Encryption=`TLS` (587 None/TLS/Auto all
|
|
49
|
+
pass the connection test; 465 timed out), Username=`apikey`, Password=<sendgrid
|
|
50
|
+
api-key>, From=`<verified-sender>@procesio.com` (a SendGrid verified sender). `/test` ->
|
|
51
|
+
`{"isSuccess":true,"body":"Connection was successful"}`. Email delivered live to
|
|
52
|
+
a personal Gmail inbox.
|
|
53
|
+
|
|
54
|
+
5. **google-mail account selection** is the `GOOGLE_ACCOUNT` env var (values:
|
|
55
|
+
`default` = the work mailbox, `personal`), NOT an `--account` flag.
|
|
56
|
+
Verified the SendGrid email by Cc'ing the readable default inbox.
|
|
57
|
+
|
|
58
|
+
6. **Process GET shape.** `GET /api/Projects/{id}` wraps everything under a top-level
|
|
59
|
+
`flow` key. Instances: `GET /api/Projects/{id}/instances` (paged); per-instance
|
|
60
|
+
detail endpoints return 401 (not exposed over this surface). Instance `status:50`
|
|
61
|
+
= finished, `actionsConsumed` counts non-Start/Stop actions, `errorMessage` null
|
|
62
|
+
on success. A webhook-launched run is async (launch returns empty 200).
|
|
63
|
+
|
|
64
|
+
7. **Send Email action** properties: `Select SMTP credentials` (literal credential
|
|
65
|
+
id), `To`/`Cc`/`Bcc`, `From (Entity)` (must be a verified sender), `From (Display
|
|
66
|
+
Name)`, `Subject`, `Body` (code-editor), `Body is Html` (check-box, literal true).
|
|
67
|
+
|
|
68
|
+
## Process 2 (search -> PDF) — the hard-won scripting/document learnings
|
|
69
|
+
|
|
70
|
+
Process `AAT_Process_SearchGenerate` (`11bf8d6d-3e7a-4355-a37e-75c9608d8443`):
|
|
71
|
+
Call API (Google CSE) -> Javascript (build full branded HTML) -> Generate Document
|
|
72
|
+
(shell template, docMap) -> branded PDF with the live search table + hero image.
|
|
73
|
+
Verified live: PDF rendered with SUBJECT, 6 real LinkedIn results, the search image.
|
|
74
|
+
|
|
75
|
+
8. **Javascript output is ALWAYS wrapped `{result: <v>}`.** It maps cleanly only
|
|
76
|
+
into a model whose `result` field is a **primitive** (e.g. `AAT_HtmlEnvelope
|
|
77
|
+
{result: string}` -> `result` = the string). Mapping `{result: v}` into a model
|
|
78
|
+
whose `result` is a nested **model** or **list-of-model** creates the structure
|
|
79
|
+
but leaves inner fields EMPTY — PROCESIO does **not** map a plain JS object's
|
|
80
|
+
keys onto a typed model's attributes. Consequence: **you cannot build a typed
|
|
81
|
+
list/model from a JS action** to feed a document's repeating table. (Confirmed by
|
|
82
|
+
reading the real output variable, not just customResponse, which is lossy for
|
|
83
|
+
nested models.) Bind the output to `AAT_HtmlEnvelope` id `303b0e3b-557f-4667-ac76-fc436999b023`
|
|
84
|
+
(result attr `7950ac90-aded-46f1-ad18-b5f3d2c99357`).
|
|
85
|
+
|
|
86
|
+
9. **To put dynamic data in a document: build the whole HTML in JS, render via a
|
|
87
|
+
shell template.** `AAT_BriefShell` (`2c172798-0a96-4911-9c2e-16aebf5afabc`) body
|
|
88
|
+
is a single `<%htmlContent%>` placeholder (string var). Generate Document docMap:
|
|
89
|
+
`htmlContent <- {var: htmlEnv, path: [result_guid]}`. The placeholder substitutes
|
|
90
|
+
**raw HTML** (not escaped) -> the PDF renders the full branded layout, table,
|
|
91
|
+
image. This is the robust pattern given the JS->typed-model limitation.
|
|
92
|
+
|
|
93
|
+
10. **Generate Document REQUIRES `Select Document Template`** (else 502/"Missing
|
|
94
|
+
document information"). The **`HTML string` property is an OUTPUT** (the rendered
|
|
95
|
+
HTML is written there) — not an input; binding a var to it gets it overwritten.
|
|
96
|
+
|
|
97
|
+
11. **docMap attribute paths must be GUIDs.** Navigating a `json` var by key fails:
|
|
98
|
+
`Error converting value "result" to ... Guid ... attribute.attributeId`. So a
|
|
99
|
+
`json` variable can't be navigated in docMap — must be a typed model with real
|
|
100
|
+
attribute GUIDs.
|
|
101
|
+
|
|
102
|
+
12. **Compiled-model cache.** An attribute added to a data model via *edit* (after
|
|
103
|
+
creation) is NOT in the runtime's compiled model: Generate Document fails
|
|
104
|
+
"Unable to find attribute <guid> in data type <id>" even though GET shows it.
|
|
105
|
+
**Always create a data model with all attributes up front**; don't rely on
|
|
106
|
+
datatype-edit add for attributes consumed by Generate Document.
|
|
107
|
+
|
|
108
|
+
13. **Call API for Google CSE.** `Request Parameters` (tabs-payload-v2) =
|
|
109
|
+
`{body:{type:RAW,value:{...}}, headers:[], queryParams:[{key,value,id,type:"TEXT"}]}`.
|
|
110
|
+
cx as a literal, `q` as `<%var%>`, `num` literal. `Verb` GET =
|
|
111
|
+
`3ab385bd-f8ae-b641-9176-e7db886aec01`. `Response Body` -> a **string** var. The
|
|
112
|
+
API key is injected by the credential (API-key-as-query). No Endpoint path needed
|
|
113
|
+
(credential URL already ends `/customsearch/v1`). Use the UNVERSIONED `Call API` action (id cd8bd0bc-...804de) = the LATEST/live one (outputs Response Status/Body/Headers/File); `Call API v1/v2/v3` are frozen pins and there is NO `v4` action ("Call API - v4" is only a palette folder). See [[aat-to-procesio-migration]].
|
|
114
|
+
|
|
115
|
+
14. **JS JSON injection: inject as a BARE object literal** (`var data = <%0%>;`), NOT
|
|
116
|
+
inside backticks. A backtick template literal un-escapes the JSON's `\n`/`\"`
|
|
117
|
+
sequences and corrupts it (JSON.parse then throws -> 0 results). Bare injection
|
|
118
|
+
treats the CSE JSON as a JS object literal directly.
|
|
119
|
+
|
|
120
|
+
15. **Reading results.** `run-process --synchronous` returns output vars under
|
|
121
|
+
`result.variable`. Download a generated file: `GET /api/File/download` with
|
|
122
|
+
headers `uploadFilePath` (the file's `path`), `variableId`, `instanceId`,
|
|
123
|
+
`flowTemplateId` (parse variableId/instanceId from the path). Instance status +
|
|
124
|
+
per-action errors: `GET /api/Projects/instances/{iid}/status?flowTemplateId={pid}`
|
|
125
|
+
(`.instance.actions[].errorMessage`). Status 50 = finished, 40 = ran-with-errors.
|
|
126
|
+
|
|
127
|
+
16. **Builder enhancements made for this (generic, reusable):** template-binding
|
|
128
|
+
`vars` items may be `{var, path}` (attribute paths in text/object templates), and
|
|
129
|
+
a `template` may be a JSON **object/array** (not just a string) — `<%i%>` is
|
|
130
|
+
remapped in all string leaves. `config.schema.json` widened to match. Lets Call
|
|
131
|
+
API `Request Parameters` and attribute-path subjects be expressed declaratively.
|
|
132
|
+
|
|
133
|
+
## CRITICAL process-builder fix — designer config vs runtime Parameters
|
|
134
|
+
|
|
135
|
+
**Symptom (reported live):** every action's parameters showed EMPTY in the designer
|
|
136
|
+
("Send Email - Not configured", To/Subject/Body blank), `Validate` flagged "action is
|
|
137
|
+
not defined/configured properly" — yet the process **ran fine** (email sent, PDF made).
|
|
138
|
+
Clicking `Validate` in the designer then cleared the errors.
|
|
139
|
+
|
|
140
|
+
**Root cause:** a PROCESIO action stores its parameter values in TWO places that must
|
|
141
|
+
mirror each other — `Parameters[]` (`{TabPropertyId, Value, Variable}`, what the
|
|
142
|
+
RUNTIME reads) AND `CustomData.configuration[].settings[].value` (what the DESIGNER
|
|
143
|
+
reads/validates). The builder filled only `Parameters[]` and left the configuration
|
|
144
|
+
tree as the empty template defaults → designer blank + invalid, runtime correct.
|
|
145
|
+
|
|
146
|
+
**Fix (in `_action_node`, applies to every process the tool builds):** deep-copy the
|
|
147
|
+
template `configuration` and set each setting's `value` to mirror its Parameter via
|
|
148
|
+
`_config_value_from_param` — same value, but a variable reference is the raw
|
|
149
|
+
`variableId` (with `.attrId` for attribute paths) in the config where the Parameter
|
|
150
|
+
uses a `<%N%>` placeholder (verified against real exports: Call API `Response Body`
|
|
151
|
+
config value = the var id; Parameter value = `<%3%>`). Structured/object values are
|
|
152
|
+
walked recursively. Confirmed live: settings now carry values, Validate passes,
|
|
153
|
+
runtime unchanged.
|
|
154
|
+
|
|
155
|
+
**Canvas origin fix (also reported):** flow started "way-left". Real flows start at
|
|
156
|
+
~x500/y480; `_layout` now uses `_X0,_Y_MAIN,_X_PITCH = 480,480,260` (was 100,300,320).
|
|
157
|
+
Verified: Start(480,480) → actions 740/1000/1260 → Stop(1520), all on y=480.
|
|
158
|
+
|
|
159
|
+
## CRITICAL fixes round 2 — stale variable ids + form data model
|
|
160
|
+
|
|
161
|
+
Two more designer-vs-runtime issues (reported live):
|
|
162
|
+
|
|
163
|
+
**A. Process variable ids drift on every edit.** `build()` reassigned a fresh id to
|
|
164
|
+
every variable on each create/edit. External references (a form's RUN_PROCESS
|
|
165
|
+
inputMap/outputMap bind a process variable by id) therefore went stale after any
|
|
166
|
+
process re-edit -> the form's "Process input variable" column showed EMPTY. **Fix:**
|
|
167
|
+
process-`_edit` now fetches the existing flow and reuses variable ids by name
|
|
168
|
+
(`ctx["existing_var_ids"]`), so ids are stable across edits. (Action ids can still
|
|
169
|
+
change - they're internal; only variable ids are referenced externally.) Re-aligned
|
|
170
|
+
the form to Process 2's current ids after the fix.
|
|
171
|
+
|
|
172
|
+
**B. Form fields had no data model -> mapping paths unresolvable.** A PROCESIO form
|
|
173
|
+
backs every control with a **data-model attribute**: `Data.dataModel` root "form"
|
|
174
|
+
(id = the form id) -> a `fields` container (**id `11223344-5566-7788-99aa-aabbccddeeff`,
|
|
175
|
+
a platform constant in every form**) -> one sub-model per element (**id = element id**)
|
|
176
|
+
-> an attribute per config, incl. `value`. A RUN_PROCESS/MAP trigger references a
|
|
177
|
+
field by the path `formId.fields.elementId.valueAttrId`, and the **runtime stores the
|
|
178
|
+
field's value in that attribute**. The form builder only emitted `elements` and used
|
|
179
|
+
the shell's empty `fields` container -> the path pointed at nothing -> designer showed
|
|
180
|
+
raw guids AND values didn't flow. **Fix:** `_build_data_model` now mirrors every
|
|
181
|
+
element into the `fields` container (sub-model id = element id; a typed attribute per
|
|
182
|
+
non-event config; `value` typed by control kind incl. file-upload -> FileDataModel),
|
|
183
|
+
sets the dataModel root id = form id, and `field_paths` reference the real `value`
|
|
184
|
+
attribute id. Verified live: dataModel has 8 field sub-models with value attrs, the
|
|
185
|
+
inputMap paths reference existing attributes, root id = form id, and a form-triggered
|
|
186
|
+
Process 2 instance ran to status 50.
|
|
187
|
+
|
|
188
|
+
**Headless caveat (still true):** Playwright `fill`/`press` set the native input but
|
|
189
|
+
don't update the Angular-bound form model, so in automation `fields.X.value` stays
|
|
190
|
+
empty and the path resolves to itself (a filename came out as the path). A real
|
|
191
|
+
keyboard user populates the bound model and the value flows. Verify form value-flow
|
|
192
|
+
in a REAL browser.
|
|
193
|
+
|
|
194
|
+
## CRITICAL fixes round 3 — bespoke config shapes + build audit
|
|
195
|
+
|
|
196
|
+
`Map Document Data` (and, the user predicted, Decisional conditions) showed EMPTY in
|
|
197
|
+
the designer + failed Validate. Cause: a few property types store a **different
|
|
198
|
+
shape** in the designer config than in the runtime Parameter, and the round-1 mirror
|
|
199
|
+
just copied the runtime shape. Confirmed against real exports:
|
|
200
|
+
|
|
201
|
+
- **document-mapper** — runtime `{id, source:{value,variable}, destination:{variableId}}`
|
|
202
|
+
but designer `{id, process:<varId|literal>, document:<docVarId>}`.
|
|
203
|
+
- **decisional-case** — runtime `{id, actionid, condition:[{operator, leftOperator:{value:"<%N%>",
|
|
204
|
+
variable:[...]}, ...}]}` but designer `{id, name, target, condition:[{id, uid, operator,
|
|
205
|
+
leftOperator:{variable:"", attribute:{id:"",nextAttribute:null}, value:<varId>}, ...}]}`.
|
|
206
|
+
|
|
207
|
+
**Fix:** `_apply_values_to_config` dispatches by setting `type` — `_docmapper_config`
|
|
208
|
+
and `_decisional_cases_config` emit the designer shape; everything else uses the
|
|
209
|
+
`<%N%>`->varId mirror. **Plus a build audit (`_audit_config`, requested by the user):**
|
|
210
|
+
after building, every Parameter must map to a config setting, bespoke types must carry
|
|
211
|
+
their required keys (process/document; target/condition), and a runtime value must not
|
|
212
|
+
leave the designer field empty — otherwise the build **raises** (the designer would
|
|
213
|
+
flag "not configured"). Verified: Render PDF's Map Document Data config is now
|
|
214
|
+
`[{id, process:<htmlEnv.result>, document:<htmlContent>}]`, the audit passes, the flow
|
|
215
|
+
still runs to status 50. Regression tests added (config mirror, docMap shape, form
|
|
216
|
+
data model).
|
|
217
|
+
|
|
218
|
+
## Round 4 — document list-table is a dead end (designer "Unknown")
|
|
219
|
+
|
|
220
|
+
The showcase doc `AAT_CompanyBrief` (typed `hits` list + repeating table) shows the
|
|
221
|
+
table cells (`<%hitsId.attrId%>`) as **"Unknown"** chips in the document designer,
|
|
222
|
+
even though the attr ids match AAT_SearchHit exactly. There is no documented repeating
|
|
223
|
+
syntax, and (decisive) **you cannot populate a typed list anyway** — a typed list can
|
|
224
|
+
only be produced by a Scripting action, and PROCESIO doesn't map a JS object onto a
|
|
225
|
+
typed model's attributes. So **list-bound document tables don't work on this platform**;
|
|
226
|
+
scalar `<%name%>` binding DOES (chips resolve, renders). The working pattern for
|
|
227
|
+
dynamic/repeating content is the **HTML-string shell** (one `<%htmlContent%>`
|
|
228
|
+
placeholder fed a full HTML string from a script via an `{result:string}` envelope) —
|
|
229
|
+
proven by `AAT_BriefShell` + `AAT_Process_SearchGenerate`. Tool guard added:
|
|
230
|
+
`document` builder `prepare_ctx` now prints a WARNING when a body references a
|
|
231
|
+
list-variable attribute, steering to the shell pattern; `document/description.md`
|
|
232
|
+
documents it.
|
|
233
|
+
|
|
234
|
+
## Tool-implementation status (gap review)
|
|
235
|
+
|
|
236
|
+
All fixes are in the BUILDER CODE (so a fresh session's create/edit is correct), not
|
|
237
|
+
just applied to live resources — verified by grep + 38 tests:
|
|
238
|
+
- process: config-value mirror, document-mapper/decisional-case config transforms,
|
|
239
|
+
build audit, canvas origin, variable-id preservation on edit, template `{var,path}`
|
|
240
|
+
+ object templates, scripting global index, error ports/Join/decisional/custom-resp.
|
|
241
|
+
- form: flat elements, events/triggers, field-name->value-path resolution, full
|
|
242
|
+
data-model mirror (fields container + per-element sub-models + value attrs).
|
|
243
|
+
- document: scalar binding + name->id; active list-table warning.
|
|
244
|
+
- schema widened; goldens regenerated; regression tests added (config mirror, docMap
|
|
245
|
+
shape, form data-model mirror).
|
|
246
|
+
Remaining items are PLATFORM limits, not tool bugs, captured in docs/memory so a fresh
|
|
247
|
+
session avoids them: JS output is `{result:v}` and won't fill typed models (use
|
|
248
|
+
HTML-string shell); RUN_JAVASCRIPT form events + Angular model don't run under headless
|
|
249
|
+
Playwright (verify form JS in a real browser); compiled-model cache (create data models
|
|
250
|
+
complete, don't rely on datatype-edit add for attrs consumed by Generate Document).
|
|
251
|
+
|
|
252
|
+
## Round 5 — decisional condition needs the full field set
|
|
253
|
+
|
|
254
|
+
The round-3 decisional-case transform was incomplete: a real decisional condition (full
|
|
255
|
+
shape from the chat Bot export) also carries `value: null`, `rightOperandAsListRequired:
|
|
256
|
+
false`, `operandsAsListOptional: true` (besides id/uid/operator/logicOperator/left/right/
|
|
257
|
+
auxOperator). Omitting them made the designer fail to render the condition — empty/red
|
|
258
|
+
right operand, "Case (not configured)", and the **Validate button hung**. Also a literal
|
|
259
|
+
operand value (e.g. `50`) must be a **string** ("50") in the config. Fixed in
|
|
260
|
+
`_decisional_cases_config` / `_operand_config`; regression test added.
|
|
261
|
+
|
|
262
|
+
A throwaway dev process `zzz_comprehensive` (`669722ec-…`) was repaired in place (GET ->
|
|
263
|
+
re-mirror config with the fixed transforms -> PUT). Its 4 Concatenate `Input String 2`
|
|
264
|
+
fields were genuinely empty in the test data (a required field) — filled with a literal;
|
|
265
|
+
that's process data, not a tool bug. **Reusable recovery move:** any older process showing
|
|
266
|
+
"not configured" can be fixed without its source config by GET -> `_apply_values_to_config`
|
|
267
|
+
per action (normalize camelCase params to TabPropertyId/Value/Variable) -> PUT.
|
|
268
|
+
|
|
269
|
+
## Round 6 — form data-model ROOT id must be separate from the form id (THE form bug)
|
|
270
|
+
|
|
271
|
+
Runtime symptom: typing in a field threw `Cannot read properties of undefined
|
|
272
|
+
(reading 'searchTerm')` from the onInput concat — i.e. `ProcesioForm.data.fields` was
|
|
273
|
+
**undefined**, even though real forms' onClick handlers do `ProcesioForm.data.fields.X
|
|
274
|
+
.visible = …` fine. Same root cause as the designer "Unknown" mappings. Decisive find
|
|
275
|
+
from a real export: the form's `Data.dataModel` **root id is a SEPARATE generated id,
|
|
276
|
+
NOT the form template id** (real: root `a07641ba…` ≠ form `70876314…`), the fields
|
|
277
|
+
container's `parentDataTypeId` is that root id, and the field-reference path's FIRST
|
|
278
|
+
segment is that root id. My builder set the root id = the form id and used the form id
|
|
279
|
+
as the path's first segment — that collision broke the runtime's `data.fields`
|
|
280
|
+
construction and the designer resolution.
|
|
281
|
+
|
|
282
|
+
**Fix:** `build()` now generates `ctx["dm_root_id"]` (separate), `_build_data_model`
|
|
283
|
+
uses it as the dataModel root id + the fields container's parentDataTypeId, and the
|
|
284
|
+
field paths use it as segment 0. Verified structurally (root id != form id, fields
|
|
285
|
+
container hangs off it, inputMap path[0] == root id). RUNTIME confirmation needs a real
|
|
286
|
+
browser — headless Playwright can't fire the Angular onInput; the concat is now
|
|
287
|
+
defensive (no hard error) + logs an `AAT diag` line if `data.fields` is still missing.
|
|
288
|
+
|
|
289
|
+
## Round 11 — ROOT CAUSE (definitive): element goldens were stale, not what the toolbar produces
|
|
290
|
+
|
|
291
|
+
User's brilliant move: added a FRESH "Text input" from the toolbar (`input1`) next to my
|
|
292
|
+
generated `companyName`, mapped the input variable to `input1` (which resolved), and saved.
|
|
293
|
+
This put a canonical control beside a generated one in the same form. The diff:
|
|
294
|
+
|
|
295
|
+
- The variable picker showed `input1 -> value` but `companyname -> defaultValue` only, NO
|
|
296
|
+
`value`. So my field had no `value` property to map -> "Unknown".
|
|
297
|
+
- **PROCESIO RECOMPILES the data model from the ELEMENTS on save**, and only emits a `value`
|
|
298
|
+
data-model attr when the element's `value` config is CANONICAL. Canonical input value
|
|
299
|
+
config = `{key:"value", label:"Value", type:"hidden", value:"", exposed:true,
|
|
300
|
+
events:["EMIT_INPUT"]}`. My golden had `{label:"", value:null}` with no `exposed`/`events`
|
|
301
|
+
-> compiler dropped the value attr.
|
|
302
|
+
- My goldens were hand-trimmed captures: a real input has 18 configs (all `exposed:true`)
|
|
303
|
+
incl `type`/`disabled`/`visible`/`onFocus`/`onBlur`/`style`; mine had 12 and lacked
|
|
304
|
+
`exposed` everywhere. (The earlier "visible" round was a partial symptom, not the cause.)
|
|
305
|
+
|
|
306
|
+
Fix (the real one): **re-captured all 27 element goldens from real toolbar-created controls
|
|
307
|
+
in the repo exports** (`docs_info/Exports/*.procesio` -> `Forms[].Data.elements`). A real
|
|
308
|
+
input there matches the user's fresh `input1` byte-for-byte (verified). Extractor
|
|
309
|
+
(`tools/procesio/dto/form/capture_goldens.py`): per type, pick the export instance with the
|
|
310
|
+
most `exposed:true` configs; neutralize event/option/style values. Builder data-model build
|
|
311
|
+
now mirrors PROCESIO's compiler: one attr per non-event/non-`style` config, attr name =
|
|
312
|
+
camelCase(key) (`info-text`->`infoText`), id == config id, isPublic/hidden false; removed the
|
|
313
|
+
visible-synthesis hack (canonical goldens include it in the right position). 42 tests green.
|
|
314
|
+
|
|
315
|
+
Live AAT form re-applied: companyName/country/searchTerm sub-models are now byte-identical
|
|
316
|
+
(14 attrs incl `value`) to PROCESIO's compiled `input1`; both buttons' input/output map
|
|
317
|
+
value-segments resolve to the field's value config id; diagnostic `input1` removed. (User to
|
|
318
|
+
confirm the input "Form variable" now shows companyName/country and the field exposes `value`.)
|
|
319
|
+
|
|
320
|
+
## Round 10 — input-side "Unknown" = field sub-model missing a `visible` attr
|
|
321
|
+
|
|
322
|
+
After Round 9's isPublic/attr-id fix the OUTPUT form-variable resolved (`form.fields
|
|
323
|
+
.brieffile.value`) but the INPUT side STILL showed "Unknown" for companyName/country.
|
|
324
|
+
Same form, same data model, same dotted4 path format. The asymmetry: output references
|
|
325
|
+
briefFile (file-upload), input references companyName/country (text inputs).
|
|
326
|
+
|
|
327
|
+
Deep key-by-key diff of my companyName sub-model vs the reference `cui` field (input,
|
|
328
|
+
referenced on the input side of a real form): mine was MISSING `visible`, `disabled`,
|
|
329
|
+
`type` attrs and had `info-text` (vs ref `infoText`). The decisive correlation:
|
|
330
|
+
**briefFile RESOLVES and HAS a `visible` attr; companyName was UNKNOWN and LACKED it.**
|
|
331
|
+
briefFile resolves WITHOUT `type`/`disabled`, so only `visible` is load-bearing for the
|
|
332
|
+
trigger-map input-side resolver — a field with no `visible` attr is treated as
|
|
333
|
+
non-mappable. Root cause in the tool: the `input` element golden was captured incomplete
|
|
334
|
+
(no `visible` config), while `file-upload` includes it — which is exactly why output
|
|
335
|
+
worked and input didn't.
|
|
336
|
+
|
|
337
|
+
Verified the mechanism with real data: 199 real-form elements have onInput/onChange
|
|
338
|
+
events AND are RUN_PROCESS inputMap targets (so events aren't the cause); input- and
|
|
339
|
+
output-referenced fields are BOTH isPublic:false (so isPublic-by-direction isn't it).
|
|
340
|
+
Fix: form builder synthesizes a `visible:true` config on any element golden lacking one,
|
|
341
|
+
so every field sub-model carries a `visible` attr (id == the element's visible config id,
|
|
342
|
+
preserving the attr-id==config-id invariant). 42 tests green; new guard
|
|
343
|
+
`test_form_every_field_submodel_has_visible_attr`. Live AAT form re-applied: companyName,
|
|
344
|
+
country, searchTerm, briefFile all now have a `visible` attr. (User to confirm the
|
|
345
|
+
trigger-map input "Form variable" now shows companyName/country instead of "Unknown".)
|
|
346
|
+
|
|
347
|
+
## Round 9 — map "Unknown"/blank ROOT CAUSE + searchTerm concat actually fixed (ground truth from 163 real forms)
|
|
348
|
+
|
|
349
|
+
User: after Round 8 the input form-variable went from raw-guid to **"Unknown"** and output
|
|
350
|
+
was still blank — "a step in the right direction, but still not solved". Also: **bring back
|
|
351
|
+
the Search Term field — fix the issue, don't go around it.** (Dropping searchTerm in the
|
|
352
|
+
earlier round was avoidance.)
|
|
353
|
+
|
|
354
|
+
Got GROUND TRUTH two ways: (a) mined the repo's real project exports
|
|
355
|
+
`docs_info/Exports/*.procesio` (each has a `Forms` array with stringified `Data`); (b) a
|
|
356
|
+
12-way parallel workflow scanned all 145 live workspaces → 163 real UI-built forms with
|
|
357
|
+
RUN_PROCESS maps / in-form JS. Reference form for both bugs: **OMS Homepage** (also
|
|
358
|
+
HUB-Overview-Tabs, eTransport HUB).
|
|
359
|
+
|
|
360
|
+
BUG A — "Unknown"/blank. The dotted4 map path `<root>.11223344.<el>.<valueAttr>` and
|
|
361
|
+
root==variables[0] were already correct (identical to real forms). The real differences,
|
|
362
|
+
both properties of platform-GENERATED data models that my builder violated:
|
|
363
|
+
1. **data-model attr id == the element's CONFIG id** of the same key. Real forms reuse
|
|
364
|
+
the element config ids as the fields sub-model attr ids (OMS 15/16; the value-attr id
|
|
365
|
+
== the element's `value` config id). My builder minted FRESH attr ids (0/11 match) →
|
|
366
|
+
the path's value-segment resolved to nothing the designer could name → "Unknown".
|
|
367
|
+
2. **`isPublic:false`** on every field sub-model AND leaf attr. 100%-consistent across
|
|
368
|
+
all 163 real forms; my builder set `isPublic:true` → resolver won't index the node.
|
|
369
|
+
Fix (form builder): `_build_element` uses the element's `value` config id as the field-path
|
|
370
|
+
value segment; `_build_data_model` reuses each config's id as the attr id and sets
|
|
371
|
+
isPublic:false (+ hidden:false). Live AAT form now: 70 attrs, 0 id-mismatches, 0
|
|
372
|
+
isPublic≠false, all 3 map value-segments == element value config ids.
|
|
373
|
+
|
|
374
|
+
BUG B — **in-form JS field access WORKS** (Round 7's "JS can't read fields / ProcesioForm is
|
|
375
|
+
a stub" was WRONG — that probe ran outside the live form-runtime iframe). Real API, embedded
|
|
376
|
+
verbatim in a real form's own JS doc-comment: `ProcesioForm.data.fields.<elementName>.value`
|
|
377
|
+
to read/write (also `.visible/.required/.readonly`), `ProcesioForm.variables.<name>` for form
|
|
378
|
+
vars. The field key is the element name and the runtime LOWERCASES it (downloadButton →
|
|
379
|
+
downloadbutton). So searchTerm is BACK as a read-only field, auto-filled by an onInput
|
|
380
|
+
handler on companyName+country: `setv('searchTerm', companyName + ' ' + country)` (defensive
|
|
381
|
+
`F[n]||F[n.toLowerCase()]`). 41 builder tests green; new guards
|
|
382
|
+
`test_form_datamodel_attr_ids_match_element_config_ids_and_are_private`. (User to confirm in
|
|
383
|
+
a designer refresh: trigger-map shows field NAMES, and typing fills Search Term live.)
|
|
384
|
+
|
|
385
|
+
## Round 8 — process<->form data map showed form variables as guids (input) / blank (output)
|
|
386
|
+
|
|
387
|
+
User (designer "Map data" panel for the Search & Generate trigger): the **input** form
|
|
388
|
+
variable rendered as the raw path guid `<root>.11223344...<element>.<valueAttr>` and the
|
|
389
|
+
**output** form variable rendered as **nothing**. Same class of "form vars look like
|
|
390
|
+
guids" reported earlier - but this one is in the RUN_PROCESS data map, not the data model.
|
|
391
|
+
|
|
392
|
+
Root cause (found by probing the live form + the shell): the designer resolves a stored
|
|
393
|
+
field path back to its NAME by walking from the form HANDLE variable `Data.variables[0]`
|
|
394
|
+
(id `65396456-36bf-4d9f-8d32-63a4a9e5c8c0`, the FORM-scope root, `scopes:["FORM"]`, a
|
|
395
|
+
shell constant) into `Data.dataModel`. So `dataModel.id`, the field-path first segment,
|
|
396
|
+
and `variables[0].id` must ALL be the SAME id. The form builder was generating a FRESH
|
|
397
|
+
`dm_root_id` for `dataModel.id` + field paths (live form had `ae1d596d...`) while
|
|
398
|
+
`variables[0]` stayed `65396456...` - so the resolver started at `65396456`, found no
|
|
399
|
+
root, and fell back to printing the raw path (input) / blank (output). The earlier
|
|
400
|
+
"root != form id" fix had over-corrected: it must be `variables[0].id` (which is ALSO
|
|
401
|
+
!= form id), not a random id.
|
|
402
|
+
|
|
403
|
+
Fix (in the builder, so it never recurs): `build()` derives `ctx["dm_root_id"]` from the
|
|
404
|
+
shell's "form" variable (`dataType`/`id`) instead of `_new_id()`, and a build-time guard
|
|
405
|
+
raises unless `dataModel.id == variables[0].id` and every `field_paths` value roots at it.
|
|
406
|
+
New regression test `test_form_field_paths_root_matches_form_handle_variable`. Removing
|
|
407
|
+
the `_new_id()` call shifted the deterministic test id sequence by one -> regenerated
|
|
408
|
+
`fixtures/reg.elements.json` (verified structurally identical, pure -1 id shift). 40 tests
|
|
409
|
+
green. Re-applied `form_final.json` to the live form; probe confirms `dataModel.id ==
|
|
410
|
+
variables[0].id == 65396456...`, both buttons' input paths + btnSearch output path now
|
|
411
|
+
root at `65396456...`, and the `fields` container holds element sub-models named
|
|
412
|
+
companyName/country/briefFile each with their value attr - so the designer now shows the
|
|
413
|
+
field NAMES on both sides. (User to confirm visually after a designer refresh.)
|
|
414
|
+
|
|
415
|
+
## Round 7 — in-form JavaScript CANNOT read field values (current runtime)
|
|
416
|
+
|
|
417
|
+
Probed the live runtime layer by layer (no Chrome MCP, headless can't fire onInput, so
|
|
418
|
+
read the object shape through the console). Result: in `forms.procesio.app`'s current
|
|
419
|
+
runtime, the in-form JS sandbox (about:srcdoc) exposes only a STUB:
|
|
420
|
+
`ProcesioForm == {data: "<formId-string>", variables: {form: ""}}` — **no field
|
|
421
|
+
values**. The old `ProcesioForm.data.fields.X.value` API (from exports) is a previous
|
|
422
|
+
runtime version and no longer works. So **any form JS that reads/writes field values
|
|
423
|
+
fails** — the read-only searchTerm oninput concat is impossible, and so is a webhook
|
|
424
|
+
`fetch` button that needs the typed values in its payload.
|
|
425
|
+
|
|
426
|
+
**What works: RUN_PROCESS triggers** — they map field values to the process
|
|
427
|
+
SERVER-SIDE (not via JS), so they get the real typed values. Final form design (user
|
|
428
|
+
chose "drop searchTerm, map fields directly"): Company + Country inputs, a file-upload,
|
|
429
|
+
**Search & Generate** = RUN_PROCESS Process 2 (companyName+country -> PDF into the
|
|
430
|
+
upload), **Email me** = RUN_PROCESS Process 3 (companyName+country -> SendGrid email).
|
|
431
|
+
No searchTerm field, no field-reading JS -> no console errors. Process 3 restructured
|
|
432
|
+
to take companyName+country (was the webhook payload model). The webhook
|
|
433
|
+
`AAT_BriefRequested` remains a standalone API-triggerable artifact.
|
|
434
|
+
**Rule for the form builder going forward: never rely on form JS to read field values
|
|
435
|
+
— use RUN_PROCESS inputMap/outputMap (server-side) for anything that needs them.**
|
|
436
|
+
|
|
437
|
+
## Form (AAT_CompanyBriefForm `1c515f94-ef1a-4696-aa62-43fb78e55221`)
|
|
438
|
+
|
|
439
|
+
Render URL: `https://forms.procesio.app/iG5-IMmbNP` (CustomUrl tinyUrl). 8 controls:
|
|
440
|
+
heading, paragraph, 2 inputs (companyName/country), read-only searchTerm, file-upload
|
|
441
|
+
(briefFile), Search & Generate button, Email-me button. Renders perfectly with the
|
|
442
|
+
enterprise theme (verified by screenshot).
|
|
443
|
+
|
|
444
|
+
17. **Form trigger config (verified against real exports):** per-control config key
|
|
445
|
+
`onClickEvents`/`onInputEvents` = `{debounce:0, events:[{id, type:"CLICK"|"INPUT",
|
|
446
|
+
action, config}]}`. `RUN_PROCESS` config = `{processId, syncRun, inputMap,
|
|
447
|
+
outputMap, conditions:[], areConditionsConfigured:true}`. `RUN_JAVASCRIPT` =
|
|
448
|
+
`{code}`. Both inputMap & outputMap rows are `{id, left: <processVarId>, right:
|
|
449
|
+
<formFieldPath>}`.
|
|
450
|
+
|
|
451
|
+
18. **Form field value-path = `formId.11223344-5566-7788-99aa-aabbccddeeff.elementId
|
|
452
|
+
.valueConfigId`** (the middle GUID is a platform "fields" container constant,
|
|
453
|
+
confirmed across forms). The form builder now resolves a field **name** in a
|
|
454
|
+
trigger's inputMap/outputMap/mapping to this full path (`ctx['field_paths']`), so
|
|
455
|
+
triggers reference fields by name. Fields must be declared **before** the buttons
|
|
456
|
+
that reference them (paths are registered as elements build in order).
|
|
457
|
+
|
|
458
|
+
19. **RUN_PROCESS from a form WORKS end-to-end (verified live):** clicking Search &
|
|
459
|
+
Generate ran Process 2 synchronously and placed the generated PDF into the
|
|
460
|
+
file-upload control (download icon appeared). The form runtime executes the
|
|
461
|
+
process with the workspace context — an anonymous public form can run a process
|
|
462
|
+
that uses credentials.
|
|
463
|
+
|
|
464
|
+
20. **Make the process robust to the form, not the reverse.** Process 2 takes
|
|
465
|
+
`companyName`+`country` and concatenates server-side (Call API `q` =
|
|
466
|
+
`"<%0%> <%1%>"` over both vars). So the brief is correct from the two filled
|
|
467
|
+
fields directly; it does NOT depend on the client-side concat firing. The
|
|
468
|
+
read-only `searchTerm` field + its oninput concat is a display convenience only.
|
|
469
|
+
|
|
470
|
+
21. **Known limitation — RUN_JAVASCRIPT form events + headless verification.** Under
|
|
471
|
+
headless Playwright, `fill()` and even per-key `press()` set the native input's
|
|
472
|
+
visible text but do NOT update PROCESIO's Angular form **model** (custom input
|
|
473
|
+
components) — so an empty model field, when read by an inputMap path, resolves to
|
|
474
|
+
the *path string* itself (e.g. a filename came out as the field path). Separately,
|
|
475
|
+
`RUN_JAVASCRIPT` events (the oninput concat, and the webhook `fetch`) did not fire
|
|
476
|
+
in the headless runtime even though the event structure matches real exports
|
|
477
|
+
exactly (a dead-simple constant assignment to `searchTerm.value` also didn't
|
|
478
|
+
show). The webhook `fetch` is additionally cross-origin (form -> webapi) so it
|
|
479
|
+
needs `mode:'no-cors'`. These are form-RUNTIME/headless-automation concerns, not
|
|
480
|
+
DTO-builder correctness — the form is built per the documented contract; real
|
|
481
|
+
keyboard users drive the Angular model. Verify form JS interactions manually in a
|
|
482
|
+
real browser, not headless.
|
|
483
|
+
|
|
484
|
+
## Round 12 — DECISIVE functional test: list-bound document tables DO render; Round 4 was WRONG
|
|
485
|
+
|
|
486
|
+
A scratch process functional render test settled the AAT_CompanyBrief "Unknown" mystery
|
|
487
|
+
definitively. Two runs in the AAT workspace (`3fd85e9d-…`), Generate Document -> PDF,
|
|
488
|
+
typed `hits` list fed via a **process-variable DefaultValue containing a JSON array**
|
|
489
|
+
(option 2 — no Call API echo, no Javascript needed; it worked first try):
|
|
490
|
+
|
|
491
|
+
- **Run A — original `AAT_SearchHit` (f675610e) + original `AAT_CompanyBrief` doc
|
|
492
|
+
(503f33b4):** status **40**, single error: `Unable to find attribute
|
|
493
|
+
5625a0c7-… (title) in data type f675610e-… (AAT_SearchHit). Please ensure the data
|
|
494
|
+
model attributes are defined correctly.` The run REACHED document rendering and
|
|
495
|
+
iterated the list (so the typed list WAS populated) — it failed resolving the item
|
|
496
|
+
attribute against the **runtime's compiled model**.
|
|
497
|
+
- **Run B — FRESH model (all 6 attrs created up front) + FRESH doc (same `<%hits.attr%>`
|
|
498
|
+
table, one `<tr>`):** status **50**, 0 errors, produced `render_test_fresh.pdf`
|
|
499
|
+
(19,395 bytes). Extracted text = **all 3 rows, one per hit** (3 titles / 3 sources /
|
|
500
|
+
3 summaries) + the scalar searchTerm in the header. **Zero "Unknown".**
|
|
501
|
+
|
|
502
|
+
CONCLUSIONS (overturning Round 4 + the document/description.md "dead end"):
|
|
503
|
+
1. **List-bound repeating document tables DO render** — a single `<tr>` with
|
|
504
|
+
`<%hits.attr%>` placeholders expands to one row per list element. The repeating
|
|
505
|
+
syntax is exactly that (bind the list var's attributes in ONE row).
|
|
506
|
+
2. **A typed list CAN be fed without scripting** — a process variable typed as the
|
|
507
|
+
item model, `isList:true`, with `DefaultValue` = a JSON array of objects hydrates
|
|
508
|
+
into the typed list at runtime. (This also validates the "Process 2 list feed":
|
|
509
|
+
the same DefaultValue-JSON / one-mapping docMap with `destination.attribute=null`
|
|
510
|
+
binds the whole list to the doc's list variable.)
|
|
511
|
+
3. **ROOT CAUSE of AAT_CompanyBrief "Unknown" = the DATA MODEL (the user was right).**
|
|
512
|
+
The original `AAT_SearchHit`'s attributes are present in `GET /api/DataTypes/{id}`
|
|
513
|
+
and look byte-identical to a working model's, but they are **missing from the
|
|
514
|
+
runtime's COMPILED model** — the same stale-compiled-cache failure as learning #12
|
|
515
|
+
(attributes added via `POST/PUT /api/DataTypes/attribute/{rootId}` edit are not
|
|
516
|
+
recompiled). The document designer reads that same compiled model, so the cells
|
|
517
|
+
show "Unknown"; Generate Document throws "Unable to find attribute". A FRESH model
|
|
518
|
+
created with all attributes up front compiles correctly and renders.
|
|
519
|
+
**FIX:** recreate `AAT_SearchHit` from scratch with all attributes in the initial
|
|
520
|
+
`POST /api/DataTypes` (never rely on attribute-edit for attrs consumed by a
|
|
521
|
+
document), repoint `AAT_CompanyBrief.hits` at the new model id, re-map the table
|
|
522
|
+
cell `<%hits.attr%>` ids to the new attribute ids.
|
|
523
|
+
|
|
524
|
+
NOTE: `document/description.md` lines 43-64 ("repeating tables ... DO NOT work ... a
|
|
525
|
+
dead end") and PHASE4 Round 4 are now FALSIFIED and should be corrected — the pattern
|
|
526
|
+
works; the prior failure was the stale-compiled-model, not a platform limitation.
|
|
527
|
+
|
|
528
|
+
## Round 13 — ROOT CAUSE PINNED + LIVE FIX APPLIED: child model `parentIds` back-link drives the runtime compiled model
|
|
529
|
+
|
|
530
|
+
Round 12 proved the AAT_CompanyBrief "Unknown" / "Unable to find attribute" failure
|
|
531
|
+
is a DATA-MODEL defect (fresh model rendered, original threw). Round 13 isolated the
|
|
532
|
+
EXACT load-bearing field, fixed the LIVE model, and re-rendered the ORIGINAL model+doc
|
|
533
|
+
to green.
|
|
534
|
+
|
|
535
|
+
THE ONE FIELD THAT MATTERS: an item (child) model's `parentIds` must contain the id of
|
|
536
|
+
each parent data model whose `isList`+`isDataModel` attribute references it.
|
|
537
|
+
- Broken: `AAT_SearchHit.parentIds = []` (created standalone, never linked back).
|
|
538
|
+
- Working refs: a live process with `Details.parentIds=[Invoice]`, `url.parentIds` non-empty,
|
|
539
|
+
`technicalDataElectricity.parentIds` = 2 parents.
|
|
540
|
+
|
|
541
|
+
RED HERRING (do NOT chase again): the inlined `attributes[]` array on the PARENT's list
|
|
542
|
+
attribute (`AAT_SearchReport.hits.attributes`) being `[]` vs 14 on the working process. After the fix
|
|
543
|
+
the render is GREEN while that GET array is STILL `[]`. So the inlined-children array in
|
|
544
|
+
`GET /api/DataTypes/{parent}` is a lazy/volatile projection, NOT the cause. The runtime
|
|
545
|
+
compiled model is keyed off the child's `parentIds`, not that array.
|
|
546
|
+
|
|
547
|
+
HOW THE LINK IS WRITTEN (and how PUT fails):
|
|
548
|
+
- `PUT /api/DataTypes` (top-level) IGNORES `parentIds` — sending the full child body with
|
|
549
|
+
parentIds populated does nothing (and DataType edit only renames; it can't change attrs).
|
|
550
|
+
- `PUT /api/DataTypes/attribute` returns **401 Unauthorized** on the userpass session
|
|
551
|
+
(endpoint not permitted) — do not use it.
|
|
552
|
+
- `POST /api/DataTypes/attribute/{parentId}` (status 200) is the working path: adding the
|
|
553
|
+
list-of-model attribute on the PARENT makes the platform (a) write the child's
|
|
554
|
+
`parentIds` back-link AND (b) recompile the child into the runtime model. Side effect:
|
|
555
|
+
if an attribute of that name already exists, the server auto-renames the new one
|
|
556
|
+
(`hits` -> `hits_1`); delete the duplicate afterwards via
|
|
557
|
+
`DELETE /api/DataTypes/attribute/{parentId}/{dupAttrId}`. The original attribute id (and
|
|
558
|
+
thus all document cell references `<%hits.attr%>`) is preserved.
|
|
559
|
+
|
|
560
|
+
LIVE FIX APPLIED (AAT workspace 3fd85e9d-…):
|
|
561
|
+
1. `POST /api/DataTypes/attribute/cfa383c7-…(AAT_SearchReport)` with a `hits` list attr
|
|
562
|
+
pointing at `f675610e…(AAT_SearchHit)` → this set
|
|
563
|
+
`AAT_SearchHit.parentIds = ["cfa383c7-…"]` and recompiled the model.
|
|
564
|
+
2. Deleted the auto-created duplicate `hits_1` attribute; original `hits`
|
|
565
|
+
(id 0101e404-…) intact, so the doc's cell refs still resolve.
|
|
566
|
+
|
|
567
|
+
VERIFICATION (decisive, end-to-end, ORIGINAL model + ORIGINAL doc 503f33b4):
|
|
568
|
+
- Built a minimal Generate Document process (typed `hits` list fed by a process-var
|
|
569
|
+
DefaultValue JSON of 3 fake hits + 4 scalars), ran synchronous.
|
|
570
|
+
- Status **50**, `error: []`, body contains NEITHER "Unable to find attribute" NOR the
|
|
571
|
+
title-attr guid `5625a0c7`. (Round 12's run was status 40 with exactly that error.)
|
|
572
|
+
- Downloaded the rendered file via `GET /api/File/download` (path/varId/instanceId/
|
|
573
|
+
flowTemplateId in HEADERS, NOT query) — 3784 bytes text/html — containing all 3 hit
|
|
574
|
+
rows (3 titles, 3 displayLinks, 3 snippets) and **zero "Unknown"**.
|
|
575
|
+
- Scratch process deleted (404). No live AAT showcase resource other than the one
|
|
576
|
+
intended back-link was changed.
|
|
577
|
+
|
|
578
|
+
DTO BUILDER FIX (tools/procesio/dto/datatype/builder.py) — prevent regression:
|
|
579
|
+
The builder's `build()` hardcodes child `Content.ParentIds: []` and, when a list attribute
|
|
580
|
+
references an EXISTING model via `model:`, never writes the child's back-link — that is how
|
|
581
|
+
AAT_SearchHit regressed (created standalone, then referenced). Two-part fix:
|
|
582
|
+
1. PREFER inline children: a list-of-model should be authored as `attributes:` (inline
|
|
583
|
+
nested sub-model) so parent+child are created together in the SINGLE initial
|
|
584
|
+
`POST /api/DataTypes` — the platform writes parentIds at create time. Document `model:`
|
|
585
|
+
+ `isList` as the regression path.
|
|
586
|
+
2. For `model:`+`isList` against a PRE-EXISTING child (and in the `_edit` reconcile path),
|
|
587
|
+
after the parent list attribute is created via `POST /api/DataTypes/attribute/{parentId}`,
|
|
588
|
+
RE-FETCH the child and assert `parentId ∈ child.parentIds`; if absent, the link did not
|
|
589
|
+
take — re-issue the attribute POST (or fail loudly) rather than leaving a silently-broken
|
|
590
|
+
model. Never rely on top-level `PUT /api/DataTypes` to set parentIds (it is ignored), and
|
|
591
|
+
never use `PUT /api/DataTypes/attribute` (401 on userpass).
|
|
592
|
+
Add a manifest/runtime guard test: create parent with a list-of-model child, then assert the
|
|
593
|
+
child's `parentIds` contains the parent id (the structural invariant that makes documents
|
|
594
|
+
expand the list and resolve item-attribute cells).
|