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,146 @@
|
|
|
1
|
+
"""Environment-management actions (no HTTP - they only touch the local registry).
|
|
2
|
+
|
|
3
|
+
A PROCESIO environment is one installation, named `<Client>-<ENV>`, carrying the
|
|
4
|
+
host URLs it lives on (see environments.py). These actions let a user list the
|
|
5
|
+
known environments, add a client-specific one, switch the default (the natural
|
|
6
|
+
"I want to work on PROCESIO Internal-QA" gesture), and remove a user-defined one.
|
|
7
|
+
|
|
8
|
+
Built-in Internal-PROD/QA/DEV always exist and are shared with every teammate;
|
|
9
|
+
switching to one needs no setup beyond a credential bound to it.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
|
|
15
|
+
from tools.procesio import environments, profiles
|
|
16
|
+
from tools.procesio.actiondef import ActionDef
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def _creds_by_environment() -> dict[str, list[str]]:
|
|
20
|
+
"""Credential names grouped by the environment they are bound to (unbound ->
|
|
21
|
+
Internal-PROD), so listings can show which environments are usable."""
|
|
22
|
+
out: dict[str, list[str]] = {}
|
|
23
|
+
for name in profiles.profile_names():
|
|
24
|
+
blob = profiles.get_profile(name)
|
|
25
|
+
env = blob.get("environment") or environments.DEFAULT_ENV_NAME
|
|
26
|
+
out.setdefault(env, []).append(name)
|
|
27
|
+
return out
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
# -- list-environments ------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
def list_environments(_args) -> dict:
|
|
33
|
+
default = environments.get_default()
|
|
34
|
+
by_env = _creds_by_environment()
|
|
35
|
+
out = []
|
|
36
|
+
for name in sorted(environments.all_environments()):
|
|
37
|
+
env = environments.get(name)
|
|
38
|
+
out.append({
|
|
39
|
+
"name": name,
|
|
40
|
+
"client": env.get("client"),
|
|
41
|
+
"env": env.get("env"),
|
|
42
|
+
"builtin": bool(env.get("builtin")),
|
|
43
|
+
"is_default": (name == default),
|
|
44
|
+
"web_base": env.get("web_base"),
|
|
45
|
+
"app_base": env.get("app_base"),
|
|
46
|
+
"forms_base": env.get("forms_base"),
|
|
47
|
+
"credentials": by_env.get(name, []),
|
|
48
|
+
})
|
|
49
|
+
return {
|
|
50
|
+
"count": len(out),
|
|
51
|
+
"default_environment": default,
|
|
52
|
+
"environments": out,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
# -- add-environment --------------------------------------------------------
|
|
57
|
+
|
|
58
|
+
def _add_args(p: argparse.ArgumentParser) -> None:
|
|
59
|
+
p.add_argument("--name", required=True,
|
|
60
|
+
help="environment name, '<Client>-<ENV>' e.g. Acme-PROD")
|
|
61
|
+
p.add_argument("--web-base", dest="web_base", required=True,
|
|
62
|
+
help="Web API host, e.g. https://webapi.acme.example")
|
|
63
|
+
p.add_argument("--app-base", dest="app_base", required=True,
|
|
64
|
+
help="designer / front-end host, e.g. https://acme.example")
|
|
65
|
+
p.add_argument("--forms-base", dest="forms_base", required=True,
|
|
66
|
+
help="public forms host, e.g. https://forms.acme.example")
|
|
67
|
+
p.add_argument("--auth-base", dest="auth_base",
|
|
68
|
+
help="legacy auth host (optional; login uses the web host)")
|
|
69
|
+
p.add_argument("--client", help="client label (default: derived from the name)")
|
|
70
|
+
p.add_argument("--env", help="env label e.g. PROD/QA/DEV (default: derived from the name)")
|
|
71
|
+
p.add_argument("--make-default", dest="make_default", action="store_true",
|
|
72
|
+
help="switch the default environment to this one")
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def add_environment(args) -> dict:
|
|
76
|
+
entry = environments.add(
|
|
77
|
+
args.name, web_base=args.web_base, app_base=args.app_base,
|
|
78
|
+
forms_base=args.forms_base, auth_base=args.auth_base,
|
|
79
|
+
client=args.client, env=args.env, make_default=args.make_default,
|
|
80
|
+
)
|
|
81
|
+
return {
|
|
82
|
+
"saved": True,
|
|
83
|
+
"environment": entry,
|
|
84
|
+
"default_environment": environments.get_default(),
|
|
85
|
+
"note": "environments are non-secret host URLs; bind a credential with "
|
|
86
|
+
"add-credential --environment " + entry["name"],
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
# -- set-environment (switch the default) -----------------------------------
|
|
91
|
+
|
|
92
|
+
def _name_arg(p: argparse.ArgumentParser) -> None:
|
|
93
|
+
p.add_argument("--name", required=True, help="environment name to switch to")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def set_environment(args) -> dict:
|
|
97
|
+
canon = environments.set_default(args.name)
|
|
98
|
+
env = environments.get(canon)
|
|
99
|
+
creds = _creds_by_environment().get(canon, [])
|
|
100
|
+
return {
|
|
101
|
+
"default_environment": canon,
|
|
102
|
+
"web_base": env.get("web_base"),
|
|
103
|
+
"app_base": env.get("app_base"),
|
|
104
|
+
"forms_base": env.get("forms_base"),
|
|
105
|
+
"credentials": creds,
|
|
106
|
+
"note": ("no credential is bound to this environment yet — add one with "
|
|
107
|
+
f"add-credential --environment {canon}") if not creds else
|
|
108
|
+
(f"using credential '{creds[0]}'" if len(creds) == 1 else
|
|
109
|
+
"multiple credentials bound — pass --profile to pick one"),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def remove_environment(args) -> dict:
|
|
114
|
+
environments.remove(args.name)
|
|
115
|
+
return {"removed": args.name, "default_environment": environments.get_default()}
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
def show_environment(args) -> dict:
|
|
119
|
+
env = environments.get(args.name)
|
|
120
|
+
creds = _creds_by_environment().get(env["name"], [])
|
|
121
|
+
return {**env, "is_default": env["name"] == environments.get_default(),
|
|
122
|
+
"credentials": creds}
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
ACTIONS = {
|
|
126
|
+
"list-environments": ActionDef(
|
|
127
|
+
func=list_environments,
|
|
128
|
+
description="List known PROCESIO environments (URLs, default, bound credentials).",
|
|
129
|
+
),
|
|
130
|
+
"add-environment": ActionDef(
|
|
131
|
+
func=add_environment, add_args=_add_args,
|
|
132
|
+
description="Add a client environment (<Client>-<ENV> + its host URLs) to the registry.",
|
|
133
|
+
),
|
|
134
|
+
"set-environment": ActionDef(
|
|
135
|
+
func=set_environment, add_args=_name_arg,
|
|
136
|
+
description="Switch the default environment (e.g. to Internal-QA); persists the choice.",
|
|
137
|
+
),
|
|
138
|
+
"remove-environment": ActionDef(
|
|
139
|
+
func=remove_environment, add_args=_name_arg,
|
|
140
|
+
description="Remove a user-defined environment (built-in Internal-* cannot be removed).",
|
|
141
|
+
),
|
|
142
|
+
"show-environment": ActionDef(
|
|
143
|
+
func=show_environment, add_args=_name_arg,
|
|
144
|
+
description="Show one environment's URLs, default flag, and bound credentials.",
|
|
145
|
+
),
|
|
146
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""Front-end (designer-layer) process validation — live action + the save gate.
|
|
2
|
+
|
|
3
|
+
This is the impure (client-facing) layer over flowmodel.fevalidation (pure). It:
|
|
4
|
+
* gathers the datatype catalog + subprocess-variable resolver from the live API,
|
|
5
|
+
* runs the pure FE validator (the designer "Process Errors" checks),
|
|
6
|
+
* exposes `process-fe-validate` (validate a live process by id),
|
|
7
|
+
* provides `pre_save_validate()` — the gate every process save runs: FE first, then
|
|
8
|
+
the BE validator (POST /api/Projects/validate), blocking the save on either unless
|
|
9
|
+
--force is passed.
|
|
10
|
+
|
|
11
|
+
Why a gate: POST /api/Projects/validate only checks the RUNTIME layer and returns EMPTY
|
|
12
|
+
even when the designer would REFUSE to save. Running the FE checks here means a
|
|
13
|
+
tool-driven save is held to the SAME bar as a human clicking Save in the designer —
|
|
14
|
+
without a conscious decision each time (CLAUDE.md: verify before done).
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
|
|
20
|
+
from tools.procesio.actiondef import ActionDef
|
|
21
|
+
from tools.procesio.client import VARIABLES_ONLY
|
|
22
|
+
from tools.procesio.errors import ProcesioAPIError, ValidationBlocked
|
|
23
|
+
from tools.procesio.flowmodel import fevalidation as fv
|
|
24
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
25
|
+
|
|
26
|
+
_SUB_TEMPLATES = ("Call Subprocess", "Trigger Subprocess")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
# -- gather live context for the pure validator -------------------------------
|
|
30
|
+
|
|
31
|
+
def _load_datatypes(client) -> list[dict]:
|
|
32
|
+
try:
|
|
33
|
+
r = client.get("/api/DataTypes", {"pageNumber": 1, "pageItemCount": 1000,
|
|
34
|
+
"includeProcesioEntries": True,
|
|
35
|
+
"includeExternalEntries": True})
|
|
36
|
+
except Exception: # noqa: BLE001 - the type layer is best-effort / non-blocking
|
|
37
|
+
return []
|
|
38
|
+
items = r.get("pageItems") if isinstance(r, dict) else r
|
|
39
|
+
return items or []
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def _subprocess_resolver(client):
|
|
43
|
+
"""target_vars_of(flow_id) -> {var_id: var_dict}, cached, network-tolerant."""
|
|
44
|
+
cache: dict = {}
|
|
45
|
+
|
|
46
|
+
def resolve(fid: str) -> dict:
|
|
47
|
+
if fid not in cache:
|
|
48
|
+
try:
|
|
49
|
+
r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
|
|
50
|
+
f = r.get("flow", r) if isinstance(r, dict) else r
|
|
51
|
+
cache[fid] = {v["id"]: v for v in (f.get("variables") or [])}
|
|
52
|
+
except Exception: # noqa: BLE001 - unreadable target: can't assert its contract
|
|
53
|
+
cache[fid] = {}
|
|
54
|
+
return cache[fid]
|
|
55
|
+
|
|
56
|
+
return resolve
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
def run_fe_validation(client, flow: dict, *, include_types: bool = True,
|
|
60
|
+
with_datatypes: bool = True) -> dict:
|
|
61
|
+
"""Run the pure FE validator against a flow DTO, gathering live context. Returns a
|
|
62
|
+
report: {clean, error_count, warning_count, errors, warnings}."""
|
|
63
|
+
flow = flow.get("flow", flow) if isinstance(flow, dict) else flow
|
|
64
|
+
datatypes = _load_datatypes(client) if (include_types and with_datatypes) else None
|
|
65
|
+
resolver = _subprocess_resolver(client)
|
|
66
|
+
all_w = fv.validate_flow(flow, datatypes=datatypes, target_vars_of=resolver,
|
|
67
|
+
include_types=include_types)
|
|
68
|
+
all_w.extend(_flowlint_extras(client, flow, resolver))
|
|
69
|
+
errs, warns = fv.split_severity(all_w)
|
|
70
|
+
return {"clean": not errs, "error_count": len(errs), "warning_count": len(warns),
|
|
71
|
+
"errors": errs, "warnings": warns}
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
# flow-lint (handlers/flowlint.py) covers three designer save-blockers that are NOT in the
|
|
75
|
+
# FE reference file: a stale subprocess side-pannel id, an Execute-Query with a null/bad
|
|
76
|
+
# Output, and Node code binding an error-scope/undeclared variable. Fold ONLY those unique
|
|
77
|
+
# checks into the gate (the subprocess-mapping ones overlap fevalidation's checkSubprocess,
|
|
78
|
+
# so they're excluded to avoid double-reporting). Best-effort: a flow-lint infra hiccup must
|
|
79
|
+
# never break a legitimate save, so any failure yields no extra findings.
|
|
80
|
+
_FLOWLINT_UNIQUE = {
|
|
81
|
+
"SIDEPANEL_ID", "EXECQUERY_NO_OUTPUT", "EXECQUERY_OUTPUT_UNDECLARED",
|
|
82
|
+
"EXECQUERY_OUTPUT_TYPE", "CODE_ERROR_SCOPE", "CODE_UNDECLARED", "missing_error_variable",
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def _flowlint_extras(client, flow: dict, resolver) -> list[dict]:
|
|
87
|
+
try:
|
|
88
|
+
from tools.procesio.handlers import flowlint
|
|
89
|
+
tmpl_sp = flowlint._template_sidepanel_ids(client)
|
|
90
|
+
problems = flowlint.lint_flow_dto(flow, tmpl_sp, resolver)
|
|
91
|
+
except Exception: # noqa: BLE001 - extras are best-effort; never block a save on them
|
|
92
|
+
return []
|
|
93
|
+
out: list[dict] = []
|
|
94
|
+
for p in problems:
|
|
95
|
+
if p.get("kind") not in _FLOWLINT_UNIQUE:
|
|
96
|
+
continue
|
|
97
|
+
name = p.get("action")
|
|
98
|
+
out.append({"severity": "error", "code": p["kind"], "text": p.get("detail", ""),
|
|
99
|
+
"badges": [name] if name else [], "actionId": None, "action": name})
|
|
100
|
+
return out
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def run_be_validation(client, flow: dict) -> dict:
|
|
104
|
+
"""Run PROCESIO's own validator (POST /api/Projects/validate). Empty 200 => valid."""
|
|
105
|
+
dto = flow.get("flow", flow) if isinstance(flow, dict) and "flow" in flow else flow
|
|
106
|
+
try:
|
|
107
|
+
res = client.post("/api/Projects/validate", dto)
|
|
108
|
+
except ProcesioAPIError as e:
|
|
109
|
+
det = e.details if isinstance(e.details, dict) else {"body": e.details}
|
|
110
|
+
return {"valid": False, "errors": det.get("body", det)}
|
|
111
|
+
empty = (not res) or (isinstance(res, dict)
|
|
112
|
+
and list(res.keys()) == ["raw_text"] and not res["raw_text"])
|
|
113
|
+
if empty:
|
|
114
|
+
return {"valid": True, "errors": []}
|
|
115
|
+
errs = (res.get("errors") or res.get("validationErrors")) if isinstance(res, dict) else None
|
|
116
|
+
valid = res.get("isValid") if isinstance(res, dict) else None
|
|
117
|
+
return {"valid": valid if valid is not None else (not errs), "errors": errs, "result": res}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# -- the save gate ------------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
def pre_save_validate(client, dto: dict, *, force: bool = False,
|
|
123
|
+
include_types: bool = True) -> dict:
|
|
124
|
+
"""Gate a process SAVE: FE (designer) validation first, then BE validation.
|
|
125
|
+
|
|
126
|
+
Returns a combined report {fe, be, blocked}. Raises ValidationBlocked when there are
|
|
127
|
+
blocking errors and force is False — so the caller (create/edit) aborts before the
|
|
128
|
+
POST/PUT. FE-warning-only (type-mismatch) never blocks. --force bypasses everything.
|
|
129
|
+
"""
|
|
130
|
+
fe = run_fe_validation(client, dto, include_types=include_types)
|
|
131
|
+
be = run_be_validation(client, dto)
|
|
132
|
+
blocked = (not fe["clean"]) or (be.get("valid") is False)
|
|
133
|
+
report = {"fe": fe, "be": be, "blocked": blocked, "forced": bool(force)}
|
|
134
|
+
if blocked and not force:
|
|
135
|
+
n_fe = fe["error_count"]
|
|
136
|
+
n_be = len(be.get("errors") or []) if be.get("valid") is False else 0
|
|
137
|
+
raise ValidationBlocked(
|
|
138
|
+
f"Save blocked by validation: {n_fe} designer (front-end) error(s), "
|
|
139
|
+
f"{n_be} back-end error(s). Fix them, or pass --force to override.", report)
|
|
140
|
+
return report
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
# -- the live action ----------------------------------------------------------
|
|
144
|
+
|
|
145
|
+
def _args(p: argparse.ArgumentParser) -> None:
|
|
146
|
+
add_profile_arg(p)
|
|
147
|
+
p.add_argument("--id", required=True, help="process (project) id to validate")
|
|
148
|
+
p.add_argument("--no-types", dest="no_types", action="store_true",
|
|
149
|
+
help="skip the advisory data-type-mismatch (warning) layer")
|
|
150
|
+
p.add_argument("--include-be", dest="include_be", action="store_true",
|
|
151
|
+
help="also run the back-end validator (POST /api/Projects/validate)")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def process_fe_validate(client, args) -> dict:
|
|
155
|
+
resp = client.get(f"/api/Projects/{args.id}")
|
|
156
|
+
flow = resp.get("flow", resp) if isinstance(resp, dict) else resp
|
|
157
|
+
fe = run_fe_validation(client, flow, include_types=not args.no_types)
|
|
158
|
+
out = {"id": args.id, "title": flow.get("title") or flow.get("Title"),
|
|
159
|
+
"clean": fe["clean"], "error_count": fe["error_count"],
|
|
160
|
+
"warning_count": fe["warning_count"],
|
|
161
|
+
"errors": fe["errors"], "warnings": fe["warnings"]}
|
|
162
|
+
if args.include_be:
|
|
163
|
+
out["backend"] = run_be_validation(client, flow)
|
|
164
|
+
return out
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
ACTIONS = {
|
|
168
|
+
"process-fe-validate": ActionDef(
|
|
169
|
+
func=process_fe_validate, add_args=_args, needs_client=True,
|
|
170
|
+
description="Front-end (designer-layer) 'Process Errors' validation on a live "
|
|
171
|
+
"process — the client-side check that BLOCKS designer Save but which "
|
|
172
|
+
"POST /api/Projects/validate does NOT catch: unconnected actions, "
|
|
173
|
+
"missing Start/Stop, empty node names, required-empty fields, leftover "
|
|
174
|
+
"placeholders, bad number/integer values, out-of-range limits, "
|
|
175
|
+
"duplicate/primitive-named variables, and unmapped required subprocess "
|
|
176
|
+
"inputs. clean=true when no blocking errors. Data-type mismatches are "
|
|
177
|
+
"reported as (non-blocking) warnings. This same check auto-runs before "
|
|
178
|
+
"every process-create / process-edit. Add --include-be for the BE layer."),
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
# -- saving a fetched flow ----------------------------------------------------
|
|
183
|
+
|
|
184
|
+
def arrange(flow: dict) -> tuple[dict, str]:
|
|
185
|
+
"""The flow laid out with the default arrangement (classic engine + clustering).
|
|
186
|
+
|
|
187
|
+
Returns (flow, note). Layout only moves positions and frame sizes; if it fails on an
|
|
188
|
+
unusual graph the save goes ahead with the canvas as it was, and the note says so."""
|
|
189
|
+
from tools.procesio.layout import adapter
|
|
190
|
+
try:
|
|
191
|
+
res = adapter.layout_flow(flow, cluster=True)
|
|
192
|
+
return res["bundle"], "arranged"
|
|
193
|
+
except Exception as e: # noqa: BLE001 - a layout problem must never block a save
|
|
194
|
+
return flow, f"not arranged ({type(e).__name__}: {e})"
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def save_flow(client, flow: dict, *, flow_id: str, valid: bool, layout: bool | None = None) -> dict:
|
|
198
|
+
"""PUT a flow with its validity mark stamped to `valid`, and report what the server KEPT.
|
|
199
|
+
|
|
200
|
+
Two measured facts about the platform put this in one place rather than a bare PUT at
|
|
201
|
+
each call site. Both were established against the live API, not assumed:
|
|
202
|
+
|
|
203
|
+
* `isValid` is never computed by the back end. It stores whatever the PUT body
|
|
204
|
+
carries, and defaults it to TRUE when the body omits the field. So a writer that
|
|
205
|
+
passes a fetched flow straight through leaves a corrected process marked broken
|
|
206
|
+
for ever, and one that drops the field marks a broken process valid.
|
|
207
|
+
* The runtime validator (POST /api/Projects/validate) answers EMPTY - "valid" - for
|
|
208
|
+
flows the designer refuses to save, so `valid` has to carry the FE+BE verdict the
|
|
209
|
+
create/edit gate applies, never the runtime answer alone.
|
|
210
|
+
|
|
211
|
+
The mark is stamped, never blocked on. Saving a half-built process is deliberate
|
|
212
|
+
platform behaviour; the point of the mark is to say so truthfully.
|
|
213
|
+
|
|
214
|
+
The returned `isValid` is RE-READ after the PUT, because reporting the pre-save
|
|
215
|
+
measurement describes the flow that was sent rather than the one the platform kept,
|
|
216
|
+
and those two genuinely differ. A read-back that fails leaves it None with a note:
|
|
217
|
+
the PUT already landed, so failing the whole call here would misreport a save that
|
|
218
|
+
succeeded.
|
|
219
|
+
"""
|
|
220
|
+
if layout is None: # default: arrange on every save; PROCESIO_KEEP_LAYOUT=1 opts out
|
|
221
|
+
from tools.procesio.dto.process.builder import keep_layout_requested
|
|
222
|
+
layout = not keep_layout_requested()
|
|
223
|
+
note = "kept"
|
|
224
|
+
if layout:
|
|
225
|
+
flow, note = arrange(flow)
|
|
226
|
+
flow["isValid"] = bool(valid)
|
|
227
|
+
out: dict = {"stamped": bool(valid), "layout": note}
|
|
228
|
+
client.put("/api/Projects", flow)
|
|
229
|
+
try:
|
|
230
|
+
stored = client.get(f"/api/Projects/{flow_id}")
|
|
231
|
+
f = stored.get("flow", stored) if isinstance(stored, dict) else stored
|
|
232
|
+
out["isValid"] = f.get("isValid") if isinstance(f, dict) else None
|
|
233
|
+
except Exception as e: # noqa: BLE001 - the PUT landed; only the read-back failed
|
|
234
|
+
out["isValid"] = None
|
|
235
|
+
out["readback_error"] = str(e)
|
|
236
|
+
return out
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Download a flow-instance file (e.g. a Generate-Document PDF output) to local disk.
|
|
2
|
+
|
|
3
|
+
`GET /api/File/download` identifies the file by request **HEADERS** (HAR-verified),
|
|
4
|
+
NOT query params — a query-only call returns NRE "Object reference not set":
|
|
5
|
+
|
|
6
|
+
uploadFilePath the file DTO `path`
|
|
7
|
+
(flow/flow-<flowId>/flow-instance-<instanceId>/variable-<varId>/<fileId>)
|
|
8
|
+
variableId the output variable id
|
|
9
|
+
instanceId the flow instance id
|
|
10
|
+
flowTemplateId the process (flow template) id
|
|
11
|
+
workspaceId the workspace
|
|
12
|
+
|
|
13
|
+
Query: `?isArchived=false`. Returns raw bytes (`content-disposition: attachment`).
|
|
14
|
+
See `tools/procesio/PROCESIO-API-NOTES.md`. JSON in / JSON out; impure (live client).
|
|
15
|
+
"""
|
|
16
|
+
from __future__ import annotations
|
|
17
|
+
|
|
18
|
+
import argparse
|
|
19
|
+
import json
|
|
20
|
+
import re
|
|
21
|
+
from pathlib import Path
|
|
22
|
+
from urllib.parse import unquote
|
|
23
|
+
|
|
24
|
+
from tools.procesio.actiondef import ActionDef
|
|
25
|
+
from tools.procesio.errors import ProcesioAPIError, UsageError
|
|
26
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
27
|
+
|
|
28
|
+
# flow/flow-<flowId>/flow-instance-<instanceId>/variable-<varId>/<fileId>
|
|
29
|
+
_PATH_RE = re.compile(
|
|
30
|
+
r"flow-(?P<flow>[0-9a-fA-F-]{36})/"
|
|
31
|
+
r"flow-instance-(?P<instance>[0-9a-fA-F-]{36})/"
|
|
32
|
+
r"variable-(?P<variable>[0-9a-fA-F-]{36})/")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _ids_from_path(path: str) -> dict:
|
|
36
|
+
m = _PATH_RE.search(path or "")
|
|
37
|
+
return {"flow": m.group("flow"), "instance": m.group("instance"),
|
|
38
|
+
"variable": m.group("variable")} if m else {}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def _filename_from_disposition(cd: str) -> str | None:
|
|
42
|
+
if not cd:
|
|
43
|
+
return None
|
|
44
|
+
m = re.search(r"filename\*=UTF-8''([^;]+)", cd) # RFC 5987 form wins
|
|
45
|
+
if m:
|
|
46
|
+
return unquote(m.group(1)).strip().strip('"')
|
|
47
|
+
m = re.search(r'filename="?([^";]+)"?', cd)
|
|
48
|
+
return m.group(1).strip() if m else None
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def file_download(client, args) -> dict:
|
|
52
|
+
"""Download one flow-instance file. Identify it either explicitly
|
|
53
|
+
(--file-path + --variable-id + --instance-id + --flow-template-id) or with
|
|
54
|
+
--from-run pointing at a run-process result JSON (the ids are derived from the
|
|
55
|
+
file DTO's `path` and the result's instanceId)."""
|
|
56
|
+
file_path = args.file_path
|
|
57
|
+
variable_id = args.variable_id
|
|
58
|
+
instance_id = args.instance_id
|
|
59
|
+
flow_template_id = args.flow_template_id
|
|
60
|
+
name = None
|
|
61
|
+
|
|
62
|
+
if args.from_run:
|
|
63
|
+
try:
|
|
64
|
+
data = json.loads(Path(args.from_run).read_text(encoding="utf-8"))
|
|
65
|
+
except (OSError, json.JSONDecodeError) as e:
|
|
66
|
+
raise UsageError(f"--from-run: cannot read JSON ({e})") from e
|
|
67
|
+
res = data.get("result", data) if isinstance(data, dict) else {}
|
|
68
|
+
variables = res.get("variable") or {}
|
|
69
|
+
if args.var:
|
|
70
|
+
picked = variables.get(args.var)
|
|
71
|
+
if not isinstance(picked, dict) or not picked.get("path"):
|
|
72
|
+
raise UsageError(f"--from-run: variable {args.var!r} is not a file in the run result")
|
|
73
|
+
else:
|
|
74
|
+
picked = next((v for v in variables.values()
|
|
75
|
+
if isinstance(v, dict) and v.get("path")), None)
|
|
76
|
+
if picked is None:
|
|
77
|
+
raise UsageError("--from-run: no file variable (with a 'path') found in the run result")
|
|
78
|
+
ids = _ids_from_path(picked.get("path") or "")
|
|
79
|
+
file_path = file_path or picked.get("path")
|
|
80
|
+
name = picked.get("name")
|
|
81
|
+
flow_template_id = flow_template_id or ids.get("flow")
|
|
82
|
+
instance_id = instance_id or res.get("instanceId") or ids.get("instance")
|
|
83
|
+
variable_id = variable_id or ids.get("variable")
|
|
84
|
+
|
|
85
|
+
missing = [n for n, v in (("file-path", file_path), ("variable-id", variable_id),
|
|
86
|
+
("instance-id", instance_id), ("flow-template-id", flow_template_id))
|
|
87
|
+
if not v]
|
|
88
|
+
if missing:
|
|
89
|
+
raise UsageError("missing " + ", ".join("--" + m for m in missing)
|
|
90
|
+
+ " (or pass --from-run with a run-process result JSON)")
|
|
91
|
+
|
|
92
|
+
workspace_id = client.workspace_id or args.workspace_id
|
|
93
|
+
if not workspace_id:
|
|
94
|
+
raise UsageError("a workspace id is required: pass --workspace-id")
|
|
95
|
+
|
|
96
|
+
headers = {"uploadFilePath": file_path, "variableId": variable_id,
|
|
97
|
+
"instanceId": instance_id, "flowTemplateId": flow_template_id,
|
|
98
|
+
"workspaceId": workspace_id}
|
|
99
|
+
status, content, resp_headers = client.request_bytes(
|
|
100
|
+
"GET", "/api/File/download",
|
|
101
|
+
query={"isArchived": "true" if args.is_archived else "false"},
|
|
102
|
+
headers=headers)
|
|
103
|
+
if not (200 <= status < 300):
|
|
104
|
+
body = content[:300].decode("utf-8", "replace") if content else ""
|
|
105
|
+
raise ProcesioAPIError(int(status or 0), f"HTTP {status} downloading file", {"body": body})
|
|
106
|
+
|
|
107
|
+
rh = {str(k).lower(): v for k, v in (resp_headers or {}).items()}
|
|
108
|
+
out_name = (_filename_from_disposition(rh.get("content-disposition", "")) or name
|
|
109
|
+
or (file_path.rsplit("/", 1)[-1] if file_path else "download.bin"))
|
|
110
|
+
out = Path(args.out) if args.out else Path.cwd() / out_name
|
|
111
|
+
if out.is_dir():
|
|
112
|
+
out = out / out_name
|
|
113
|
+
if out.parent and not out.parent.exists():
|
|
114
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
115
|
+
out.write_bytes(content)
|
|
116
|
+
return {"downloaded": True, "path": str(out), "size": len(content),
|
|
117
|
+
"mimeType": rh.get("content-type"), "name": out.name}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def _args(p: argparse.ArgumentParser) -> None:
|
|
121
|
+
add_profile_arg(p)
|
|
122
|
+
p.add_argument("--from-run", dest="from_run",
|
|
123
|
+
help="path to a run-process result JSON; derive the file + ids from it")
|
|
124
|
+
p.add_argument("--var", help="with --from-run: the output variable name to download "
|
|
125
|
+
"(default: the first file variable)")
|
|
126
|
+
p.add_argument("--file-path", dest="file_path",
|
|
127
|
+
help="the file DTO 'path' (flow/flow-<id>/flow-instance-<id>/variable-<id>/<fileId>)")
|
|
128
|
+
p.add_argument("--variable-id", dest="variable_id", help="output variable id")
|
|
129
|
+
p.add_argument("--instance-id", dest="instance_id", help="flow instance id")
|
|
130
|
+
p.add_argument("--flow-template-id", dest="flow_template_id", help="process (flow template) id")
|
|
131
|
+
p.add_argument("--out", help="output file path or directory (default: the filename in the cwd)")
|
|
132
|
+
p.add_argument("--is-archived", dest="is_archived", action="store_true",
|
|
133
|
+
help="fetch from archived storage")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
ACTIONS = {
|
|
137
|
+
"file-download": ActionDef(
|
|
138
|
+
func=file_download, add_args=_args, needs_client=True,
|
|
139
|
+
description="Download a flow-instance file (Generate-Document output etc.) "
|
|
140
|
+
"via the header-based GET /api/File/download."),
|
|
141
|
+
}
|