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,384 @@
|
|
|
1
|
+
# Integration patterns (generalized)
|
|
2
|
+
|
|
3
|
+
Patterns learned from how a production PROCESIO workspace builds its integrations: webhook intake, ERP API
|
|
4
|
+
sync, SFTP document storage, deterministic and LLM document extraction, Excel intake, HTML→PDF contract
|
|
5
|
+
generation. The file contains no client, vendor, person or business values. Where a pattern names PROCESIO or
|
|
6
|
+
the OpenAI API, the named platform's behaviour *is* the knowledge.
|
|
7
|
+
|
|
8
|
+
Each entry has five parts: **Pattern** / **Problem** / **Mechanics** / **When** / **Pitfalls**.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## A. PROCESIO scripting mechanics
|
|
13
|
+
|
|
14
|
+
### A1. One marker per variable in a Node script
|
|
15
|
+
- **Problem**: PROCESIO substitutes `{{var}}` (stored as `<%var%>`) **textually** anywhere in the code. A marker
|
|
16
|
+
repeated in a comment injects the whole payload there too, which can be a multi-MB base64 or HTML, and breaks
|
|
17
|
+
the script.
|
|
18
|
+
- **Mechanics**: declare every input once, at the top (`const x = {{x}};`). In comments, refer to the variable
|
|
19
|
+
by plain name, never by marker syntax.
|
|
20
|
+
- **When**: always. It matters most for large payloads.
|
|
21
|
+
- **Pitfalls**: example snippets pasted into header comments are the usual cause.
|
|
22
|
+
|
|
23
|
+
### A2. Injection quoting by type
|
|
24
|
+
- **Problem**: the substituted text must be valid JS whatever the value is.
|
|
25
|
+
- **Mechanics**: JSON/object/list goes in **bare** (`const o = {{json}};`). String goes in quotes
|
|
26
|
+
(`"{{s}}"`). Large HTML goes in **backticks**, which is safe only if the template contains no backtick or `${`.
|
|
27
|
+
Booleans can arrive empty, and `const b = ;` is a syntax error, so normalize them through a `toBool()` that
|
|
28
|
+
accepts `true/"true"/1/"1"/"da"/"yes"`.
|
|
29
|
+
- **When**: every Node.
|
|
30
|
+
- **Pitfalls**: a string containing `"` or a newline breaks double quotes. Very large values (100 KB+) can
|
|
31
|
+
arrive **empty** through JS injection. Use native actions or SQL parameters for them.
|
|
32
|
+
|
|
33
|
+
### A3. Detect unreplaced placeholders
|
|
34
|
+
- **Problem**: when a variable is not bound, the script receives the literal `<%name%>` text, which is non-empty and so
|
|
35
|
+
passes `if (x)` checks.
|
|
36
|
+
- **Mechanics**: `isPlaceholder = v => typeof v === "string" && /^<%[^%]*%>$/.test(v.trim())`. Treat a match
|
|
37
|
+
as empty and report "marker not replaced" in the error envelope.
|
|
38
|
+
- **When**: optional inputs and reusable scripts.
|
|
39
|
+
- **Pitfalls**: an optional input referenced by marker but never declared as a process variable stays a literal
|
|
40
|
+
forever.
|
|
41
|
+
|
|
42
|
+
### A4. Uniform result envelope + boolean extractor
|
|
43
|
+
- **Problem**: a Node's JS error does not take an error port. The action "succeeds" and writes the error to its
|
|
44
|
+
Error output, so downstream Decisionals see garbage.
|
|
45
|
+
- **Mechanics**: every script returns `{e_ok, e_notOk, errorMessage, …payload}` from a pre-built skeleton,
|
|
46
|
+
uses a `fail(msg)` helper and never throws. A two-line follow-up Node (or Extract Objects) pulls `e_ok` as a
|
|
47
|
+
Boolean for the Decisional. Also bind each Node's Error output and branch on it.
|
|
48
|
+
- **When**: every parsing or validation Node.
|
|
49
|
+
- **Pitfalls**: returning `null` on failure. Callers then cannot tell "no data" from "crashed".
|
|
50
|
+
|
|
51
|
+
### A5. Defensive input normalizer
|
|
52
|
+
- **Problem**: the same logical value reaches a script as an array, an object, a JSON string, a double-serialized
|
|
53
|
+
string or a `{rows|data|result}` wrapper, depending on the upstream action (SQL list, Extract Objects, subprocess
|
|
54
|
+
output).
|
|
55
|
+
- **Mechanics**: `safeJsonParse` in a loop (up to 3 levels), unwrap one-element outer arrays, walk known wrapper
|
|
56
|
+
keys, and read fields with multi-casing fallbacks (`Text|text`, `Position.Xleft|left|x`).
|
|
57
|
+
- **When**: any script that consumes another action's output.
|
|
58
|
+
- **Pitfalls**: over-lenient parsing can hide an upstream contract change. Log a warning when a fallback path
|
|
59
|
+
is used.
|
|
60
|
+
|
|
61
|
+
### A6. ISO dates before DateTime variables
|
|
62
|
+
- **Problem**: PROCESIO does not parse `dd.MM.yyyy`. Assigning it to a DateTime variable yields **null**, with
|
|
63
|
+
no error.
|
|
64
|
+
- **Mechanics**: convert to `yyyy-MM-dd` (or full ISO) in code before mapping. For comparisons, parse to
|
|
65
|
+
`Date.UTC(...)` millis with one shared function, so server timezone does not matter. Build interval
|
|
66
|
+
bounds as 00:00:00.000Z / 23:59:59.999Z.
|
|
67
|
+
- **When**: any date from documents, Excel or forms.
|
|
68
|
+
- **Pitfalls**: injecting a DateTime variable straight into JS gives an unpredictable string format. Map it to a
|
|
69
|
+
String variable first.
|
|
70
|
+
|
|
71
|
+
### A7. HTML feedback cards as output strings
|
|
72
|
+
- **Problem**: forms need rich, consistent inline feedback without a front-end code change.
|
|
73
|
+
- **Mechanics**: the process returns an HTML string (inline-styled card with icon, title and message) in an output
|
|
74
|
+
variable bound to a form HTML element. Keep a fixed palette (info / warning / error) and HTML-escape every
|
|
75
|
+
dynamic value.
|
|
76
|
+
- **When**: validation results, extraction warnings, empty states, previews (e.g. an inline SVG timeline).
|
|
77
|
+
- **Pitfalls**: unescaped model or user text becomes markup (see D6). A truncated card literal renders broken.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## B. Inbound webhook intake
|
|
82
|
+
|
|
83
|
+
### B1. Webhook variable triplet + API-key subprocess
|
|
84
|
+
- **Problem**: a webhook needs body, headers and query params, plus a reusable authentication gate.
|
|
85
|
+
- **Mechanics**: declare input variables `<name>` (typed body), `<name>_header` (JSON), `<name>_params` (JSON).
|
|
86
|
+
Headers arrive as **arrays** (`headers["X-Api-Key"][0]`), with a case-sensitive key lookup. A reusable
|
|
87
|
+
"check key" subprocess returns `isValid`, and the parent throws a fixed message when it is false. Every later stage also
|
|
88
|
+
returns a Boolean the parent gates on (`isPayloadOk`, `isDbOk`, `isFileOk`), and each gate has its own
|
|
89
|
+
Throw message.
|
|
90
|
+
- **When**: machine-to-machine intake.
|
|
91
|
+
- **Pitfalls**: keep the expected key in a credential or hash it, never as plaintext in an app table. A process
|
|
92
|
+
can lose its webhook binding and still look complete in the designer, so check the flow's webhook binding
|
|
93
|
+
and not only the variable naming.
|
|
94
|
+
|
|
95
|
+
### B2. Typed file + reference body, upsert by reference
|
|
96
|
+
- **Problem**: the sender re-posts corrected documents for the same business object.
|
|
97
|
+
- **Mechanics**: the body has a File attribute and a reference id. `SELECT` the master row by reference: a new one
|
|
98
|
+
goes to the INSERT subprocess, an existing one to the UPDATE subprocess (delete children, reinsert, update master
|
|
99
|
+
dates). Stamp the run id (`ProcessInfo`) into the master row for traceability.
|
|
100
|
+
- **When**: idempotent document intake.
|
|
101
|
+
- **Pitfalls**: do the delete-and-reinsert in one stored procedure transaction. Write DB and file store in an
|
|
102
|
+
order you can compensate (store the file first, then commit the DB, or record both states).
|
|
103
|
+
|
|
104
|
+
### B3. Bulk JSON to a stored procedure
|
|
105
|
+
- **Problem**: row-by-row INSERTs from a For Each are slow, non-atomic and injection-prone.
|
|
106
|
+
- **Mechanics**: build the full JSON in one Node and run `EXEC schema.usp_Import @payload = <json>`. The procedure
|
|
107
|
+
shreds it with `OPENJSON` inside a transaction.
|
|
108
|
+
- **When**: tabular payloads (tariff grids, price tables, lookup lists).
|
|
109
|
+
- **Pitfalls**: bind `@payload` as a parameter. Inline `N'{{json}}'` breaks on the first apostrophe.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## C. Outbound REST/ERP integration
|
|
114
|
+
|
|
115
|
+
### C1. Token from store + refresh subprocess
|
|
116
|
+
- **Problem**: the ERP issues session tokens from a username/password login.
|
|
117
|
+
- **Mechanics**: `get_token` returns the cached token object. `refresh_token` logs in
|
|
118
|
+
(`x-www-form-urlencoded username/password`), extracts the token object and replaces the cache. Calls send the token
|
|
119
|
+
in whatever header the API wants (possibly a custom header, not `Authorization`).
|
|
120
|
+
- **When**: session-token APIs without OAuth.
|
|
121
|
+
- **Pitfalls**: call refresh **on 401/expiry** automatically. A refresh that nothing calls makes every expiry a
|
|
122
|
+
business failure. Login secrets belong in a credential, not in a DB table.
|
|
123
|
+
|
|
124
|
+
### C2. Base64-wrapped JSON body
|
|
125
|
+
- **Problem**: some ERPs expect `{"data":"<base64 of the JSON payload>"}`.
|
|
126
|
+
- **Mechanics**: typed data model (Map Data) → `Object To String` → `String To Base64` → raw JSON body
|
|
127
|
+
template `{"data":"<%b64%>"}`.
|
|
128
|
+
- **When**: only when the target API demands it.
|
|
129
|
+
- **Pitfalls**: map the body as a typed data model, not by string concatenation, so a field rename shows up in
|
|
130
|
+
the designer.
|
|
131
|
+
|
|
132
|
+
### C3. Response envelope → Boolean + id + message
|
|
133
|
+
- **Problem**: HTTP 200 does not mean the business write succeeded.
|
|
134
|
+
- **Mechanics**: three tiny Nodes on the response. (1) `ok = StatusCode===200 && StatusMessage==="OK"`.
|
|
135
|
+
(2) id = `Result.status[0].<id_field>`, throwing if missing. (3) error text = `Result.Message` or a
|
|
136
|
+
generic localized fallback. Branch on (1).
|
|
137
|
+
- **When**: every write call.
|
|
138
|
+
- **Pitfalls**: also bind the **HTTP status code** of the Call API and wire its error port. Otherwise a
|
|
139
|
+
timeout or 5xx looks the same as a business reject.
|
|
140
|
+
|
|
141
|
+
### C4. Numbered step chain with lookup-first idempotency
|
|
142
|
+
- **Problem**: creating a customer in an ERP takes a dependency chain (partner → site/meter → contract →
|
|
143
|
+
site-on-contract → price lines → billing settings), and a re-run must not duplicate anything.
|
|
144
|
+
- **Mechanics**: an orchestrator calls numbered subprocesses `0..N`. Each gets the request JSON + token + the ids
|
|
145
|
+
from earlier steps and returns `(id, ok)`. Inside each step: `GET by business key` → if found, reuse and
|
|
146
|
+
mirror locally; else `POST` → extract the new id. After each step, a Decisional goes to the next step or
|
|
147
|
+
to a Throw.
|
|
148
|
+
- **When**: multi-entity provisioning in any external system.
|
|
149
|
+
- **Pitfalls**: every create step needs a lookup, and one missing step duplicates on retry. When the check
|
|
150
|
+
reads only list element `[0]`, it must match the business key rather than trust position.
|
|
151
|
+
|
|
152
|
+
### C5. Progress row per run
|
|
153
|
+
- **Problem**: after a failure at step k you need to know what exists remotely and resume.
|
|
154
|
+
- **Mechanics**: at start, insert one row (run id, business key, `step='[0/N]'`, status). Each step updates
|
|
155
|
+
`step`, `status` (`<step>_ok` | `error`) and a per-step meta column (local mirror GUID or error text). Mirror
|
|
156
|
+
tables hold the external ids.
|
|
157
|
+
- **When**: any multi-step external sync.
|
|
158
|
+
- **Pitfalls**: write it **with parameters**, because error text from the external system contains quotes. Make
|
|
159
|
+
the orchestrator read the row and skip completed steps; otherwise it's only a log.
|
|
160
|
+
|
|
161
|
+
### C6. One credential per environment, switched centrally
|
|
162
|
+
- **Problem**: nodes bound to a TEST credential one by one make going to PROD a manual re-bind of every node.
|
|
163
|
+
- **Mechanics**: route all calls through a small set of wrapper subprocesses and switch the credential there
|
|
164
|
+
(or by an env parameter), or keep separate flow copies per env produced by an export/import step.
|
|
165
|
+
- **When**: from the first call onward.
|
|
166
|
+
- **Pitfalls**: an unused PROD credential lying next to TEST-bound nodes is a sign the switch was never
|
|
167
|
+
designed.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## D. Document extraction
|
|
172
|
+
|
|
173
|
+
### D1. Deterministic PDF table parsing from word geometry
|
|
174
|
+
- **Problem**: issuer-generated PDFs (price grids) have stable layouts but no text structure, and LLMs misplace
|
|
175
|
+
numbers in wide tables.
|
|
176
|
+
- **Mechanics**: `Extract Text` gives pages with `Words[]` and positions. Rebuild visual rows by **clustering
|
|
177
|
+
on the vertical midpoint** (tolerance about 1 unit), or by the engine's row index when it exists. Anchor on a
|
|
178
|
+
header word, take the rows below it, and keep "data rows" = text label left of the first number + at least K
|
|
179
|
+
numbers. Return `{e_ok, …rows}`.
|
|
180
|
+
- **When**: machine-generated documents from a known issuer.
|
|
181
|
+
- **Pitfalls**: diacritics differ, so match on NFD-folded lowercase text. Headers wrap across lines, so anchor on
|
|
182
|
+
one distinctive word, not the full title. Separators such as an en-dash can fall into another row cluster, so
|
|
183
|
+
make them optional in regexes and re-emit a canonical one.
|
|
184
|
+
|
|
185
|
+
### D2. Ragged tables: map numbers by X to column centres
|
|
186
|
+
- **Problem**: rows with missing cells shift values left under index mapping.
|
|
187
|
+
- **Mechanics**: take the row with the most numbers as the template, whose X positions are the column centres. Assign
|
|
188
|
+
each number to the nearest centre and leave missing columns as `null`. Count only numbers inside the table's
|
|
189
|
+
X band, which keeps out sidebar text (addresses, ids) on the same line.
|
|
190
|
+
- **When**: any table where cells can be empty.
|
|
191
|
+
- **Pitfalls**: this needs at least one complete row. Recalibrate the X band when the layout changes, and keep
|
|
192
|
+
it as a named constant.
|
|
193
|
+
|
|
194
|
+
### D3. Split stacked tables by the largest vertical gap
|
|
195
|
+
- **Problem**: two tables with identical columns sit on one page (e.g. two tax regimes).
|
|
196
|
+
- **Mechanics**: collect all data rows, sort them by Y and split at the largest gap between consecutive rows. The
|
|
197
|
+
upper band is table 1, the lower band table 2.
|
|
198
|
+
- **When**: repeated tables with no distinct header between them.
|
|
199
|
+
- **Pitfalls**: exclude summary rows (such as a "total" or subsystem row) before measuring the gaps.
|
|
200
|
+
|
|
201
|
+
### D4. Anchored field with "first match that has data" iteration
|
|
202
|
+
- **Problem**: a keyword (e.g. "validity") appears several times, and only one occurrence carries the value.
|
|
203
|
+
- **Mechanics**: iterate **all** rows containing the anchor and take the first whose own line or next 1–2 lines
|
|
204
|
+
match the value regex (e.g. a date range).
|
|
205
|
+
- **When**: legal and boilerplate-heavy documents.
|
|
206
|
+
- **Pitfalls**: "first occurrence" logic that worked on one document variant silently picks boilerplate on
|
|
207
|
+
another.
|
|
208
|
+
|
|
209
|
+
### D5. Classify by content score, not file name
|
|
210
|
+
- **Problem**: deciding the document variant from the uploaded file name breaks when users rename files.
|
|
211
|
+
- **Mechanics**: normalize the full text, count hits from per-class phrase lists, and require that the winner
|
|
212
|
+
beats the runner-up **and** reaches a minimum number of hits. Otherwise return "unknown".
|
|
213
|
+
- **When**: routing to per-variant parsers.
|
|
214
|
+
- **Pitfalls**: don't hard-code dimensions the text can't tell you (e.g. customer type). Take them from the
|
|
215
|
+
form or the data instead.
|
|
216
|
+
|
|
217
|
+
### D6. LLM OCR with a forced strict tool call
|
|
218
|
+
- **Problem**: heterogeneous scans and photos (ID documents, registration certificates, utility bills) need
|
|
219
|
+
typed fields, not prose.
|
|
220
|
+
- **Mechanics** (OpenAI Chat Completions): one `tools[]` function with `strict: true`, `additionalProperties:
|
|
221
|
+
false`, **every field required but nullable**, `enum` for classifications and `pattern` for formats (13-digit id,
|
|
222
|
+
ISO date, 6-digit postcode). `tool_choice` is pinned to that function. PDFs go as a `file` content part
|
|
223
|
+
(`data:application/pdf;base64,…`), images as `image_url` with a data URI and `detail: high`, chosen by MIME.
|
|
224
|
+
The result comes from `$.choices[0].message.tool_calls[0].function.arguments`.
|
|
225
|
+
- **Prompt skeleton**: role + "analyze ONLY the provided file" + "call only the function, never free text"
|
|
226
|
+
+ a **document-type gate** (detected type, `warning_status`, fixed warning text, all fields null for
|
|
227
|
+
a wrong document) + a **cross-check against the user's form selection** + "extract only visible values; don't
|
|
228
|
+
invent, enrich, search or infer; null when not confidently readable" + output casing/diacritics rules
|
|
229
|
+
with examples + date conversion rules + a per-field "where it is on the document / what to strip" list +
|
|
230
|
+
placeholder values ("N/A", "-", "no name") → null + "unit conversion of a visible value is not inference".
|
|
231
|
+
- **When**: user uploads of semi-structured documents.
|
|
232
|
+
- **Pitfalls**: keep the PDF and image prompt variants **in sync**. Copy-paste drift (a PDF prompt that says "treat
|
|
233
|
+
as image", rejection rules present only in one variant) is common. Always **branch on the model's warning
|
|
234
|
+
flag**. **Escape** model text before putting it in HTML (a document can carry prompt-injection text). Keep the
|
|
235
|
+
model name in config.
|
|
236
|
+
|
|
237
|
+
### D7. Deterministic post-normalization against dictionaries
|
|
238
|
+
- **Problem**: even strict schemas return spelling variants (county names, abbreviations, legal forms).
|
|
239
|
+
- **Mechanics**: fold diacritics and punctuation into a key, then look it up in (a) canonical names, (b) the same
|
|
240
|
+
without spaces, (c) short codes. Special cases get their own rule (a capital city that needs a district). Return
|
|
241
|
+
exactly the DB dictionary value (including odd spacing, if the DB has it) or `""`. When one field is derived
|
|
242
|
+
from another (name without legal-form suffix), strip **only** the detected form, from the end, and from the start
|
|
243
|
+
for forms that prefix the name. Protect lookalikes (Roman numerals).
|
|
244
|
+
- **When**: any AI or OCR output that feeds selectors or DB lookups.
|
|
245
|
+
- **Pitfalls**: the dictionary has to match the form's selector values exactly, or the selector shows empty.
|
|
246
|
+
|
|
247
|
+
### D8. Deterministic derivations with a recorded source
|
|
248
|
+
- **Problem**: a value (e.g. annual consumption) is sometimes printed and sometimes has to be computed from
|
|
249
|
+
other visible data.
|
|
250
|
+
- **Mechanics**: an ordered fallback chain (printed → period extrapolation → volume × conversion factor →
|
|
251
|
+
12-month history × factor). The result is written with a `*_source` field naming the branch used. A value that
|
|
252
|
+
landed in the wrong unit field is detected by the unit in its text and moved.
|
|
253
|
+
- **When**: derived metrics from extracted data.
|
|
254
|
+
- **Pitfalls**: never let the LLM do the arithmetic. Keep derivation in code, where it can be audited.
|
|
255
|
+
|
|
256
|
+
### D9. Pre-flight file validator subprocess
|
|
257
|
+
- **Problem**: every extractor needs the same file checks and user messages.
|
|
258
|
+
- **Mechanics**: subprocess `(file) → (base64, isValid, message)`: present? MIME in an allow-list? size ≤
|
|
259
|
+
limit? Return localized messages. The parent wraps the message in its HTML card.
|
|
260
|
+
- **When**: before any paid or slow API call on a user file.
|
|
261
|
+
- **Pitfalls**: the MIME comes from the upload metadata, so a renamed file can lie. The model's
|
|
262
|
+
document-type gate is the second line of defence.
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## E. Files and SFTP
|
|
267
|
+
|
|
268
|
+
### E1. One folder per entity, fetch-and-normalize
|
|
269
|
+
- **Problem**: per-request documents must be retrievable later by a key, in a viewable format.
|
|
270
|
+
- **Mechanics**: path `/<DocType>/<entity-guid>/<original file name>`. Upload = create folder → upload. Fetch
|
|
271
|
+
= list files → pick → download → convert to PDF (a shared `file_to_pdf` subprocess) so viewers get one
|
|
272
|
+
format. SFTP listings may return paths with the chroot prefix (e.g. `/Home/...`) while actions take
|
|
273
|
+
chroot-relative paths, so compare accordingly.
|
|
274
|
+
- **When**: attachments for workflow records.
|
|
275
|
+
- **Pitfalls**: "pick" must not be `list[0]`. Choose by exact name or newest timestamp, or clear the folder on
|
|
276
|
+
replace. Check the create-folder and upload results.
|
|
277
|
+
|
|
278
|
+
### E2. Replace-in-place upload
|
|
279
|
+
- **Problem**: re-submitting a document must replace, not accumulate.
|
|
280
|
+
- **Mechanics**: list the folder; if it exists → delete the existing files → upload; else create → upload.
|
|
281
|
+
Compute the success flag from the booleans of the branch that actually ran.
|
|
282
|
+
- **When**: single-current-document folders.
|
|
283
|
+
- **Pitfalls**: delete **all** files, not only the first. An existing but empty folder must not crash the
|
|
284
|
+
"get first file name" step.
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## F. Excel intake
|
|
289
|
+
|
|
290
|
+
### F1. Template gate + header row + data window
|
|
291
|
+
- **Problem**: user-filled Excel templates drift (renamed sheets, wrong tab filled).
|
|
292
|
+
- **Mechanics**: check that the sheet names match an exact ordered list, or return an "incorrect template" card. Header row
|
|
293
|
+
at a fixed index, data from a fixed start row to `Get Last Used Row`, read range per sheet. Then validate:
|
|
294
|
+
exactly one data tab is filled, and it must match the energy/product type selected in the form.
|
|
295
|
+
- **When**: bulk intake of line items (sites, meters, products).
|
|
296
|
+
- **Pitfalls**: Read Range returns column letters as keys, so turn "first row = header" into objects before
|
|
297
|
+
use.
|
|
298
|
+
|
|
299
|
+
### F2. Validate rows against reference data with the consumer's own matching rules
|
|
300
|
+
- **Problem**: rows that pass intake but have no match downstream (e.g. operator/category with no tariff) produce
|
|
301
|
+
empty cells in generated documents.
|
|
302
|
+
- **Mechanics**: the validator uses **exactly the same** normalization and alias rules as the document
|
|
303
|
+
generator. It returns `{e_ok, errors[{row, code, message, …}], warnings[], pairs[], summary, html,
|
|
304
|
+
html_warnings}` with a closed list of error codes. Errors block, warnings don't.
|
|
305
|
+
- **When**: before any step that consumes the rows.
|
|
306
|
+
- **Pitfalls**: two copies of the matching rules drift apart. Share them through the build (G2).
|
|
307
|
+
|
|
308
|
+
### F3. Full refresh of a lookup table
|
|
309
|
+
- **Problem**: reference lists (suppliers, operators) are maintained in Excel.
|
|
310
|
+
- **Mechanics**: read → header-to-objects → replace the table contents.
|
|
311
|
+
- **When**: admin-triggered list updates.
|
|
312
|
+
- **Pitfalls**: DELETE-then-INSERT outside a transaction leaves an empty table on failure. Stage into a temp
|
|
313
|
+
table and swap in one procedure, with parameters.
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## G. Document generation
|
|
318
|
+
|
|
319
|
+
### G1. Slot-based HTML template filling
|
|
320
|
+
- **Problem**: contracts have many optional fields, and blanks must stay visibly "to be filled".
|
|
321
|
+
- **Mechanics**: the template marks each fillable segment as `<span class="hl" data-k="KEY" data-b="____">…@@…</span>`.
|
|
322
|
+
If KEY has a value, the span is removed and `@@` becomes the escaped value; if not, the highlighted blank stays.
|
|
323
|
+
Fixed values are `{{key|default}}` tokens. Bilingual keys `x.en` fall back to `x`. Repeating tables
|
|
324
|
+
(sites, tariffs, signers) are generated for N rows. HTML → PDF happens through a Generate Document template
|
|
325
|
+
that takes one HTML input.
|
|
326
|
+
- **When**: legal and commercial documents with partial data at generation time.
|
|
327
|
+
- **Pitfalls**: a date that is only known at signing stays blank until the signing step, and must not be
|
|
328
|
+
filled from another date (e.g. supply start).
|
|
329
|
+
|
|
330
|
+
### G2. Generated scripts, edited outside the designer
|
|
331
|
+
- **Problem**: per-variant generator scripts (person type × product × language) run to thousands of lines and
|
|
332
|
+
share most code.
|
|
333
|
+
- **Mechanics**: keep templates and runtime in a repo, and have a build script emit one Node script per variant
|
|
334
|
+
with a version string in its header. Paste or deploy the output, and never hand-edit it in the designer.
|
|
335
|
+
- **When**: more than two near-identical large scripts.
|
|
336
|
+
- **Pitfalls**: say in the process description where the source lives. Hand-maintained near copies (e.g. with
|
|
337
|
+
and without a signature) drift.
|
|
338
|
+
|
|
339
|
+
### G3. Signature images anchored in HTML
|
|
340
|
+
- **Problem**: signatures from several parties must land in the right cell of repeated signature blocks.
|
|
341
|
+
- **Mechanics**: clean each base64 (strip the `data:` prefix and whitespace, check the alphabet and a minimum
|
|
342
|
+
length, else skip). Insert an `<img>` with a max size inside a block that **reserves real height** so it does not
|
|
343
|
+
overlap the next signer. Use a function replacer so `$` in the base64 is not treated as a pattern.
|
|
344
|
+
- **When**: multi-party signing.
|
|
345
|
+
- **Pitfalls**: anchor on **role markers in the template**, not on people's names in code, and load signers
|
|
346
|
+
and images from a signers table. Named anchors and per-person file paths break when a signer changes.
|
|
347
|
+
|
|
348
|
+
### G4. Stored-procedure read envelope
|
|
349
|
+
- **Problem**: rebuilding a complex request object from many tables in every process.
|
|
350
|
+
- **Mechanics**: a procedure always returns **one row** `e_ok | error_code | error_message | sql_error_number |
|
|
351
|
+
sql_error_line | sql_error_procedure | <object>_json`. One Node parses it into a normalized object with a
|
|
352
|
+
guaranteed skeleton (every key present, null or `[]` when absent) plus derived views (unified client,
|
|
353
|
+
zipped per-site records, totals, formatted dates, warnings).
|
|
354
|
+
- **When**: any process that reads an aggregate.
|
|
355
|
+
- **Pitfalls**: the Node must never return null. When parsing fails it returns the same skeleton with the error
|
|
356
|
+
set.
|
|
357
|
+
|
|
358
|
+
### G5. Don't rename primary keys in place
|
|
359
|
+
- **Problem**: assigning a final document number by `UPDATE … SET id = <new number>` breaks references,
|
|
360
|
+
and follow-up updates keyed by the new id that run before the rename silently match nothing.
|
|
361
|
+
- **Mechanics**: keep a surrogate id and put the business number in its own unique column. When a rename
|
|
362
|
+
can't be avoided, run it first, inside the same transaction as the dependent updates.
|
|
363
|
+
- **When**: late-assigned business numbers.
|
|
364
|
+
- **Pitfalls**: check execution order on every branch. The "renumber" branch is the least tested.
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## H. Cross-cutting rules
|
|
369
|
+
|
|
370
|
+
- **H1. SQL values are parameters.** Inline `N'{{value}}'` interpolation breaks or allows injection on the first
|
|
371
|
+
quote, and HTML templates, error messages from external systems, OCR'd names and Excel cells all contain
|
|
372
|
+
quotes. Use parameters or a JSON `@payload` to a procedure.
|
|
373
|
+
- **H2. Secrets live in credentials.** App tables holding API keys, tokens or passwords are readable by anything that
|
|
374
|
+
holds the DB credential.
|
|
375
|
+
- **H3. Error ports on every external action** (Call API, SFTP, SQL, AI) + retries with backoff for
|
|
376
|
+
transient errors + messages that name the step and the external key. A generic "An exception occurred" Throw
|
|
377
|
+
gives an operator nothing to act on.
|
|
378
|
+
- **H4. Config in one place**: model names, base URLs, form ids, document template ids, folder roots, enum ids.
|
|
379
|
+
- **H5. Retire explicitly.** Mark superseded flows `(LEGACY)` / `(PROTOTYPE)`, deactivate them and remove their
|
|
380
|
+
bindings. Check form bindings for process ids that no longer exist.
|
|
381
|
+
- **H6. Personal data exports** (national ids, phones, emails) must be filtered, access-controlled and not
|
|
382
|
+
triggered on page load.
|
|
383
|
+
- **H7. Name carefully.** Names become tables, columns and variables. Typos (a letter swap in a class code, a
|
|
384
|
+
misspelled word) propagate into schemas and mislead every later reader.
|