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,320 @@
|
|
|
1
|
+
"""Curated scheduler actions (run a process on a cron / recurrence).
|
|
2
|
+
|
|
3
|
+
Wraps the `/api/Schedules*` surface so a user or agent can list / get / create /
|
|
4
|
+
update / delete a schedule, enable or disable one, manage its notifications, and
|
|
5
|
+
list a project's schedules — without dropping to the untyped generic `request`.
|
|
6
|
+
|
|
7
|
+
Verified routes + methods (Web-API, tag Schedules; perms in parens):
|
|
8
|
+
list GET /api/Schedules (Schedule.Read)
|
|
9
|
+
get GET /api/Schedules/{scheduleId} (Schedule.Read)
|
|
10
|
+
create POST /api/Schedules (Schedule.Write)
|
|
11
|
+
update PUT /api/Schedules (Schedule.Update)
|
|
12
|
+
delete DELETE /api/Schedules/{scheduleId} (Schedule.Delete)
|
|
13
|
+
set status PATCH /api/Schedules/{scheduleId}/status (Schedule.Update)
|
|
14
|
+
get notifs GET /api/Schedules/notifications/{scheduleId} (Schedule.Read)
|
|
15
|
+
set notifs POST /api/Schedules/notifications (Schedule.Update)
|
|
16
|
+
project list GET /api/Projects/{id}/restricted/schedules (Schedule.Read)
|
|
17
|
+
|
|
18
|
+
The create/update body shape is captured in PROCESIO-API-NOTES.md (Hard rule 6).
|
|
19
|
+
Security: literal ``processInputs`` are persisted and returned by schedule reads.
|
|
20
|
+
The curated handler preserves the raw DTO by default for backward-compatible
|
|
21
|
+
round-tripping and offers ``get-schedule --redact-process-inputs`` for evidence and
|
|
22
|
+
diagnostics. Read SCHEDULE-INPUT-SECURITY-NOTES.md before storing authentication
|
|
23
|
+
material there or capturing a raw schedule result.
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import argparse
|
|
28
|
+
from typing import Any
|
|
29
|
+
|
|
30
|
+
from tools.procesio import errors
|
|
31
|
+
from tools.procesio.actiondef import ActionDef
|
|
32
|
+
from tools.procesio.client import parse_json_arg
|
|
33
|
+
from tools.procesio.handlers.common import add_paging_args, add_profile_arg
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
_REDACTED = "[REDACTED]"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# -- list / get -------------------------------------------------------------
|
|
40
|
+
|
|
41
|
+
def _list_args(p: argparse.ArgumentParser) -> None:
|
|
42
|
+
add_profile_arg(p)
|
|
43
|
+
add_paging_args(p)
|
|
44
|
+
p.add_argument("--search", help="filter by schedule name (searchName)")
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def list_schedules(client, args) -> dict:
|
|
48
|
+
q = {"pageNumber": args.page, "pageItemCount": args.page_size,
|
|
49
|
+
"searchName": args.search}
|
|
50
|
+
return {"result": client.get("/api/Schedules", q)}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _id_args(p: argparse.ArgumentParser) -> None:
|
|
54
|
+
add_profile_arg(p)
|
|
55
|
+
p.add_argument("--id", required=True, help="schedule id (scheduleId)")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def _get_args(p: argparse.ArgumentParser) -> None:
|
|
59
|
+
_id_args(p)
|
|
60
|
+
p.add_argument(
|
|
61
|
+
"--redact-process-inputs",
|
|
62
|
+
action="store_true",
|
|
63
|
+
help="replace every returned processInputs[].value with [REDACTED]",
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _redact_process_inputs(value: Any) -> Any:
|
|
68
|
+
"""Copy a schedule DTO while masking literal process-input values.
|
|
69
|
+
|
|
70
|
+
Both camelCase live DTOs and PascalCase export-like shapes are handled. Other
|
|
71
|
+
fields stay byte-for-byte equivalent at the JSON-value level so the result is
|
|
72
|
+
useful for structural diagnostics without exposing a stored secret.
|
|
73
|
+
"""
|
|
74
|
+
if isinstance(value, list):
|
|
75
|
+
return [_redact_process_inputs(item) for item in value]
|
|
76
|
+
if not isinstance(value, dict):
|
|
77
|
+
return value
|
|
78
|
+
|
|
79
|
+
result: dict[str, Any] = {}
|
|
80
|
+
for key, item in value.items():
|
|
81
|
+
if key.casefold() != "processinputs" or not isinstance(item, list):
|
|
82
|
+
result[key] = _redact_process_inputs(item)
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
rows: list[Any] = []
|
|
86
|
+
for row in item:
|
|
87
|
+
if not isinstance(row, dict):
|
|
88
|
+
rows.append(_REDACTED if row is not None else None)
|
|
89
|
+
continue
|
|
90
|
+
clean: dict[str, Any] = {}
|
|
91
|
+
for row_key, row_value in row.items():
|
|
92
|
+
if row_key.casefold() == "value" and row_value is not None:
|
|
93
|
+
clean[row_key] = _REDACTED
|
|
94
|
+
else:
|
|
95
|
+
clean[row_key] = _redact_process_inputs(row_value)
|
|
96
|
+
rows.append(clean)
|
|
97
|
+
result[key] = rows
|
|
98
|
+
return result
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def get_schedule(client, args) -> dict:
|
|
102
|
+
result = client.get(f"/api/Schedules/{args.id}")
|
|
103
|
+
if args.redact_process_inputs:
|
|
104
|
+
result = _redact_process_inputs(result)
|
|
105
|
+
return {"result": result}
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
# -- create / update / delete ----------------------------------------------
|
|
109
|
+
|
|
110
|
+
# RecurrenceTypes enum (Domain/Enums/Scheduler/RecurrenceTypes.cs): NONE=0, ONCE=1,
|
|
111
|
+
# MINUTES=2, HOURS=3, DAILY=4, WEEKLY=5, MONTHLY=6, YEARLY=7, CRON=8. The crontab
|
|
112
|
+
# feature (PRC-3282) is recurrence type 8 with a RecurrenceCron block.
|
|
113
|
+
_RECURRENCE_CRON = 8
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _apply_cron(body: dict, args) -> dict:
|
|
117
|
+
"""When --cron is given, REPLACE the recurrence block with the crontab shape.
|
|
118
|
+
|
|
119
|
+
Replace, not overlay. A cron recurrence carries only `recurrence: 8`,
|
|
120
|
+
`cronExpression`, `timeZone`, `info`, `startDate` and `isEndDate` (plus `endDate` when
|
|
121
|
+
the window really ends). Leaving the calendar-recurrence fields in place —
|
|
122
|
+
`every` / `onDay` / `onThe` / `isOnThe` / `isWeekendExcluded` — is what earns the
|
|
123
|
+
generic HTTP 400 `[{"statusCode":502,"value":"Invalid request due to missing or
|
|
124
|
+
incorrect resource parameters.","target":"schedules"}]`. Captured from the designer's
|
|
125
|
+
own PUT, which sends exactly the keys below and nothing else; the same body that fails
|
|
126
|
+
with them present succeeds with them stripped, so this drops them rather than
|
|
127
|
+
trusting a caller's --payload to be cron-shaped already.
|
|
128
|
+
"""
|
|
129
|
+
if not getattr(args, "cron", None):
|
|
130
|
+
return body
|
|
131
|
+
src_rec = dict(body.get("recurrence") or {})
|
|
132
|
+
rec = {"recurrence": _RECURRENCE_CRON,
|
|
133
|
+
"cronExpression": args.cron,
|
|
134
|
+
"info": (getattr(args, "recurrence_info", None)
|
|
135
|
+
or src_rec.get("info") or f"cron: {args.cron}"),
|
|
136
|
+
"isEndDate": bool(src_rec.get("isEndDate"))}
|
|
137
|
+
tz = getattr(args, "timezone", None) or src_rec.get("timeZone")
|
|
138
|
+
if tz:
|
|
139
|
+
rec["timeZone"] = tz
|
|
140
|
+
# Only these two calendar fields survive: the activation window a cron may still carry.
|
|
141
|
+
if src_rec.get("startDate"):
|
|
142
|
+
rec["startDate"] = src_rec["startDate"]
|
|
143
|
+
if rec["isEndDate"] and src_rec.get("endDate"):
|
|
144
|
+
rec["endDate"] = src_rec["endDate"]
|
|
145
|
+
body["recurrence"] = rec
|
|
146
|
+
return body
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# Recurrences that read `recurrence.timeZone`: DAILY..YEARLY evaluate their weekday /
|
|
150
|
+
# day-of-month / time-of-day rules on that zone's local clock, CRON evaluates its
|
|
151
|
+
# expression there. ONCE / MINUTES / HOURS never read it. An absent zone means UTC; an id
|
|
152
|
+
# the server cannot resolve fails the whole recurrence.
|
|
153
|
+
_ZONED_RECURRENCES = {4, 5, 6, 7, _RECURRENCE_CRON}
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
def _apply_timezone(body: dict, args) -> dict:
|
|
157
|
+
"""Set --timezone on a calendar recurrence (the cron path already carries it).
|
|
158
|
+
|
|
159
|
+
Refuses it on a recurrence type that ignores the zone, rather than writing a key the
|
|
160
|
+
server silently drops."""
|
|
161
|
+
tz = getattr(args, "timezone", None)
|
|
162
|
+
if not tz or getattr(args, "cron", None):
|
|
163
|
+
return body
|
|
164
|
+
rec = body.get("recurrence")
|
|
165
|
+
kind = rec.get("recurrence") if isinstance(rec, dict) else None
|
|
166
|
+
if kind not in _ZONED_RECURRENCES:
|
|
167
|
+
raise errors.UsageError(
|
|
168
|
+
f"--timezone has no effect on recurrence type {kind!r}: only daily (4), weekly (5), "
|
|
169
|
+
f"monthly (6), yearly (7) and cron (8) schedules are evaluated in a time zone")
|
|
170
|
+
rec["timeZone"] = tz
|
|
171
|
+
return body
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def _payload_args(p: argparse.ArgumentParser) -> None:
|
|
175
|
+
add_profile_arg(p)
|
|
176
|
+
p.add_argument("--payload", required=True,
|
|
177
|
+
help="schedule as a JSON object (see PROCESIO-API-NOTES.md for the shape)")
|
|
178
|
+
p.add_argument("--cron",
|
|
179
|
+
help="5-field crontab expression (min hour day month weekday); sets "
|
|
180
|
+
"the recurrence to CRON (type 8) over the --payload. Preview it "
|
|
181
|
+
"first with validate-crontab. BE rule (PRC-5406): 5 fields only "
|
|
182
|
+
"(no seconds), @-macros like @daily are REJECTED, max 100 chars. "
|
|
183
|
+
"The expression runs on --timezone's clock (UTC when omitted); "
|
|
184
|
+
"startDate / endDate are always UTC.")
|
|
185
|
+
p.add_argument("--timezone",
|
|
186
|
+
help="IANA timezone id (e.g. Europe/Bucharest) the recurrence runs in. "
|
|
187
|
+
"Applies to cron and to daily / weekly / monthly / yearly "
|
|
188
|
+
"recurrences, whose day and time rules follow that zone's local "
|
|
189
|
+
"clock, DST included; absent means UTC")
|
|
190
|
+
p.add_argument("--recurrence-info", dest="recurrence_info",
|
|
191
|
+
help="human-readable recurrence label (optional)")
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def create_schedule(client, args) -> dict:
|
|
195
|
+
body = _apply_timezone(_apply_cron(parse_json_arg(args.payload, "payload"), args), args)
|
|
196
|
+
return {"result": client.post("/api/Schedules", body)}
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
def update_schedule(client, args) -> dict:
|
|
200
|
+
body = _apply_timezone(_apply_cron(parse_json_arg(args.payload, "payload"), args), args)
|
|
201
|
+
return {"result": client.put("/api/Schedules", body)}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
# -- crontab preview --------------------------------------------------------
|
|
205
|
+
|
|
206
|
+
def _validate_crontab_args(p: argparse.ArgumentParser) -> None:
|
|
207
|
+
add_profile_arg(p)
|
|
208
|
+
p.add_argument("--cron", required=True,
|
|
209
|
+
help="5-field crontab expression to validate (min hour day month weekday)")
|
|
210
|
+
p.add_argument("--timezone", help="IANA timezone id (default server/UTC)")
|
|
211
|
+
p.add_argument("--count", type=int,
|
|
212
|
+
help="how many upcoming occurrences to return (default 5, max 20)")
|
|
213
|
+
p.add_argument("--start-date", dest="start_date", help="ISO-8601 activation start (optional)")
|
|
214
|
+
p.add_argument("--end-date", dest="end_date", help="ISO-8601 activation end (optional)")
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def validate_crontab(client, args) -> dict:
|
|
218
|
+
body = {"cronExpression": args.cron, "timeZone": args.timezone,
|
|
219
|
+
"count": args.count, "startDate": args.start_date, "endDate": args.end_date}
|
|
220
|
+
body = {k: v for k, v in body.items() if v is not None}
|
|
221
|
+
return {"result": client.post("/api/Schedules/validate-crontab", body)}
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def delete_schedule(client, args) -> dict:
|
|
225
|
+
return {"result": client.delete(f"/api/Schedules/{args.id}")}
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# -- enable / disable -------------------------------------------------------
|
|
229
|
+
|
|
230
|
+
def _status_args(p: argparse.ArgumentParser) -> None:
|
|
231
|
+
add_profile_arg(p)
|
|
232
|
+
p.add_argument("--id", required=True, help="schedule id (scheduleId)")
|
|
233
|
+
p.add_argument("--active", required=True, choices=["true", "false"],
|
|
234
|
+
help="true to enable the schedule, false to disable it")
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
def set_schedule_status(client, args) -> dict:
|
|
238
|
+
# The API names the query flag `enable`; we expose it as --active per spec.
|
|
239
|
+
q = {"enable": args.active}
|
|
240
|
+
return {"result": client.patch(f"/api/Schedules/{args.id}/status", None, q)}
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
# -- notifications ----------------------------------------------------------
|
|
244
|
+
|
|
245
|
+
def _notif_id_args(p: argparse.ArgumentParser) -> None:
|
|
246
|
+
add_profile_arg(p)
|
|
247
|
+
p.add_argument("--id", required=True, help="schedule id (scheduleId)")
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
def get_schedule_notifications(client, args) -> dict:
|
|
251
|
+
return {"result": client.get(f"/api/Schedules/notifications/{args.id}")}
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
def _notif_payload_args(p: argparse.ArgumentParser) -> None:
|
|
255
|
+
add_profile_arg(p)
|
|
256
|
+
p.add_argument("--payload", required=True,
|
|
257
|
+
help="notifications config as a JSON object")
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
def set_schedule_notifications(client, args) -> dict:
|
|
261
|
+
body = parse_json_arg(args.payload, "payload")
|
|
262
|
+
return {"result": client.post("/api/Schedules/notifications", body)}
|
|
263
|
+
|
|
264
|
+
|
|
265
|
+
# -- project schedules ------------------------------------------------------
|
|
266
|
+
|
|
267
|
+
def _project_args(p: argparse.ArgumentParser) -> None:
|
|
268
|
+
add_profile_arg(p)
|
|
269
|
+
p.add_argument("--id", required=True, help="project (process) id")
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def list_project_schedules(client, args) -> dict:
|
|
273
|
+
return {"result": client.get(f"/api/Projects/{args.id}/restricted/schedules")}
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
ACTIONS = {
|
|
277
|
+
"list-schedules": ActionDef(
|
|
278
|
+
func=list_schedules, add_args=_list_args, needs_client=True,
|
|
279
|
+
description="List schedules (GET /api/Schedules).",
|
|
280
|
+
),
|
|
281
|
+
"get-schedule": ActionDef(
|
|
282
|
+
func=get_schedule, add_args=_get_args, needs_client=True,
|
|
283
|
+
description="Get one schedule by id; use --redact-process-inputs for safe evidence.",
|
|
284
|
+
),
|
|
285
|
+
"create-schedule": ActionDef(
|
|
286
|
+
func=create_schedule, add_args=_payload_args, needs_client=True,
|
|
287
|
+
description="Create a schedule (POST /api/Schedules) from a JSON --payload; "
|
|
288
|
+
"--cron/--timezone sets a crontab recurrence.",
|
|
289
|
+
),
|
|
290
|
+
"update-schedule": ActionDef(
|
|
291
|
+
func=update_schedule, add_args=_payload_args, needs_client=True,
|
|
292
|
+
description="Update a schedule (PUT /api/Schedules) from a JSON --payload; "
|
|
293
|
+
"--cron/--timezone sets a crontab recurrence.",
|
|
294
|
+
),
|
|
295
|
+
"validate-crontab": ActionDef(
|
|
296
|
+
func=validate_crontab, add_args=_validate_crontab_args, needs_client=True,
|
|
297
|
+
description="Preview a crontab expression's next occurrences "
|
|
298
|
+
"(POST /api/Schedules/validate-crontab).",
|
|
299
|
+
),
|
|
300
|
+
"delete-schedule": ActionDef(
|
|
301
|
+
func=delete_schedule, add_args=_id_args, needs_client=True,
|
|
302
|
+
description="Delete a schedule (DELETE /api/Schedules/{id}).",
|
|
303
|
+
),
|
|
304
|
+
"set-schedule-status": ActionDef(
|
|
305
|
+
func=set_schedule_status, add_args=_status_args, needs_client=True,
|
|
306
|
+
description="Enable/disable a schedule (PATCH /api/Schedules/{id}/status --active true|false).",
|
|
307
|
+
),
|
|
308
|
+
"get-schedule-notifications": ActionDef(
|
|
309
|
+
func=get_schedule_notifications, add_args=_notif_id_args, needs_client=True,
|
|
310
|
+
description="Get a schedule's notifications (GET /api/Schedules/notifications/{id}).",
|
|
311
|
+
),
|
|
312
|
+
"set-schedule-notifications": ActionDef(
|
|
313
|
+
func=set_schedule_notifications, add_args=_notif_payload_args, needs_client=True,
|
|
314
|
+
description="Set a schedule's notifications (POST /api/Schedules/notifications) from a JSON --payload.",
|
|
315
|
+
),
|
|
316
|
+
"list-project-schedules": ActionDef(
|
|
317
|
+
func=list_project_schedules, add_args=_project_args, needs_client=True,
|
|
318
|
+
description="List a project's schedules (GET /api/Projects/{id}/restricted/schedules).",
|
|
319
|
+
),
|
|
320
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
"""SQL Server action hardening: convert inline `N'<%N%>'` string-substitution in Execute Query /
|
|
2
|
+
Execute Command nodes (SQL-injection-prone, and the wrong action config) into the safe form —
|
|
3
|
+
named `@params` bound via the `Parameters config tab`. See tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md.
|
|
4
|
+
|
|
5
|
+
sql-scan list a process's SQL nodes with inline-vs-parameterized status (read-only)
|
|
6
|
+
sql-parameterize convert one node (--node) or every inline node (--all) -> validate -> PUT
|
|
7
|
+
(--dry-run converts + validates but does not PUT; an invalid flow is never PUT)
|
|
8
|
+
sql-convert move one node between the Execute Command and Execute Query families, and
|
|
9
|
+
optionally rebind its Output -> validate + flow-lint -> PUT. Needed whenever a
|
|
10
|
+
procedure that ends in SELECT sits on a Command node: Command returns
|
|
11
|
+
rows-affected, so the result set is discarded with no error to show for it.
|
|
12
|
+
|
|
13
|
+
JSON in / JSON out; impure (live client). Thin, validated wrappers over GET/validate/PUT /api/Projects.
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
import argparse
|
|
18
|
+
|
|
19
|
+
from tools.procesio.actiondef import ActionDef
|
|
20
|
+
from tools.procesio.client import VARIABLES_ONLY
|
|
21
|
+
from tools.procesio.errors import ProcesioAPIError, UsageError
|
|
22
|
+
from tools.procesio.flowmodel import sqlparam
|
|
23
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
24
|
+
from tools.procesio.handlers.fevalidate import run_fe_validation, save_flow
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _enabled(node: dict) -> bool:
|
|
28
|
+
"""False if the node is disabled in the designer (so --all never touches a disabled node)."""
|
|
29
|
+
cd = node.get("customData") or {}
|
|
30
|
+
return not (node.get("isDisabled") or node.get("disabled") or cd.get("isDisabled"))
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _fetch_flow(client, pid: str) -> dict:
|
|
34
|
+
flow = client.get(f"/api/Projects/{pid}")
|
|
35
|
+
return flow.get("flow") if isinstance(flow, dict) and "flow" in flow else flow
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _validate(client, flow: dict):
|
|
39
|
+
"""(is_valid, errors). Empty 200 == valid (mirrors process-validate)."""
|
|
40
|
+
try:
|
|
41
|
+
res = client.post("/api/Projects/validate", flow)
|
|
42
|
+
except ProcesioAPIError as e:
|
|
43
|
+
det = e.details if isinstance(e.details, dict) else {"body": e.details}
|
|
44
|
+
return False, det.get("body", det)
|
|
45
|
+
empty = (not res) or (isinstance(res, dict) and list(res.keys()) == ["raw_text"] and not res["raw_text"])
|
|
46
|
+
return (True, None) if empty else (False, res)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _lint(client, flow: dict) -> list[dict]:
|
|
50
|
+
"""Designer-layer save-blockers the BE validator does not report (same oracle as flow-lint)."""
|
|
51
|
+
from tools.procesio.handlers.flowlint import _template_sidepanel_ids, lint_flow_dto
|
|
52
|
+
|
|
53
|
+
try:
|
|
54
|
+
tmpl_sp = _template_sidepanel_ids(client)
|
|
55
|
+
except Exception: # noqa: BLE001 - catalog unreachable -> lint what does not need it
|
|
56
|
+
tmpl_sp = {}
|
|
57
|
+
|
|
58
|
+
def target_vars_of(fid: str) -> dict:
|
|
59
|
+
try:
|
|
60
|
+
r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
|
|
61
|
+
f = r.get("flow", r) if isinstance(r, dict) else r
|
|
62
|
+
return {v["id"]: v for v in f.get("variables") or []}
|
|
63
|
+
except Exception: # noqa: BLE001 - unreadable target -> can't assert its contract
|
|
64
|
+
return {}
|
|
65
|
+
return lint_flow_dto(flow, tmpl_sp, target_vars_of)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def sql_scan(client, args) -> dict:
|
|
69
|
+
flow = _fetch_flow(client, args.id)
|
|
70
|
+
return {"id": args.id, "title": flow.get("title"), "sql_nodes": sqlparam.scan(flow)}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def sql_parameterize(client, args) -> dict:
|
|
74
|
+
if not args.node and not args.all:
|
|
75
|
+
raise UsageError("pass --node <label|id> to convert one node, or --all for every inline SQL node")
|
|
76
|
+
flow = _fetch_flow(client, args.id)
|
|
77
|
+
if args.all:
|
|
78
|
+
targets = [a for a in flow.get("actions") or []
|
|
79
|
+
if sqlparam.is_sql_node(a) and sqlparam.is_inline(a) and _enabled(a)]
|
|
80
|
+
else:
|
|
81
|
+
n = sqlparam.find_node(flow, args.node)
|
|
82
|
+
if not n:
|
|
83
|
+
raise UsageError(f"node not found in process {args.id}: {args.node}")
|
|
84
|
+
targets = [n]
|
|
85
|
+
|
|
86
|
+
changes = []
|
|
87
|
+
for n in targets:
|
|
88
|
+
ok, msg = sqlparam.parameterize_node(n)
|
|
89
|
+
changes.append({"node": n.get("actionName"), "id": n.get("id"), "converted": ok, "msg": msg})
|
|
90
|
+
converted = [c for c in changes if c["converted"]]
|
|
91
|
+
result = {"id": args.id, "converted": len(converted), "changes": changes}
|
|
92
|
+
if not converted:
|
|
93
|
+
result["note"] = "nothing to convert (already parameterized or no inline SQL)"
|
|
94
|
+
return result
|
|
95
|
+
|
|
96
|
+
valid, errors = _validate(client, flow)
|
|
97
|
+
result["isValid"] = valid
|
|
98
|
+
if not valid: # never PUT an invalid flow
|
|
99
|
+
result["errors"] = errors
|
|
100
|
+
result["put"] = False
|
|
101
|
+
return result
|
|
102
|
+
fe = run_fe_validation(client, flow)
|
|
103
|
+
result["fe"] = fe
|
|
104
|
+
if args.dry_run:
|
|
105
|
+
result["isValid"] = bool(valid and fe["clean"])
|
|
106
|
+
result["put"] = False
|
|
107
|
+
result["dry_run"] = True
|
|
108
|
+
return result
|
|
109
|
+
# The mark is stamped from the FE+BE verdict and then re-read: the platform stores
|
|
110
|
+
# whatever the body carries and never computes this field, so passing the fetched
|
|
111
|
+
# value through would leave a corrected process marked broken.
|
|
112
|
+
saved = save_flow(client, flow, flow_id=args.id, valid=valid and fe["clean"])
|
|
113
|
+
result["isValid"] = saved["isValid"]
|
|
114
|
+
result["stamped"] = saved["stamped"]
|
|
115
|
+
if "readback_error" in saved:
|
|
116
|
+
result["readback_error"] = saved["readback_error"]
|
|
117
|
+
result["put"] = True
|
|
118
|
+
return result
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _resolve_variable(flow: dict, key: str) -> str:
|
|
122
|
+
"""A flow variable's id, from its id or its name. Ambiguity is an error, never a guess."""
|
|
123
|
+
variables = flow.get("variables") or []
|
|
124
|
+
if any(v.get("id") == key for v in variables):
|
|
125
|
+
return key
|
|
126
|
+
matches = [v for v in variables if v.get("name") == key]
|
|
127
|
+
if not matches:
|
|
128
|
+
known = ", ".join(sorted(str(v.get("name")) for v in variables))
|
|
129
|
+
raise UsageError(f"variable not found: {key} (process has: {known})")
|
|
130
|
+
if len(matches) > 1:
|
|
131
|
+
raise UsageError(f"variable name {key!r} is ambiguous - pass its id instead")
|
|
132
|
+
return matches[0]["id"]
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def sql_convert(client, args) -> dict:
|
|
136
|
+
target = sqlparam.EQ_TEMPLATE if args.to == "query" else sqlparam.EC_TEMPLATE
|
|
137
|
+
flow = _fetch_flow(client, args.id)
|
|
138
|
+
node = sqlparam.find_node(flow, args.node)
|
|
139
|
+
if not node:
|
|
140
|
+
raise UsageError(f"node not found in process {args.id}: {args.node}")
|
|
141
|
+
|
|
142
|
+
changed, msg = sqlparam.convert_family(node, target)
|
|
143
|
+
result = {"id": args.id, "node": node.get("actionName"), "node_id": node.get("id"),
|
|
144
|
+
"to": target, "converted": changed, "msg": msg}
|
|
145
|
+
|
|
146
|
+
if args.output_variable:
|
|
147
|
+
var_id = _resolve_variable(flow, args.output_variable)
|
|
148
|
+
rebound, rmsg = sqlparam.rebind_output(node, var_id)
|
|
149
|
+
result["output_rebound"] = rebound
|
|
150
|
+
result["output_msg"] = rmsg
|
|
151
|
+
changed = changed or rebound
|
|
152
|
+
|
|
153
|
+
if not changed:
|
|
154
|
+
result["note"] = "nothing to change"
|
|
155
|
+
result["put"] = False
|
|
156
|
+
return result
|
|
157
|
+
|
|
158
|
+
valid, errors = _validate(client, flow)
|
|
159
|
+
result["isValid"] = valid
|
|
160
|
+
if not valid: # never PUT an invalid flow
|
|
161
|
+
result["errors"] = errors
|
|
162
|
+
result["put"] = False
|
|
163
|
+
return result
|
|
164
|
+
|
|
165
|
+
# The BE validator does not see designer save-blockers, and "Execute Query with a null Output"
|
|
166
|
+
# is exactly one of them — the case this conversion is most likely to create.
|
|
167
|
+
problems = _lint(client, flow)
|
|
168
|
+
result["lint_clean"] = not problems
|
|
169
|
+
if problems:
|
|
170
|
+
result["lint_problems"] = problems
|
|
171
|
+
result["put"] = False
|
|
172
|
+
return result
|
|
173
|
+
|
|
174
|
+
fe = run_fe_validation(client, flow)
|
|
175
|
+
result["fe"] = fe
|
|
176
|
+
if args.dry_run:
|
|
177
|
+
result["isValid"] = bool(valid and fe["clean"])
|
|
178
|
+
result["put"] = False
|
|
179
|
+
result["dry_run"] = True
|
|
180
|
+
return result
|
|
181
|
+
# The mark is stamped from the FE+BE verdict and then re-read: the platform stores
|
|
182
|
+
# whatever the body carries and never computes this field, so passing the fetched
|
|
183
|
+
# value through would leave a corrected process marked broken.
|
|
184
|
+
saved = save_flow(client, flow, flow_id=args.id, valid=valid and fe["clean"])
|
|
185
|
+
result["isValid"] = saved["isValid"]
|
|
186
|
+
result["stamped"] = saved["stamped"]
|
|
187
|
+
if "readback_error" in saved:
|
|
188
|
+
result["readback_error"] = saved["readback_error"]
|
|
189
|
+
result["put"] = True
|
|
190
|
+
return result
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def _scan_args(p: argparse.ArgumentParser) -> None:
|
|
194
|
+
add_profile_arg(p)
|
|
195
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def _param_args(p: argparse.ArgumentParser) -> None:
|
|
199
|
+
add_profile_arg(p)
|
|
200
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
201
|
+
p.add_argument("--node", help="node actionName or id to convert")
|
|
202
|
+
p.add_argument("--all", action="store_true", help="convert every inline SQL node in the process")
|
|
203
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
204
|
+
help="convert + validate but do not PUT")
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def _convert_args(p: argparse.ArgumentParser) -> None:
|
|
208
|
+
add_profile_arg(p)
|
|
209
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
210
|
+
p.add_argument("--node", required=True, help="node actionName or id to convert")
|
|
211
|
+
p.add_argument("--to", required=True, choices=("query", "command"),
|
|
212
|
+
help="target family: query (returns a result set) or command (returns rows affected)")
|
|
213
|
+
p.add_argument("--output-variable", dest="output_variable",
|
|
214
|
+
help="flow variable name or id to bind the node's Output to")
|
|
215
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
216
|
+
help="convert + validate + lint but do not PUT")
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
ACTIONS = {
|
|
220
|
+
"sql-convert": ActionDef(
|
|
221
|
+
func=sql_convert, add_args=_convert_args, needs_client=True,
|
|
222
|
+
description=("Move one SQL node between the Execute Command and Execute Query families "
|
|
223
|
+
"(--to) and optionally rebind its Output (--output-variable); validate + "
|
|
224
|
+
"flow-lint then PUT (--dry-run to preview). A SELECT-ing procedure on a Command "
|
|
225
|
+
"node discards its result set silently - this is the fix.")),
|
|
226
|
+
"sql-scan": ActionDef(
|
|
227
|
+
func=sql_scan, add_args=_scan_args, needs_client=True,
|
|
228
|
+
description="List a process's SQL Server actions (Execute Query/Command) with inline-vs-parameterized status."),
|
|
229
|
+
"sql-parameterize": ActionDef(
|
|
230
|
+
func=sql_parameterize, add_args=_param_args, needs_client=True,
|
|
231
|
+
description="Convert inline N'<%N%>' SQL nodes to safe named-@param binding (--node or --all); validate then PUT (--dry-run to preview)."),
|
|
232
|
+
}
|