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,447 @@
|
|
|
1
|
+
"""Curated CRUD-parity + verification-oracle actions.
|
|
2
|
+
|
|
3
|
+
Closes the ergonomic gaps the capability audit found: every resource had curated
|
|
4
|
+
create/edit but raw-only get/delete/list, and the verification oracles the notes
|
|
5
|
+
champion (validate, credential test, custom-action test) were only reachable
|
|
6
|
+
internally. Naming mirrors the existing `<resource>-create`/`-edit` pairs.
|
|
7
|
+
|
|
8
|
+
JSON in / JSON out; impure (live client). Thin wrappers over documented endpoints:
|
|
9
|
+
form/document/webhook/credential -get / -delete (+ -list for form/document)
|
|
10
|
+
process -delete / -validate / -toggle-activation
|
|
11
|
+
form -duplicate
|
|
12
|
+
webhook -launch
|
|
13
|
+
credential-test POST /api/Credentials/test (builds the DTO, returns the probe)
|
|
14
|
+
customaction-test POST /api/Actions/test
|
|
15
|
+
import POST /api/Transport/import (multipart .procesio, mirrors `export`)
|
|
16
|
+
"""
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import argparse
|
|
20
|
+
import json
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
|
|
23
|
+
from tools.procesio.actiondef import ActionDef
|
|
24
|
+
from tools.procesio.client import parse_json_arg
|
|
25
|
+
from tools.procesio.errors import ProcesioAPIError, UsageError
|
|
26
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def _id_args(p: argparse.ArgumentParser, help_text: str) -> None:
|
|
30
|
+
add_profile_arg(p)
|
|
31
|
+
p.add_argument("--id", required=True, help=help_text)
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
# -- factories for the thin get / delete / list / post-by-id wrappers ---------
|
|
35
|
+
|
|
36
|
+
def _get_action(path_tpl: str, help_text: str) -> ActionDef:
|
|
37
|
+
def fn(client, args):
|
|
38
|
+
return {"result": client.get(path_tpl.format(id=args.id))}
|
|
39
|
+
return ActionDef(func=fn, add_args=lambda p: _id_args(p, help_text), needs_client=True,
|
|
40
|
+
description=f"Get one resource by id (GET {path_tpl}).")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _delete_action(path_tpl: str, help_text: str) -> ActionDef:
|
|
44
|
+
def fn(client, args):
|
|
45
|
+
client.request("DELETE", path_tpl.format(id=args.id))
|
|
46
|
+
return {"deleted": True, "id": args.id}
|
|
47
|
+
return ActionDef(func=fn, add_args=lambda p: _id_args(p, help_text), needs_client=True,
|
|
48
|
+
description=f"Delete a resource by id (DELETE {path_tpl}).")
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def _list_action(path: str, desc: str) -> ActionDef:
|
|
52
|
+
def fn(client, args):
|
|
53
|
+
r = client.get(path)
|
|
54
|
+
items = r.get("pageItems") if isinstance(r, dict) and "pageItems" in r else r
|
|
55
|
+
return {"count": len(items) if isinstance(items, list) else None, "items": items}
|
|
56
|
+
return ActionDef(func=fn, add_args=add_profile_arg, needs_client=True, description=desc)
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def _post_by_id_action(path_tpl: str, help_text: str, result_key: str) -> ActionDef:
|
|
60
|
+
def fn(client, args):
|
|
61
|
+
resp = client.post(path_tpl.format(id=args.id))
|
|
62
|
+
return {result_key: True, "id": args.id, "result": resp}
|
|
63
|
+
return ActionDef(func=fn, add_args=lambda p: _id_args(p, help_text), needs_client=True,
|
|
64
|
+
description=f"POST {path_tpl}.")
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
# -- verification oracles + import (bespoke bodies) ---------------------------
|
|
68
|
+
|
|
69
|
+
def validate_process(client, args) -> dict:
|
|
70
|
+
"""Run PROCESIO's own validator on an existing process (POST /api/Projects/validate
|
|
71
|
+
with the flow DTO). An EMPTY 200 response means VALID; validation failures come back
|
|
72
|
+
as an error list (surfaced whether the platform returns 200-with-errors or a 4xx)."""
|
|
73
|
+
flow = client.get(f"/api/Projects/{args.id}")
|
|
74
|
+
flow = flow.get("flow") if isinstance(flow, dict) and "flow" in flow else flow
|
|
75
|
+
try:
|
|
76
|
+
res = client.post("/api/Projects/validate", flow)
|
|
77
|
+
except ProcesioAPIError as e:
|
|
78
|
+
det = e.details if isinstance(e.details, dict) else {"body": e.details}
|
|
79
|
+
return {"id": args.id, "isValid": False, "errors": det.get("body", det)}
|
|
80
|
+
empty = (not res) or (isinstance(res, dict) and list(res.keys()) == ["raw_text"] and not res["raw_text"])
|
|
81
|
+
if empty:
|
|
82
|
+
return {"id": args.id, "isValid": True, "errors": []}
|
|
83
|
+
errs = (res.get("errors") or res.get("validationErrors")) if isinstance(res, dict) else None
|
|
84
|
+
valid = res.get("isValid") if isinstance(res, dict) else None
|
|
85
|
+
return {"id": args.id, "isValid": valid if valid is not None else (not errs), "errors": errs, "result": res}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def credential_test(client, args) -> dict:
|
|
89
|
+
"""Build a credential DTO from a config and run the live connection probe
|
|
90
|
+
(POST /api/Credentials/test) WITHOUT saving it — the notes' 'connection oracle'."""
|
|
91
|
+
from tools.procesio.dto.credential import builder as cb
|
|
92
|
+
cfg = parse_json_arg(args.config, "config") if args.config else \
|
|
93
|
+
json.loads(Path(args.config_file).read_text(encoding="utf-8"))
|
|
94
|
+
ctx = cb.prepare_ctx(client, cfg) # resolves the template (+ probes)
|
|
95
|
+
dto = cb.build(cfg, ctx)
|
|
96
|
+
res = client.post("/api/Credentials/test", dto)
|
|
97
|
+
ok = isinstance(res, dict) and res.get("isSuccess") is True
|
|
98
|
+
return {"tested": True, "isSuccess": ok, "result": res}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def customaction_test(client, args) -> dict:
|
|
102
|
+
"""Run a single action in TEST mode and return its resolved result.
|
|
103
|
+
|
|
104
|
+
Two ways to say what to test:
|
|
105
|
+
--body / --body-file : a full DetailedTestAction request (power users).
|
|
106
|
+
--action + --values : friendly - the request is built from the live catalog
|
|
107
|
+
(a built-in action OR any custom action in the
|
|
108
|
+
workspace), binding each supplied input and every
|
|
109
|
+
output to a fresh test variable, exactly as the
|
|
110
|
+
designer's side-panel "Test" does.
|
|
111
|
+
|
|
112
|
+
`POST /api/Actions/test` only STARTS the test and hands back a server-assigned
|
|
113
|
+
test id; the result is produced asynchronously (the designer receives it over
|
|
114
|
+
SignalR). This polls `GET /api/Actions/test/{id}` until it resolves and returns
|
|
115
|
+
`{status, errorMessage, errorCode, testResult, variables}`. `testResult` maps
|
|
116
|
+
each OUTPUT variable id to the value the action produced; `errorMessage` carries
|
|
117
|
+
the action's exception text when it failed."""
|
|
118
|
+
timeout = getattr(args, "timeout", None) or 60
|
|
119
|
+
if args.body or args.body_file:
|
|
120
|
+
body = parse_json_arg(args.body, "body") if args.body else \
|
|
121
|
+
json.loads(Path(args.body_file).read_text(encoding="utf-8"))
|
|
122
|
+
else:
|
|
123
|
+
if not getattr(args, "action", None):
|
|
124
|
+
raise UsageError("provide --body/--body-file, or --action (+ --values)")
|
|
125
|
+
values = {}
|
|
126
|
+
if getattr(args, "values", None):
|
|
127
|
+
values = parse_json_arg(args.values, "values")
|
|
128
|
+
elif getattr(args, "values_file", None):
|
|
129
|
+
values = json.loads(Path(args.values_file).read_text(encoding="utf-8"))
|
|
130
|
+
body = _build_test_request(client, args.action, values)
|
|
131
|
+
return _run_test_action(client, body, timeout)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _build_test_request(client, action_ref, values) -> dict:
|
|
135
|
+
"""Build a DetailedTestAction request from the live catalog. Each supplied input
|
|
136
|
+
value and every output is bound to a fresh test variable (VariableDto Type 10
|
|
137
|
+
for input, 30 for output), mirroring what the designer sends."""
|
|
138
|
+
import uuid
|
|
139
|
+
from tools.procesio.dto.process import builder as pb
|
|
140
|
+
|
|
141
|
+
# Catalog = bundled built-ins + the workspace's custom actions (fast, scoped
|
|
142
|
+
# fetch). This is what lets --action name ANY custom action in the workspace.
|
|
143
|
+
try:
|
|
144
|
+
rc = pb._fetch_custom_actions(client)
|
|
145
|
+
custom = (rc.get("actions") if isinstance(rc, dict) else rc) or []
|
|
146
|
+
except Exception: # noqa: BLE001 - built-ins still resolve from the bundled catalog
|
|
147
|
+
custom = []
|
|
148
|
+
ctx = {"catalog": pb.catalog_index(extra=list(custom))}
|
|
149
|
+
template = pb._resolve_template(str(action_ref), ctx)
|
|
150
|
+
gtid = template.get("actionId") or template.get("id")
|
|
151
|
+
|
|
152
|
+
props = pb._property_index(template)
|
|
153
|
+
by_id = {}
|
|
154
|
+
for prop in props.values():
|
|
155
|
+
pid = prop.get("id")
|
|
156
|
+
if pid:
|
|
157
|
+
by_id[pid] = prop
|
|
158
|
+
|
|
159
|
+
# map each supplied value (by label or id) to a property id
|
|
160
|
+
want = {}
|
|
161
|
+
for key, val in (values or {}).items():
|
|
162
|
+
prop = props.get(str(key).strip().lower()) or by_id.get(str(key))
|
|
163
|
+
if not prop:
|
|
164
|
+
raise UsageError(
|
|
165
|
+
f"test value {key!r} does not match any property of {action_ref!r}")
|
|
166
|
+
want[prop["id"]] = val
|
|
167
|
+
|
|
168
|
+
variables, parameters, test_values = [], [], []
|
|
169
|
+
counter = 0
|
|
170
|
+
for pid, prop in by_id.items():
|
|
171
|
+
direction = prop.get("direction")
|
|
172
|
+
dtid = prop.get("dataTypeId")
|
|
173
|
+
name = prop.get("label") or pid
|
|
174
|
+
if direction == 1: # input: only bind what the caller supplied
|
|
175
|
+
if pid not in want:
|
|
176
|
+
continue
|
|
177
|
+
vid = str(uuid.uuid4())
|
|
178
|
+
variables.append({"Id": vid, "DataType": dtid, "Type": 10, "Name": name,
|
|
179
|
+
"IsList": False, "IsError": False, "IsRequired": False})
|
|
180
|
+
parameters.append({"TabPropertyId": pid, "Value": f"<%{counter}%>",
|
|
181
|
+
"Variable": [{"id": counter, "variableId": vid, "attribute": None}]})
|
|
182
|
+
test_values.append({"VariableId": vid, "Value": want[pid], "Attribute": None})
|
|
183
|
+
counter += 1
|
|
184
|
+
elif direction == 3: # output: bind so its value comes back in testResult
|
|
185
|
+
vid = str(uuid.uuid4())
|
|
186
|
+
variables.append({"Id": vid, "DataType": dtid, "Type": 30, "Name": name,
|
|
187
|
+
"IsList": False, "IsError": False, "IsRequired": False})
|
|
188
|
+
parameters.append({"TabPropertyId": pid, "Value": f"<%{counter}%>",
|
|
189
|
+
"Variable": [{"id": counter, "variableId": vid, "attribute": None}]})
|
|
190
|
+
counter += 1
|
|
191
|
+
|
|
192
|
+
return {"variables": variables, "Gid": str(uuid.uuid4()),
|
|
193
|
+
"Action": {"gtid": gtid, "parameters": parameters},
|
|
194
|
+
"TestValues": test_values, "ConnectionId": None}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _run_test_action(client, body, timeout) -> dict:
|
|
198
|
+
"""POST the test, then poll GET /api/Actions/test/{id} until it resolves."""
|
|
199
|
+
import time
|
|
200
|
+
started = client.post("/api/Actions/test", body,
|
|
201
|
+
read_timeout=min(int(timeout), 60) + 30, deadline=None)
|
|
202
|
+
inst = started.get("testActionInstance") if isinstance(started, dict) else None
|
|
203
|
+
gid = (inst or {}).get("gid") if isinstance(inst, dict) else None
|
|
204
|
+
if not gid: # fall back to the request Gid if the shape differs
|
|
205
|
+
gid = (body or {}).get("Gid")
|
|
206
|
+
deadline = time.monotonic() + timeout
|
|
207
|
+
last = None
|
|
208
|
+
while time.monotonic() < deadline:
|
|
209
|
+
time.sleep(3)
|
|
210
|
+
try:
|
|
211
|
+
g = client.get(f"/api/Actions/test/{gid}")
|
|
212
|
+
except Exception: # noqa: BLE001 - not ready yet (the result row 500s until written)
|
|
213
|
+
continue
|
|
214
|
+
last = g
|
|
215
|
+
# Test-action terminal codes: 40 = done (result in testResult), 90 = failed
|
|
216
|
+
# (errorMessage set); 50 is accepted defensively. errorMessage also ends it.
|
|
217
|
+
if isinstance(g, dict) and (g.get("status") in (40, 50, 90) or g.get("errorMessage")):
|
|
218
|
+
break
|
|
219
|
+
result = last if isinstance(last, dict) else {}
|
|
220
|
+
tr = result.get("testResult")
|
|
221
|
+
if isinstance(tr, str):
|
|
222
|
+
try:
|
|
223
|
+
tr = json.loads(tr)
|
|
224
|
+
except Exception: # noqa: BLE001 - leave it as the raw string
|
|
225
|
+
pass
|
|
226
|
+
return {"tested": True, "gid": gid, "status": result.get("status"),
|
|
227
|
+
"errorMessage": result.get("errorMessage"), "errorCode": result.get("errorCode"),
|
|
228
|
+
"testResult": tr, "variables": result.get("variables")}
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
def webhook_launch(client, args) -> dict:
|
|
232
|
+
"""Fire a webhook-triggered process with a payload (POST /api/Webhooks/launch/{id})."""
|
|
233
|
+
payload = parse_json_arg(args.payload, "payload") if args.payload else None
|
|
234
|
+
return {"launched": True, "id": args.id,
|
|
235
|
+
"result": client.post(f"/api/Webhooks/launch/{args.id}", payload)}
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# `POST /api/Transport/import` takes SEVEN required boolean headers, one per
|
|
239
|
+
# entity category plus the overwrite switch. They default to including
|
|
240
|
+
# everything, because a pack is normally imported whole and a silently skipped
|
|
241
|
+
# category is the failure this endpoint is worst at reporting.
|
|
242
|
+
_IMPORT_FLAGS = {
|
|
243
|
+
"override_data": "overrideData",
|
|
244
|
+
"data_types": "importDataTypes",
|
|
245
|
+
"flows": "importFlows",
|
|
246
|
+
"credentials": "importCredentials",
|
|
247
|
+
"documents": "importDocuments",
|
|
248
|
+
"forms": "importForms",
|
|
249
|
+
"data_stores": "importDataStores",
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def import_bundle(client, args) -> dict:
|
|
254
|
+
"""Import components from a .procesio bundle (POST /api/Transport/import,
|
|
255
|
+
multipart). Mirrors the curated `export`.
|
|
256
|
+
|
|
257
|
+
⚠ TWO THINGS THIS ENDPOINT IS UNFORGIVING ABOUT, both learned the hard way:
|
|
258
|
+
|
|
259
|
+
* the file part is named **`importedData`**, not `file`. A wrongly named
|
|
260
|
+
part is not reported as such.
|
|
261
|
+
* the seven boolean headers are **required** (`[FromHeader]` value types).
|
|
262
|
+
Omitting them is a malformed request.
|
|
263
|
+
|
|
264
|
+
⚠ AND IT ANSWERS `403 Forbidden` WITH THE BODY `MIGRATE` ON *ANY* ERROR -
|
|
265
|
+
a malformed request and a genuine permission failure are indistinguishable
|
|
266
|
+
from the response alone. It also requires `Workspace:Admin`. So the result
|
|
267
|
+
below ECHOES the headers that were sent: without that, a 403 cannot be read
|
|
268
|
+
against the request that caused it, and the obvious reading ("we lack the
|
|
269
|
+
permission") may simply be wrong.
|
|
270
|
+
"""
|
|
271
|
+
path = Path(args.file)
|
|
272
|
+
if not path.is_file():
|
|
273
|
+
raise UsageError(f"bundle file not found: {args.file}")
|
|
274
|
+
data = path.read_bytes()
|
|
275
|
+
headers = {}
|
|
276
|
+
for dest, wire in _IMPORT_FLAGS.items():
|
|
277
|
+
off = getattr(args, "no_" + dest, False)
|
|
278
|
+
headers[wire] = "false" if off else "true"
|
|
279
|
+
try:
|
|
280
|
+
resp = client.request_multipart(
|
|
281
|
+
"/api/Transport/import",
|
|
282
|
+
files={"importedData": (path.name, data,
|
|
283
|
+
"application/octet-stream")},
|
|
284
|
+
headers=headers)
|
|
285
|
+
except ProcesioAPIError as e:
|
|
286
|
+
# surface the request alongside the opaque refusal
|
|
287
|
+
raise ProcesioAPIError(
|
|
288
|
+
getattr(e, "status", None) or 0,
|
|
289
|
+
"import failed. ⚠ This endpoint returns 403/MIGRATE on ANY error, "
|
|
290
|
+
"including a malformed request, and requires Workspace:Admin — a "
|
|
291
|
+
"403 here is not by itself evidence of a permission problem",
|
|
292
|
+
{"headers_sent": headers, "file": path.name,
|
|
293
|
+
"bytes": len(data), "underlying": str(e)[:300]}) from e
|
|
294
|
+
return {"imported": True, "file": path.name, "bytes": len(data),
|
|
295
|
+
"headers_sent": headers, "result": resp}
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
def _import_args(p: argparse.ArgumentParser) -> None:
|
|
299
|
+
add_profile_arg(p)
|
|
300
|
+
p.add_argument("--file", required=True,
|
|
301
|
+
help="path to the .procesio bundle to import")
|
|
302
|
+
for dest, wire in _IMPORT_FLAGS.items():
|
|
303
|
+
p.add_argument("--no-" + dest.replace("_", "-"),
|
|
304
|
+
dest="no_" + dest, action="store_true",
|
|
305
|
+
help="send %s=false (default true)" % wire)
|
|
306
|
+
|
|
307
|
+
|
|
308
|
+
def _cred_test_args(p: argparse.ArgumentParser) -> None:
|
|
309
|
+
add_profile_arg(p)
|
|
310
|
+
p.add_argument("--config", help="credential config as a JSON object")
|
|
311
|
+
p.add_argument("--config-file", dest="config_file", help="path to a credential JSON config file")
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def _ca_test_args(p: argparse.ArgumentParser) -> None:
|
|
315
|
+
add_profile_arg(p)
|
|
316
|
+
p.add_argument("--action",
|
|
317
|
+
help="action to test, by name or template id (built-in or a "
|
|
318
|
+
"workspace custom action); the request is built from the catalog")
|
|
319
|
+
p.add_argument("--values",
|
|
320
|
+
help="input values as a JSON object {property label or id: value}")
|
|
321
|
+
p.add_argument("--values-file", dest="values_file",
|
|
322
|
+
help="path to the input-values JSON")
|
|
323
|
+
p.add_argument("--timeout", type=int, default=60,
|
|
324
|
+
help="seconds to poll for the result (default 60)")
|
|
325
|
+
p.add_argument("--body", help="full DetailedTestAction request as a JSON object")
|
|
326
|
+
p.add_argument("--body-file", dest="body_file", help="path to the request JSON")
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
def _launch_args(p: argparse.ArgumentParser) -> None:
|
|
330
|
+
add_profile_arg(p)
|
|
331
|
+
p.add_argument("--id", required=True, help="webhook id")
|
|
332
|
+
p.add_argument("--payload", help="JSON payload to send to the webhook")
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def _toggle_args(p: argparse.ArgumentParser) -> None:
|
|
336
|
+
_id_args(p, "process (project) id")
|
|
337
|
+
p.add_argument("--state", required=True, choices=["true", "false"],
|
|
338
|
+
help="target state: true activates, false deactivates (sent as the "
|
|
339
|
+
"`state` header the endpoint reads; it is a setter, not a toggle)")
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def _read_active(client, pid: str):
|
|
343
|
+
"""The ONLY trustworthy activation read: the `active` field of the list projection.
|
|
344
|
+
|
|
345
|
+
Best-effort by design - a process past page 1 of a large workspace is simply not
|
|
346
|
+
found, and that has to read as "unknown" rather than "inactive".
|
|
347
|
+
"""
|
|
348
|
+
try:
|
|
349
|
+
listing = client.get("/api/Projects") or {}
|
|
350
|
+
row = next((p for p in (listing.get("pageItems") or [])
|
|
351
|
+
if str(p.get("id")) == str(pid)), None)
|
|
352
|
+
return row.get("active") if row is not None else None
|
|
353
|
+
except Exception: # noqa: BLE001 - advisory read; never mask the caller's own call
|
|
354
|
+
return None
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
def toggle_activation(client, args) -> dict:
|
|
358
|
+
"""Set a process's activation state (PATCH /api/Projects/{id}/toggle-activation).
|
|
359
|
+
|
|
360
|
+
Despite the endpoint's name this is a SETTER, not a toggle. It reads the target
|
|
361
|
+
state from a `state` REQUEST HEADER - `state: true` activates, `state: false`
|
|
362
|
+
deactivates - and the header is the only way to say which you want: the path
|
|
363
|
+
carries the id, the body is `{}`, and nothing else in the request differs between
|
|
364
|
+
the two directions.
|
|
365
|
+
|
|
366
|
+
Called without the header it deactivates every time while answering
|
|
367
|
+
`{"value": null, "errors": []}`, which is what this action used to do: it looked
|
|
368
|
+
like an endpoint that could only ever turn things off. It was our omission, not a
|
|
369
|
+
platform defect. The designer sends the header on both directions, which is how
|
|
370
|
+
the two behaviours were finally told apart.
|
|
371
|
+
|
|
372
|
+
The response is the same either way and reports nothing, so the state is still read
|
|
373
|
+
back from the list-processes projection - the only trustworthy source for `active`
|
|
374
|
+
(`GET /api/Projects/{id}.status` is a different field). `changed` compares the two
|
|
375
|
+
reads rather than trusting the echo, and stays None when the process cannot be
|
|
376
|
+
found in the projection, because unknown must not read as "did not change".
|
|
377
|
+
"""
|
|
378
|
+
want = str(getattr(args, "state", "") or "").strip().lower()
|
|
379
|
+
if want not in ("true", "false"):
|
|
380
|
+
raise UsageError("--state is required and must be true or false: "
|
|
381
|
+
"the endpoint sets the state, it does not flip it")
|
|
382
|
+
target = want == "true"
|
|
383
|
+
before = _read_active(client, args.id)
|
|
384
|
+
patch = client.request("PATCH", f"/api/Projects/{args.id}/toggle-activation",
|
|
385
|
+
body={}, headers={"state": want})
|
|
386
|
+
active = _read_active(client, args.id)
|
|
387
|
+
out = {"id": args.id, "requested": target, "active": active,
|
|
388
|
+
"active_before": before, "patch_result": patch,
|
|
389
|
+
"changed": None if (before is None or active is None) else before != active}
|
|
390
|
+
if active is None:
|
|
391
|
+
out["warning"] = (
|
|
392
|
+
"could not confirm activation from the list-processes projection; the PATCH "
|
|
393
|
+
"response is NOT a reliable signal (it reports success either way) - verify "
|
|
394
|
+
"in the designer or re-run list-processes and read `active`.")
|
|
395
|
+
elif active is not target:
|
|
396
|
+
out["warning"] = (
|
|
397
|
+
f"asked for active={target} but the process reads active={active} after the "
|
|
398
|
+
"call, and the endpoint reported success. Verify in the designer.")
|
|
399
|
+
return out
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
ACTIONS = {
|
|
403
|
+
# -- get by id (parity with get-process) --
|
|
404
|
+
"form-get": _get_action("/api/FormTemplate/{id}", "form template id"),
|
|
405
|
+
"document-get": _get_action("/api/DocumentTemplate/{id}", "document template id"),
|
|
406
|
+
"webhook-get": _get_action("/api/Webhooks/{id}", "webhook id"),
|
|
407
|
+
"credential-get": _get_action("/api/Credentials/{id}", "credential id"),
|
|
408
|
+
# -- delete by id (teardown parity) --
|
|
409
|
+
"process-delete": _delete_action("/api/Projects/{id}", "process (project) id"),
|
|
410
|
+
"form-delete": _delete_action("/api/FormTemplate/{id}", "form template id"),
|
|
411
|
+
"document-delete": _delete_action("/api/DocumentTemplate/{id}", "document template id"),
|
|
412
|
+
"webhook-delete": _delete_action("/api/Webhooks/{id}", "webhook id"),
|
|
413
|
+
"credential-delete": _delete_action("/api/Credentials/{id}", "credential id"),
|
|
414
|
+
# -- list (parity with list-processes / list-datatypes) --
|
|
415
|
+
"form-list": _list_action("/api/FormTemplate/all/basic", "List forms (GET /api/FormTemplate/all/basic)."),
|
|
416
|
+
"document-list": _list_action("/api/DocumentTemplate", "List documents (GET /api/DocumentTemplate)."),
|
|
417
|
+
# -- duplicate / activation --
|
|
418
|
+
"form-duplicate": _post_by_id_action("/api/FormTemplate/{id}/duplicate", "form template id", "duplicated"),
|
|
419
|
+
"process-toggle-activation": ActionDef(
|
|
420
|
+
func=toggle_activation,
|
|
421
|
+
add_args=_toggle_args, needs_client=True,
|
|
422
|
+
description="Activate or deactivate a process (PATCH /api/Projects/{id}/toggle-activation). "
|
|
423
|
+
"--state true|false is REQUIRED: despite its name the endpoint is a setter, "
|
|
424
|
+
"and it reads the target from a `state` request header - called without it, it "
|
|
425
|
+
"deactivates every time while reporting success. The response says nothing "
|
|
426
|
+
"either way, so this reads `active` before and after from the list-processes "
|
|
427
|
+
"projection and warns when the result is not what was asked for."),
|
|
428
|
+
# -- verification oracles --
|
|
429
|
+
"process-validate": ActionDef(
|
|
430
|
+
func=validate_process, add_args=lambda p: _id_args(p, "process (project) id"), needs_client=True,
|
|
431
|
+
description="Validate a process with PROCESIO's own validator (POST /api/Projects/validate)."),
|
|
432
|
+
"credential-test": ActionDef(
|
|
433
|
+
func=credential_test, add_args=_cred_test_args, needs_client=True,
|
|
434
|
+
description="Live-test a credential config without saving it (POST /api/Credentials/test)."),
|
|
435
|
+
"customaction-test": ActionDef(
|
|
436
|
+
func=customaction_test, add_args=_ca_test_args, needs_client=True,
|
|
437
|
+
description="Run a single action in TEST mode and return its resolved result (--action + "
|
|
438
|
+
"--values builds the request from the catalog, incl. a workspace custom "
|
|
439
|
+
"action; or pass --body). Polls GET /api/Actions/test/{id}; returns status, "
|
|
440
|
+
"errorMessage and testResult."),
|
|
441
|
+
"webhook-launch": ActionDef(
|
|
442
|
+
func=webhook_launch, add_args=_launch_args, needs_client=True,
|
|
443
|
+
description="Fire a webhook-triggered process with a payload (POST /api/Webhooks/launch/{id})."),
|
|
444
|
+
"import": ActionDef(
|
|
445
|
+
func=import_bundle, add_args=_import_args, needs_client=True,
|
|
446
|
+
description="Import components from a .procesio bundle (POST /api/Transport/import); mirrors export."),
|
|
447
|
+
}
|