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,229 @@
|
|
|
1
|
+
"""Offline structural reader actions over a .procesio export / live flow DTO.
|
|
2
|
+
|
|
3
|
+
`read-flow-graph` returns the canonical node/edge graph model (the substrate the canvas
|
|
4
|
+
layout tool and inspect-flow build on). No network; reads a file, '-' (stdin), or a raw
|
|
5
|
+
JSON string.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import json
|
|
11
|
+
import sys
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
from tools.procesio.actiondef import ActionDef
|
|
15
|
+
from tools.procesio import errors
|
|
16
|
+
from tools.procesio.flowmodel import read_bundle, read_flow
|
|
17
|
+
from tools.procesio.flowmodel.inspect import inspect as _inspect
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _load_in(value: str) -> str:
|
|
21
|
+
"""Resolve --in to a JSON string: '-' = stdin, an existing path = file, else literal."""
|
|
22
|
+
if value == "-":
|
|
23
|
+
return sys.stdin.read()
|
|
24
|
+
try:
|
|
25
|
+
p = Path(value)
|
|
26
|
+
if p.exists() and p.is_file():
|
|
27
|
+
return p.read_text(encoding="utf-8")
|
|
28
|
+
except OSError:
|
|
29
|
+
pass
|
|
30
|
+
return value
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _in_args(p: argparse.ArgumentParser) -> None:
|
|
34
|
+
p.add_argument("--in", dest="in_path", required=True,
|
|
35
|
+
help=".procesio export or flow JSON: a path, '-' for stdin, or raw JSON")
|
|
36
|
+
p.add_argument("--flow-id", dest="flow_id",
|
|
37
|
+
help="which flow when the bundle has more than one")
|
|
38
|
+
p.add_argument("--resource-map", dest="resource_map", action="store_true",
|
|
39
|
+
help="emit every flow + the cross-process (process→process) edge list")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def read_flow_graph(args) -> dict:
|
|
43
|
+
raw = _load_in(args.in_path)
|
|
44
|
+
try:
|
|
45
|
+
obj = json.loads(raw)
|
|
46
|
+
except json.JSONDecodeError as e:
|
|
47
|
+
raise errors.UsageError(f"--in is not valid JSON: {e}")
|
|
48
|
+
if args.resource_map:
|
|
49
|
+
return {"result": read_bundle(obj)}
|
|
50
|
+
return {"result": read_flow(obj, flow_id=args.flow_id).to_dict()}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _inspect_args(p: argparse.ArgumentParser) -> None:
|
|
54
|
+
p.add_argument("--in", dest="in_path", required=True,
|
|
55
|
+
help=".procesio export or flow JSON: a path, '-' for stdin, or raw JSON")
|
|
56
|
+
p.add_argument("--flow-id", dest="flow_id",
|
|
57
|
+
help="which flow when the bundle has more than one")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def inspect_flow(args) -> dict:
|
|
61
|
+
raw = _load_in(args.in_path)
|
|
62
|
+
try:
|
|
63
|
+
obj = json.loads(raw)
|
|
64
|
+
except json.JSONDecodeError as e:
|
|
65
|
+
raise errors.UsageError(f"--in is not valid JSON: {e}")
|
|
66
|
+
return {"result": _inspect(obj, flow_id=args.flow_id)}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _digest_args(p: argparse.ArgumentParser) -> None:
|
|
70
|
+
p.add_argument("--in", dest="in_path", required=True,
|
|
71
|
+
help="a flow JSON / API envelope / .procesio bundle file, OR a directory of them "
|
|
72
|
+
"(every *.json is read; subprocess targets resolve to titles across the set)")
|
|
73
|
+
p.add_argument("--out", dest="out_dir",
|
|
74
|
+
help="write one <slug>.md per flow + INDEX.md here; omit to return the Markdown inline")
|
|
75
|
+
p.add_argument("--names", dest="names",
|
|
76
|
+
help="optional JSON file {guid: display name} for ids outside the flows "
|
|
77
|
+
"(credentials, forms, data models)")
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _slug(title: str) -> str:
|
|
81
|
+
import re as _re
|
|
82
|
+
s = _re.sub(r"[^A-Za-z0-9]+", "-", title).strip("-").lower()
|
|
83
|
+
return s[:80] or "untitled"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def flow_digest(args) -> dict:
|
|
87
|
+
from tools.procesio.flowmodel import digest as _d
|
|
88
|
+
src = Path(args.in_path)
|
|
89
|
+
paths = sorted(src.glob("*.json")) if src.is_dir() else [src]
|
|
90
|
+
if not paths:
|
|
91
|
+
raise errors.UsageError(f"--in {args.in_path}: no .json files")
|
|
92
|
+
flows = []
|
|
93
|
+
for p in paths:
|
|
94
|
+
try:
|
|
95
|
+
flows += _d.unwrap(json.loads(p.read_text(encoding="utf-8")))
|
|
96
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
97
|
+
raise errors.UsageError(f"{p}: {e}")
|
|
98
|
+
names = {f.get("id"): _d._title(f) for f in flows if f.get("id")}
|
|
99
|
+
if args.names:
|
|
100
|
+
try:
|
|
101
|
+
names.update(json.loads(Path(args.names).read_text(encoding="utf-8")))
|
|
102
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
103
|
+
raise errors.UsageError(f"--names: {e}")
|
|
104
|
+
if not args.out_dir:
|
|
105
|
+
return {"result": {"count": len(flows),
|
|
106
|
+
"flows": [{"id": f.get("id"), "title": _d._title(f),
|
|
107
|
+
"markdown": _d.render(f, names)} for f in flows]}}
|
|
108
|
+
out = Path(args.out_dir)
|
|
109
|
+
out.mkdir(parents=True, exist_ok=True)
|
|
110
|
+
index = ["# Process index", "", "| process | nodes | calls |", "|---|---|---|"]
|
|
111
|
+
written = []
|
|
112
|
+
for f in sorted(flows, key=_d._title):
|
|
113
|
+
slug = _slug(_d._title(f)) + "-" + str(f.get("id", ""))[:8]
|
|
114
|
+
(out / f"{slug}.md").write_text(_d.render(f, names), encoding="utf-8")
|
|
115
|
+
called = [names[g] for g in _d.calls(f) if g in names and g != f.get("id")
|
|
116
|
+
and g in {x.get("id") for x in flows}]
|
|
117
|
+
index.append(f"| [{_d._title(f)}]({slug}.md) | {len(f.get('actions') or [])} | "
|
|
118
|
+
f"{'; '.join(sorted(set(called)))} |")
|
|
119
|
+
written.append(f"{slug}.md")
|
|
120
|
+
(out / "INDEX.md").write_text("\n".join(index) + "\n", encoding="utf-8")
|
|
121
|
+
return {"result": {"count": len(flows), "out": str(out), "files": written + ["INDEX.md"]}}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _form_digest_args(p: argparse.ArgumentParser) -> None:
|
|
125
|
+
p.add_argument("--in", dest="in_path", required=True,
|
|
126
|
+
help="a form template JSON (form-get output) or a directory of them; a sibling "
|
|
127
|
+
"<id>.code.json (form-get-code output) adds the global CSS/JS")
|
|
128
|
+
p.add_argument("--processes", dest="processes",
|
|
129
|
+
help="directory of process JSON (API envelope / flow) to name RUN_PROCESS targets "
|
|
130
|
+
"and their variables")
|
|
131
|
+
p.add_argument("--out", dest="out_dir",
|
|
132
|
+
help="write <slug>.md + <slug>/ (scripts, global form.js/form.css) per form and "
|
|
133
|
+
"FORM-PROCESS-MAP.md here; omit to return the Markdown inline")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def form_digest(args) -> dict:
|
|
137
|
+
from tools.procesio.flowmodel import digest as _d
|
|
138
|
+
from tools.procesio.flowmodel import formdigest as _fd
|
|
139
|
+
src = Path(args.in_path)
|
|
140
|
+
paths = ([p for p in sorted(src.glob("*.json")) if not p.name.endswith(".code.json")]
|
|
141
|
+
if src.is_dir() else [src])
|
|
142
|
+
if not paths:
|
|
143
|
+
raise errors.UsageError(f"--in {args.in_path}: no form .json files")
|
|
144
|
+
processes: dict = {}
|
|
145
|
+
if args.processes:
|
|
146
|
+
for p in sorted(Path(args.processes).glob("*.json")):
|
|
147
|
+
try:
|
|
148
|
+
for f in _d.unwrap(json.loads(p.read_text(encoding="utf-8"))):
|
|
149
|
+
if f.get("id"):
|
|
150
|
+
processes[f["id"]] = f
|
|
151
|
+
except (json.JSONDecodeError, OSError):
|
|
152
|
+
continue
|
|
153
|
+
forms = []
|
|
154
|
+
for p in paths:
|
|
155
|
+
try:
|
|
156
|
+
form = _fd.unwrap(json.loads(p.read_text(encoding="utf-8")))
|
|
157
|
+
except (json.JSONDecodeError, OSError) as e:
|
|
158
|
+
raise errors.UsageError(f"{p}: {e}")
|
|
159
|
+
code_path = p.with_name(p.stem + ".code.json")
|
|
160
|
+
code = {}
|
|
161
|
+
if code_path.exists():
|
|
162
|
+
try:
|
|
163
|
+
code = json.loads(code_path.read_text(encoding="utf-8"))
|
|
164
|
+
except json.JSONDecodeError:
|
|
165
|
+
code = {}
|
|
166
|
+
forms.append((form, code))
|
|
167
|
+
|
|
168
|
+
if not args.out_dir:
|
|
169
|
+
return {"result": {"count": len(forms), "forms": [
|
|
170
|
+
{"id": f.get("id"), "name": f.get("name"), "markdown": _fd.render(f, processes)[0]}
|
|
171
|
+
for f, _ in forms]}}
|
|
172
|
+
|
|
173
|
+
out = Path(args.out_dir)
|
|
174
|
+
out.mkdir(parents=True, exist_ok=True)
|
|
175
|
+
fmap = ["# Form → process map", "", "| form | element | trigger | process |", "|---|---|---|---|"]
|
|
176
|
+
written = []
|
|
177
|
+
for form, code in sorted(forms, key=lambda x: x[0].get("name") or ""):
|
|
178
|
+
slug = _slug(form.get("name") or "form") + "-" + str(form.get("id", ""))[:8]
|
|
179
|
+
md, scripts = _fd.render(form, processes)
|
|
180
|
+
side = out / slug
|
|
181
|
+
side.mkdir(exist_ok=True)
|
|
182
|
+
for i, body in enumerate(scripts, 1):
|
|
183
|
+
(side / f"script-{i:03d}.js").write_text(body, encoding="utf-8")
|
|
184
|
+
if code.get("javascript"):
|
|
185
|
+
(side / "form.js").write_text(code["javascript"], encoding="utf-8")
|
|
186
|
+
if code.get("css"):
|
|
187
|
+
(side / "form.css").write_text(code["css"], encoding="utf-8")
|
|
188
|
+
extra = []
|
|
189
|
+
if code.get("javascript") or code.get("css"):
|
|
190
|
+
extra = ["", "## Global code", "",
|
|
191
|
+
f"- JavaScript: {len(code.get('javascript') or '')} chars → `{slug}/form.js`",
|
|
192
|
+
f"- CSS: {len(code.get('css') or '')} chars → `{slug}/form.css`"]
|
|
193
|
+
(out / f"{slug}.md").write_text(md + "\n".join(extra) + f"\n\nScripts: `{slug}/script-NNN.js`\n",
|
|
194
|
+
encoding="utf-8")
|
|
195
|
+
written.append(f"{slug}.md")
|
|
196
|
+
for link in _fd.process_links(form):
|
|
197
|
+
pid = link["process_id"]
|
|
198
|
+
title = (processes.get(pid) or {}).get("title") or pid
|
|
199
|
+
fmap.append(f"| {form.get('name')} | {link['element']} | {link['trigger']} | {title} |")
|
|
200
|
+
(out / "FORM-PROCESS-MAP.md").write_text("\n".join(fmap) + "\n", encoding="utf-8")
|
|
201
|
+
return {"result": {"count": len(forms), "out": str(out), "files": written + ["FORM-PROCESS-MAP.md"]}}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
ACTIONS = {
|
|
205
|
+
"form-digest": ActionDef(
|
|
206
|
+
func=form_digest, add_args=_form_digest_args, needs_client=False,
|
|
207
|
+
description="Readable Markdown digest of forms (offline): structure tree, every element / "
|
|
208
|
+
"form-level event, RUN_PROCESS input/output maps with form paths and process "
|
|
209
|
+
"variables resolved to names, MAP_FORM_DATA conditions, scripts saved beside. "
|
|
210
|
+
"--out adds FORM-PROCESS-MAP.md.",
|
|
211
|
+
),
|
|
212
|
+
"flow-digest": ActionDef(
|
|
213
|
+
func=flow_digest, add_args=_digest_args, needs_client=False,
|
|
214
|
+
description="Readable Markdown digest of flows (offline): variable contract, nodes in "
|
|
215
|
+
"execution order, each node's script/SQL/HTTP/subprocess parameters with "
|
|
216
|
+
"variable and flow ids resolved to names. --in a file or a directory; --out "
|
|
217
|
+
"writes one .md per flow + INDEX.md.",
|
|
218
|
+
),
|
|
219
|
+
"read-flow-graph": ActionDef(
|
|
220
|
+
func=read_flow_graph, add_args=_in_args, needs_client=False,
|
|
221
|
+
description="Parse a .procesio export/flow into a node/edge graph model "
|
|
222
|
+
"(offline). --resource-map for the cross-process graph.",
|
|
223
|
+
),
|
|
224
|
+
"inspect-flow": ActionDef(
|
|
225
|
+
func=inspect_flow, add_args=_inspect_args, needs_client=False,
|
|
226
|
+
description="Structural summary of a flow (offline): counts, action families, "
|
|
227
|
+
"branches, subprocess calls, resources, variables, advisory smells.",
|
|
228
|
+
),
|
|
229
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
"""flow-lint: replicate the designer's client-side "Process Errors" checks on a live flow.
|
|
2
|
+
|
|
3
|
+
Why this exists: POST /api/Projects/validate only validates the RUNTIME layer (parameters) and
|
|
4
|
+
returns EMPTY even when the designer refuses to SAVE. The designer's "Process Errors" panel is a
|
|
5
|
+
separate CLIENT-SIDE check of the DESIGNER layer (customData) with NO server endpoint. This lint
|
|
6
|
+
replicates that designer check so a flow can be verified offline / in CI.
|
|
7
|
+
|
|
8
|
+
Checks (per action, against the DESIGNER customData layer):
|
|
9
|
+
1. SIDEPANEL_ID — a Call/Trigger Subprocess node whose "Subprocess Configuration" side-pannel
|
|
10
|
+
setting id != the CURRENT template's id. PROCESIO bumped the template's side-pannel id over
|
|
11
|
+
time; nodes built against an older template keep the old id, so the designer can't find the
|
|
12
|
+
mapping and reports EVERY required input as "missing". THE most common cause of the phantom
|
|
13
|
+
"Mapping of required subprocess variable (X) is missing." (Networky: 1da555da / 15af8b81 vs
|
|
14
|
+
current 5456caf0 for Call, 8540605e for Trigger.)
|
|
15
|
+
2. REQ_INPUT_UNMAPPED — a required target input (type 10, isRequired) with no process-inputs row.
|
|
16
|
+
3. OUTPUT_NOT_TYPE30 — a process-outputs row mapping a target var that is NOT an output (type 30).
|
|
17
|
+
A subprocess only exposes type-30 vars as outputs; mapping a type-20 internal var => the
|
|
18
|
+
designer flags "Check data mapping."
|
|
19
|
+
4. EXECQUERY_NO_OUTPUT — an Execute Query whose Output subsection is null. The designer requires it.
|
|
20
|
+
5. CODE_ERROR_SCOPE / CODE_UNDECLARED — Node code binding an isError variable (an action's
|
|
21
|
+
error-port output, shown in the "Error" tab, never free-initialized) or an undeclared var.
|
|
22
|
+
6. missing_error_variable — variableErrorId set to a non-existent variable.
|
|
23
|
+
7. CUSTOMDATA_PLACEHOLDER — a DESIGNER setting value still holding a runtime `<%N%>` placeholder. The
|
|
24
|
+
customData layer mirrors each Parameter EXCEPT a variable ref is the raw variableId (GUID) there, not
|
|
25
|
+
the positional `<%N%>`. A `<%N%>` left in a customData value = the param->customData mirror was skipped
|
|
26
|
+
(hand-rolled flow edits bypassing the builder's _apply_values_to_config) -> the designer can't resolve
|
|
27
|
+
the token and paints it RED. (Caught three times in review before the rule was written down.)
|
|
28
|
+
|
|
29
|
+
8. UNREADABLE_STATEMENT / UNREADABLE_SCRIPT — a Query Store or Execute Query statement, or a
|
|
30
|
+
Node script, stored as ONE long line. It runs perfectly and no one can read it: a Query
|
|
31
|
+
Store node IS its statement, and the designer shows a single row that scrolls sideways off
|
|
32
|
+
the screen. The builder lays Query Store SQL out on the way in (tools/procesio/sqlformat.py);
|
|
33
|
+
this catches everything that reached the flow another way.
|
|
34
|
+
|
|
35
|
+
Born 2026-07-05; rebuilt 2026-07-06 after runtime-only versions repeatedly reported false "clean".
|
|
36
|
+
"""
|
|
37
|
+
from __future__ import annotations
|
|
38
|
+
|
|
39
|
+
import argparse
|
|
40
|
+
import re
|
|
41
|
+
|
|
42
|
+
from tools.procesio.actiondef import ActionDef
|
|
43
|
+
from tools.procesio.client import VARIABLES_ONLY
|
|
44
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
45
|
+
from tools.procesio.sqlformat import is_unreadable
|
|
46
|
+
|
|
47
|
+
CODE_PID = "1e6a5523-2091-6c4c-94ac-c7984074673d"
|
|
48
|
+
QUERY_STORE_SQL_PID = "02577ada-0000-0200-0000-00000000b102"
|
|
49
|
+
NULL_GUID = "00000000-0000-0000-0000-000000000000"
|
|
50
|
+
_SUB_TEMPLATES = ("Call Subprocess", "Trigger Subprocess")
|
|
51
|
+
OUTPUT_TYPE = 30 # subprocess variables exposed as outputs
|
|
52
|
+
# built-in scalar datatypes share this prefix; the only object among them is ...1221 (any/Object).
|
|
53
|
+
# An Execute Query Output is a SQL result SET -> must be a list<Object>: isList=True and the element
|
|
54
|
+
# type an Object (the generic ...1221 OR any custom DataModel, whose GUID does NOT share this prefix).
|
|
55
|
+
_PRIM_PREFIX = "0317bfee-b2f5-4bde-bfe8-1212"
|
|
56
|
+
_GENERIC_OBJECT = "0317bfee-b2f5-4bde-bfe8-121212121221"
|
|
57
|
+
# The DESIGNER customData mirrors each Parameter EXCEPT a variable ref is the raw variableId there,
|
|
58
|
+
# while the runtime Parameter uses a <%N%> positional placeholder. A <%N%> left in a customData setting
|
|
59
|
+
# value means the param->customData mirror was skipped (hand-rolled edits) -> the designer can't resolve
|
|
60
|
+
# the token and paints it red ("still red <%0%>"). The builder's _apply_values_to_config does this
|
|
61
|
+
# transform; this lint catches nodes that bypassed it.
|
|
62
|
+
_PLACEHOLDER_RE = re.compile(r"<%\d+%>")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _is_guid(x) -> bool:
|
|
66
|
+
return isinstance(x, str) and len(x) == 36 and x.count("-") == 4
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def _walk_settings(action: dict):
|
|
70
|
+
"""Yield every customData.configuration setting (recursing into list-valued settings)."""
|
|
71
|
+
def walk(settings):
|
|
72
|
+
for s in settings or []:
|
|
73
|
+
if isinstance(s, dict):
|
|
74
|
+
yield s
|
|
75
|
+
if isinstance(s.get("value"), list):
|
|
76
|
+
yield from walk(s["value"])
|
|
77
|
+
for cf in (action.get("customData") or {}).get("configuration") or []:
|
|
78
|
+
yield from walk(cf.get("settings") or [])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _sidepanel(action: dict) -> dict | None:
|
|
82
|
+
for cf in (action.get("customData") or {}).get("configuration") or []:
|
|
83
|
+
for s in cf.get("settings") or []:
|
|
84
|
+
if s.get("type") == "side-pannel":
|
|
85
|
+
return s
|
|
86
|
+
return None
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def _subsection(sidepanel: dict | None, kind: str) -> list:
|
|
90
|
+
for sub in (sidepanel.get("value") or []) if sidepanel else []:
|
|
91
|
+
if sub.get("type") == kind:
|
|
92
|
+
return sub.get("value") or []
|
|
93
|
+
return []
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def _execquery_output(action: dict):
|
|
97
|
+
"""The Execute Query Output subsection value, or the sentinel '__absent__'."""
|
|
98
|
+
for cf in (action.get("customData") or {}).get("configuration") or []:
|
|
99
|
+
for s in cf.get("settings") or []:
|
|
100
|
+
if s.get("type") == "side-pannel":
|
|
101
|
+
for sub in s.get("value") or []:
|
|
102
|
+
if str(sub.get("label")) == "Output":
|
|
103
|
+
return sub.get("value")
|
|
104
|
+
return "__absent__"
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
_SQL_WORDS = re.compile(r"(?i)(select|insert|update|delete|merge|with)")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _looks_like_sql(value: str) -> bool:
|
|
111
|
+
return bool(_SQL_WORDS.search(value))
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def lint_flow_dto(flow: dict, template_sidepanel_ids: dict, target_vars_of) -> list[dict]:
|
|
115
|
+
"""Pure lint over a flow DTO.
|
|
116
|
+
template_sidepanel_ids: {"Call Subprocess": id, "Trigger Subprocess": id} (current template).
|
|
117
|
+
target_vars_of(flow_id) -> {var_id: var_dict} for a called subprocess (injected: no network in tests).
|
|
118
|
+
"""
|
|
119
|
+
vmap = {v["id"]: v for v in flow.get("variables") or []}
|
|
120
|
+
problems: list[dict] = []
|
|
121
|
+
|
|
122
|
+
def add(action, kind, detail):
|
|
123
|
+
problems.append({"action": action, "kind": kind, "detail": detail})
|
|
124
|
+
|
|
125
|
+
for a in flow.get("actions") or []:
|
|
126
|
+
nm = a.get("actionName")
|
|
127
|
+
tmpl = a.get("actionTemplateName")
|
|
128
|
+
|
|
129
|
+
for s in _walk_settings(a):
|
|
130
|
+
val = s.get("value")
|
|
131
|
+
if isinstance(val, str) and _PLACEHOLDER_RE.search(val):
|
|
132
|
+
add(nm, "CUSTOMDATA_PLACEHOLDER",
|
|
133
|
+
f"designer setting '{s.get('label')}' still holds a <%N%> placeholder "
|
|
134
|
+
f"(customData must carry the variable GUID, not the runtime placeholder - the "
|
|
135
|
+
f"designer paints it red); param->customData mirror was not applied")
|
|
136
|
+
|
|
137
|
+
# A statement or a script stored as ONE long line runs perfectly and cannot be read:
|
|
138
|
+
# the designer shows a single row that scrolls off the screen. Flagged, not rewritten,
|
|
139
|
+
# because reflowing someone else's code is not the lint's job.
|
|
140
|
+
for prm in a.get("parameters") or []:
|
|
141
|
+
pid, val = prm.get("tabPropertyId"), prm.get("value")
|
|
142
|
+
if not isinstance(val, str) or not is_unreadable(val):
|
|
143
|
+
continue
|
|
144
|
+
if pid == QUERY_STORE_SQL_PID or (tmpl in ("Execute Query", "Execute Command")
|
|
145
|
+
and _looks_like_sql(val)):
|
|
146
|
+
add(nm, "UNREADABLE_STATEMENT",
|
|
147
|
+
f"the SQL is {len(val.strip())} characters on ONE line; lay it out over "
|
|
148
|
+
f"lines so a reader can see the clauses")
|
|
149
|
+
elif pid == CODE_PID:
|
|
150
|
+
add(nm, "UNREADABLE_SCRIPT",
|
|
151
|
+
f"the script is {len(val.strip())} characters on ONE line; keep a script "
|
|
152
|
+
f"body multi-line, one statement per line")
|
|
153
|
+
|
|
154
|
+
if tmpl == "Node":
|
|
155
|
+
cp = next((p for p in a.get("parameters") or [] if p.get("tabPropertyId") == CODE_PID), None)
|
|
156
|
+
for ve in (cp.get("variable") if cp else []) or []:
|
|
157
|
+
vid = ve.get("variableId")
|
|
158
|
+
v = vmap.get(vid)
|
|
159
|
+
if v is None:
|
|
160
|
+
add(nm, "CODE_UNDECLARED", f"code binds undeclared variable {vid}")
|
|
161
|
+
elif v.get("isError"):
|
|
162
|
+
add(nm, "CODE_ERROR_SCOPE",
|
|
163
|
+
f"code binds error-scope variable '{v.get('name')}' (isError=true)")
|
|
164
|
+
|
|
165
|
+
if tmpl == "Execute Query":
|
|
166
|
+
out = _execquery_output(a)
|
|
167
|
+
if out is None or out == "":
|
|
168
|
+
add(nm, "EXECQUERY_NO_OUTPUT", "Execute Query Output subsection is null")
|
|
169
|
+
elif out != "__absent__":
|
|
170
|
+
ov = vmap.get(out)
|
|
171
|
+
if ov is None:
|
|
172
|
+
add(nm, "EXECQUERY_OUTPUT_UNDECLARED", f"Output variable {out} not declared")
|
|
173
|
+
else:
|
|
174
|
+
dt = ov.get("dataType") or ""
|
|
175
|
+
if (not ov.get("isList")) or (dt.startswith(_PRIM_PREFIX) and dt != _GENERIC_OBJECT):
|
|
176
|
+
add(nm, "EXECQUERY_OUTPUT_TYPE",
|
|
177
|
+
f"Output '{ov.get('name')}' must be a list<Object> (a SQL result set) - "
|
|
178
|
+
f"got isList={ov.get('isList')} dataType=...{dt[-4:]} "
|
|
179
|
+
f"(scalar/primitive -> designer 'data type mismatch')")
|
|
180
|
+
|
|
181
|
+
ev = a.get("variableErrorId")
|
|
182
|
+
if ev and ev not in vmap:
|
|
183
|
+
add(nm, "missing_error_variable", f"variableErrorId {ev} not declared")
|
|
184
|
+
|
|
185
|
+
if tmpl in _SUB_TEMPLATES:
|
|
186
|
+
sp = _sidepanel(a)
|
|
187
|
+
want = template_sidepanel_ids.get(tmpl)
|
|
188
|
+
if want and (sp is None or sp.get("id") != want):
|
|
189
|
+
add(nm, "SIDEPANEL_ID",
|
|
190
|
+
f"side-pannel id {sp.get('id') if sp else None} != current template {want} "
|
|
191
|
+
f"(designer cannot find the mapping)")
|
|
192
|
+
target = next((p["value"] for p in a.get("parameters") or []
|
|
193
|
+
if _is_guid(p.get("value")) and p["value"] != NULL_GUID), None)
|
|
194
|
+
if not target:
|
|
195
|
+
continue
|
|
196
|
+
tv = target_vars_of(target) or {}
|
|
197
|
+
mapped_in = {r.get("subprocess"): r.get("process") for r in _subsection(sp, "process-inputs")}
|
|
198
|
+
for vid, v in tv.items():
|
|
199
|
+
if v.get("type") == 10 and v.get("isRequired"):
|
|
200
|
+
src = mapped_in.get(vid)
|
|
201
|
+
if src is None or src == "":
|
|
202
|
+
add(nm, "REQ_INPUT_UNMAPPED",
|
|
203
|
+
f"required subprocess input '{v.get('name')}' has no designer mapping")
|
|
204
|
+
else:
|
|
205
|
+
root = str(src).split(".")[0]
|
|
206
|
+
if _is_guid(root) and root not in vmap:
|
|
207
|
+
add(nm, "REQ_INPUT_DEAD_SOURCE",
|
|
208
|
+
f"input '{v.get('name')}' mapped from undeclared variable {root}")
|
|
209
|
+
for r in _subsection(sp, "process-outputs"):
|
|
210
|
+
ov = tv.get(r.get("subprocess"))
|
|
211
|
+
if ov is not None and ov.get("type") != OUTPUT_TYPE:
|
|
212
|
+
add(nm, "OUTPUT_NOT_TYPE30",
|
|
213
|
+
f"output maps target var '{ov.get('name')}' which is type {ov.get('type')}, "
|
|
214
|
+
f"not an exposed output (type {OUTPUT_TYPE})")
|
|
215
|
+
return problems
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
def _args(p: argparse.ArgumentParser) -> None:
|
|
219
|
+
add_profile_arg(p)
|
|
220
|
+
p.add_argument("--id", required=True, help="flow (process) id to lint")
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
def _template_sidepanel_ids(client) -> dict:
|
|
224
|
+
acts = client.get("/api/Actions?getFullAction=true")
|
|
225
|
+
if isinstance(acts, dict):
|
|
226
|
+
acts = acts.get("result", acts)
|
|
227
|
+
acts = acts.get("actions", acts) if isinstance(acts, dict) else acts
|
|
228
|
+
out = {}
|
|
229
|
+
for tn in _SUB_TEMPLATES:
|
|
230
|
+
t = next((a for a in acts if a.get("name") == tn), None)
|
|
231
|
+
if not t:
|
|
232
|
+
continue
|
|
233
|
+
sp = next((s["id"] for tab in t.get("configuration") or []
|
|
234
|
+
for s in tab.get("settings") or [] if s.get("type") == "side-pannel"), None)
|
|
235
|
+
if sp:
|
|
236
|
+
out[tn] = sp
|
|
237
|
+
return out
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def flow_lint(client, args) -> dict:
|
|
241
|
+
resp = client.get(f"/api/Projects/{args.id}")
|
|
242
|
+
flow = resp.get("flow", resp) if isinstance(resp, dict) else resp
|
|
243
|
+
tmpl_sp = _template_sidepanel_ids(client)
|
|
244
|
+
cache: dict = {}
|
|
245
|
+
|
|
246
|
+
def target_vars_of(fid: str) -> dict:
|
|
247
|
+
if fid not in cache:
|
|
248
|
+
try:
|
|
249
|
+
r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
|
|
250
|
+
f = r.get("flow", r) if isinstance(r, dict) else r
|
|
251
|
+
cache[fid] = {v["id"]: v for v in f.get("variables") or []}
|
|
252
|
+
except Exception: # noqa: BLE001 - unreadable target -> can't assert its contract
|
|
253
|
+
cache[fid] = {}
|
|
254
|
+
return cache[fid]
|
|
255
|
+
|
|
256
|
+
problems = lint_flow_dto(flow, tmpl_sp, target_vars_of)
|
|
257
|
+
return {"id": args.id, "title": flow.get("title"), "clean": not problems,
|
|
258
|
+
"problem_count": len(problems), "problems": problems}
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
ACTIONS = {
|
|
262
|
+
"flow-lint": ActionDef(
|
|
263
|
+
func=flow_lint, add_args=_args, needs_client=True,
|
|
264
|
+
description="Designer-layer 'Process Errors' lint on a live flow (the check that blocks "
|
|
265
|
+
"designer SAVE, which POST /Projects/validate does NOT catch): stale subprocess "
|
|
266
|
+
"side-pannel ids, unmapped/dead required subprocess inputs, subprocess outputs "
|
|
267
|
+
"mapped to non-output (non-type-30) vars, Execute Query with null Output, and Node "
|
|
268
|
+
"code binding error-scope/undeclared vars. clean=true when none."),
|
|
269
|
+
}
|