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,416 @@
|
|
|
1
|
+
"""Curated process + instance actions (the heart of PROCESIO automation).
|
|
2
|
+
|
|
3
|
+
Paths are the exact Web-API v1.19 routes (tag ProcessTemplate/ProcessInstance):
|
|
4
|
+
list GET /api/Projects
|
|
5
|
+
get GET /api/Projects/{id}
|
|
6
|
+
payload GET /api/Projects/{id}/payload
|
|
7
|
+
run POST /api/Projects/{id}/run
|
|
8
|
+
instances GET /api/Projects/{id}/instances
|
|
9
|
+
status GET /api/Projects/instances/{id}/status
|
|
10
|
+
output GET /api/Projects/instances/{id}/output
|
|
11
|
+
stop POST /api/Projects/instances/{id}/stop
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import argparse
|
|
16
|
+
|
|
17
|
+
from tools._lib.io import log
|
|
18
|
+
from tools.procesio import reliability
|
|
19
|
+
from tools.procesio.actiondef import ActionDef
|
|
20
|
+
from tools.procesio.client import parse_json_arg
|
|
21
|
+
from tools.procesio.errors import ProcesioAPIError, UsageError
|
|
22
|
+
from tools.procesio.handlers.common import add_paging_args, add_profile_arg
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# -- list / get -------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
def _list_args(p: argparse.ArgumentParser) -> None:
|
|
28
|
+
add_profile_arg(p)
|
|
29
|
+
add_paging_args(p)
|
|
30
|
+
p.add_argument("--search", help="filter by process name (searchName)")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def list_processes(client, args) -> dict:
|
|
34
|
+
q = {"pageNumber": args.page, "pageItemCount": args.page_size,
|
|
35
|
+
"searchName": args.search}
|
|
36
|
+
return {"result": client.get("/api/Projects", q)}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _id_args(p: argparse.ArgumentParser) -> None:
|
|
40
|
+
add_profile_arg(p)
|
|
41
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _get_process_args(p: argparse.ArgumentParser) -> None:
|
|
45
|
+
add_profile_arg(p)
|
|
46
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
47
|
+
p.add_argument("--compact", action="store_true",
|
|
48
|
+
help="a structural summary (nodes, edges, variables) instead of the "
|
|
49
|
+
"full flow DTO - the full DTO can be tens of KB and bloats a "
|
|
50
|
+
"small context; use the default for editing/validation")
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _ci(d, *keys):
|
|
54
|
+
if not isinstance(d, dict):
|
|
55
|
+
return None
|
|
56
|
+
low = {k.lower(): k for k in d}
|
|
57
|
+
for k in keys:
|
|
58
|
+
if k.lower() in low:
|
|
59
|
+
return d[low[k.lower()]]
|
|
60
|
+
return None
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def get_process(client, args) -> dict:
|
|
64
|
+
res = client.get(f"/api/Projects/{args.id}")
|
|
65
|
+
if not getattr(args, "compact", False):
|
|
66
|
+
return {"result": res}
|
|
67
|
+
flow = _ci(res, "flow") if isinstance(res, dict) and _ci(res, "flow") else res
|
|
68
|
+
actions = _ci(flow, "actions") or []
|
|
69
|
+
nodes = [{"name": _ci(a, "actionName") or _ci(a, "actionTemplateName"),
|
|
70
|
+
"template": _ci(a, "actionTemplateName")}
|
|
71
|
+
for a in actions if isinstance(a, dict)]
|
|
72
|
+
variables = [_ci(v, "name") for v in (_ci(flow, "variables") or [])
|
|
73
|
+
if isinstance(v, dict)]
|
|
74
|
+
ports = _ci(flow, "ports") or _ci(flow, "connections") or []
|
|
75
|
+
return {"result": {
|
|
76
|
+
"id": _ci(flow, "id"), "title": _ci(flow, "title") or _ci(flow, "name"),
|
|
77
|
+
"isValid": _ci(flow, "isValid"),
|
|
78
|
+
"node_count": len(nodes), "nodes": nodes,
|
|
79
|
+
"edge_count": len(ports) if isinstance(ports, list) else None,
|
|
80
|
+
"variables": variables,
|
|
81
|
+
}}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def get_process_payload(client, args) -> dict:
|
|
85
|
+
"""The input-variable shape expected by run-process for this process."""
|
|
86
|
+
return {"result": client.get(f"/api/Projects/{args.id}/payload")}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
# -- run --------------------------------------------------------------------
|
|
90
|
+
|
|
91
|
+
def _run_args(p: argparse.ArgumentParser) -> None:
|
|
92
|
+
add_profile_arg(p)
|
|
93
|
+
p.add_argument("--id", required=True, help="process (project) id to run")
|
|
94
|
+
p.add_argument("--payload", help="input variables as a JSON object")
|
|
95
|
+
p.add_argument("--connection-id", dest="connection_id",
|
|
96
|
+
help="connectionid value (default null)")
|
|
97
|
+
p.add_argument("--synchronous", action="store_true",
|
|
98
|
+
help="wait for completion (runSynchronous=true)")
|
|
99
|
+
p.add_argument("--timeout", type=int, help="secondsTimeOut for synchronous runs")
|
|
100
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
101
|
+
help="show the request that WOULD be sent; do not run")
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def run_process(client, args) -> dict:
|
|
105
|
+
payload = parse_json_arg(args.payload, "payload") or {}
|
|
106
|
+
body = {"payload": payload, "connectionid": args.connection_id}
|
|
107
|
+
query = {"runSynchronous": "true" if args.synchronous else None,
|
|
108
|
+
"secondsTimeOut": args.timeout}
|
|
109
|
+
query = {k: v for k, v in query.items() if v is not None}
|
|
110
|
+
if args.dry_run:
|
|
111
|
+
return {"dry_run": True, "method": "POST",
|
|
112
|
+
"path": f"/api/Projects/{args.id}/run", "query": query, "body": body}
|
|
113
|
+
# An execution is EXEMPT from the client's total wall-clock deadline: a
|
|
114
|
+
# synchronous run of a many-action process legitimately takes minutes, and
|
|
115
|
+
# aborting it client-side does NOT stop the server run (it keeps executing and
|
|
116
|
+
# writing its side effects). Instead give the socket a per-read timeout matched
|
|
117
|
+
# to the requested --timeout (+buffer), or no read timeout at all when a
|
|
118
|
+
# synchronous run has no --timeout (wait for it). See PROCESIO-API-NOTES.md.
|
|
119
|
+
read_timeout = reliability.READ_TIMEOUT
|
|
120
|
+
if args.synchronous:
|
|
121
|
+
read_timeout = (args.timeout + 30) if args.timeout else None
|
|
122
|
+
return {"result": client.post(f"/api/Projects/{args.id}/run", body, query,
|
|
123
|
+
deadline=None, read_timeout=read_timeout)}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
# -- run with FILE inputs ---------------------------------------------------
|
|
127
|
+
#
|
|
128
|
+
# The one-call /run endpoint cannot carry file bytes: its body is JSON, and a File
|
|
129
|
+
# process variable expects a materialised file behind a fileId. So a run with a file
|
|
130
|
+
# input is a four-step sequence against three endpoints (verified live 2026-07-03,
|
|
131
|
+
# and again 10/08/2026):
|
|
132
|
+
#
|
|
133
|
+
# publish POST /api/Projects/{id}/instances/publish file var = METADATA only,
|
|
134
|
+
# carrying a client-made GUID
|
|
135
|
+
# upload POST /api/File/upload/flow bytes in multipart 'package',
|
|
136
|
+
# ids in HEADERS (variableNAME)
|
|
137
|
+
# launch POST /api/Projects/instances/{iid}/launch
|
|
138
|
+
# poll GET /api/Projects/instances/{iid}/status -> /output
|
|
139
|
+
#
|
|
140
|
+
# Publishing WITHOUT launching leaves a zombie instance in "starting", so the launch
|
|
141
|
+
# leg is not optional once publish has run.
|
|
142
|
+
|
|
143
|
+
_STATUS_LABELS = {1: "starting", 5: "inactive", 6: "stopped_by_user",
|
|
144
|
+
15: "initializing", 30: "running",
|
|
145
|
+
40: "finished_with_errors", 50: "finished"}
|
|
146
|
+
_TERMINAL_STATUSES = {6, 40, 50}
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _parse_file_bindings(raw: "list[str] | None") -> "dict[str, str]":
|
|
150
|
+
"""`--file VARNAME=PATH` (repeatable) -> {variable name: local path}."""
|
|
151
|
+
out: "dict[str, str]" = {}
|
|
152
|
+
for item in raw or []:
|
|
153
|
+
name, sep, path = (item or "").partition("=")
|
|
154
|
+
if not sep or not name.strip() or not path.strip():
|
|
155
|
+
raise UsageError(f"--file expects VARNAME=PATH, got {item!r}")
|
|
156
|
+
out[name.strip()] = path.strip()
|
|
157
|
+
return out
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _instance_id_from_publish(published) -> str:
|
|
161
|
+
"""The publish response carries the new instance id at the TOP level as `id`;
|
|
162
|
+
older shapes nested it under `flows`. Try both before giving up."""
|
|
163
|
+
if isinstance(published, dict):
|
|
164
|
+
for key in ("id", "instanceId", "instanceID"):
|
|
165
|
+
if published.get(key):
|
|
166
|
+
return str(published[key])
|
|
167
|
+
flows = published.get("flows")
|
|
168
|
+
if isinstance(flows, list) and flows and isinstance(flows[0], dict):
|
|
169
|
+
for key in ("id", "instanceId"):
|
|
170
|
+
if flows[0].get(key):
|
|
171
|
+
return str(flows[0][key])
|
|
172
|
+
raise ProcesioAPIError(0, "could not find the instance id in the publish response",
|
|
173
|
+
{"response": published})
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
def _run_with_files_args(p: argparse.ArgumentParser) -> None:
|
|
177
|
+
add_profile_arg(p)
|
|
178
|
+
p.add_argument("--id", required=True, help="process (project) id to run")
|
|
179
|
+
p.add_argument("--file", action="append", metavar="VARNAME=PATH",
|
|
180
|
+
help="bind a local file to a File input variable; repeatable")
|
|
181
|
+
p.add_argument("--payload", help="the NON-file input variables as a JSON object")
|
|
182
|
+
p.add_argument("--timeout", type=int, default=300,
|
|
183
|
+
help="seconds to wait for a terminal status (default 300)")
|
|
184
|
+
p.add_argument("--poll-interval", dest="poll_interval", type=float, default=3.0,
|
|
185
|
+
help="seconds between status polls (default 3)")
|
|
186
|
+
p.add_argument("--no-wait", dest="no_wait", action="store_true",
|
|
187
|
+
help="launch and return the instance id without polling")
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def run_process_with_files(client, args) -> dict:
|
|
191
|
+
"""Run a process that takes one or more File input variables."""
|
|
192
|
+
import mimetypes
|
|
193
|
+
import os
|
|
194
|
+
import time
|
|
195
|
+
import uuid
|
|
196
|
+
|
|
197
|
+
bindings = _parse_file_bindings(args.file)
|
|
198
|
+
if not bindings:
|
|
199
|
+
raise UsageError("run-process-with-file needs at least one --file VARNAME=PATH "
|
|
200
|
+
"(a run with no file input is just run-process)")
|
|
201
|
+
|
|
202
|
+
payload = parse_json_arg(args.payload, "payload") or {}
|
|
203
|
+
staged = []
|
|
204
|
+
for var_name, path in bindings.items():
|
|
205
|
+
if not os.path.isfile(path):
|
|
206
|
+
raise UsageError(f"--file {var_name}: no such file: {path}")
|
|
207
|
+
name = os.path.basename(path)
|
|
208
|
+
size = os.path.getsize(path)
|
|
209
|
+
mime = mimetypes.guess_type(name)[0] or "application/octet-stream"
|
|
210
|
+
file_id = str(uuid.uuid4())
|
|
211
|
+
# The publish payload carries METADATA ONLY; the bytes follow in step 2.
|
|
212
|
+
payload[var_name] = {"path": "", "size": size, "mimeType": mime,
|
|
213
|
+
"name": name, "id": file_id, "hash": ""}
|
|
214
|
+
staged.append({"var": var_name, "path": path, "name": name,
|
|
215
|
+
"size": size, "mime": mime, "file_id": file_id})
|
|
216
|
+
|
|
217
|
+
published = client.post(f"/api/Projects/{args.id}/instances/publish", payload)
|
|
218
|
+
instance_id = _instance_id_from_publish(published)
|
|
219
|
+
log(f"published instance {instance_id}")
|
|
220
|
+
|
|
221
|
+
for f in staged:
|
|
222
|
+
with open(f["path"], "rb") as fh:
|
|
223
|
+
content = fh.read()
|
|
224
|
+
client.request_multipart(
|
|
225
|
+
"/api/File/upload/flow",
|
|
226
|
+
files={"package": (f["name"], content, f["mime"])},
|
|
227
|
+
headers={"flowInstanceId": instance_id, "flowTemplateId": args.id,
|
|
228
|
+
"variableName": f["var"], "fileId": f["file_id"]})
|
|
229
|
+
log(f"uploaded {f['name']} ({f['size']} bytes) -> {f['var']}")
|
|
230
|
+
|
|
231
|
+
client.post(f"/api/Projects/instances/{instance_id}/launch",
|
|
232
|
+
{"flowTemplateId": args.id, "connectionId": None})
|
|
233
|
+
log("launched")
|
|
234
|
+
|
|
235
|
+
result = {"instance_id": instance_id,
|
|
236
|
+
"files": [{"variable": f["var"], "name": f["name"], "size": f["size"]}
|
|
237
|
+
for f in staged]}
|
|
238
|
+
if args.no_wait:
|
|
239
|
+
return {"result": {**result, "status": None, "status_label": "launched"}}
|
|
240
|
+
|
|
241
|
+
deadline = time.monotonic() + args.timeout
|
|
242
|
+
status_val = None
|
|
243
|
+
while True:
|
|
244
|
+
# The poll reads `status` only. Every flag below defaults to true server-side, and
|
|
245
|
+
# `addExtras` alone costs several backend look-ups per call (starter, webhook,
|
|
246
|
+
# schedule, form names, resource usage), so each poll asks for none of it. The
|
|
247
|
+
# final read below is /output, which is unaffected.
|
|
248
|
+
st = client.get(f"/api/Projects/instances/{instance_id}/status",
|
|
249
|
+
{"flowTemplateId": args.id, "getActions": "false",
|
|
250
|
+
"getVariables": "false", "getInternalVariables": "false",
|
|
251
|
+
"addExtras": "false"})
|
|
252
|
+
inst = st.get("instance") if isinstance(st, dict) else None
|
|
253
|
+
status_val = (inst or st or {}).get("status")
|
|
254
|
+
if status_val in _TERMINAL_STATUSES:
|
|
255
|
+
break
|
|
256
|
+
if time.monotonic() > deadline:
|
|
257
|
+
raise ProcesioAPIError(
|
|
258
|
+
0, f"instance {instance_id} did not reach a terminal status within "
|
|
259
|
+
f"{args.timeout}s; read it later with get-instance-output",
|
|
260
|
+
{"instance_id": instance_id, "last_status": status_val})
|
|
261
|
+
time.sleep(args.poll_interval)
|
|
262
|
+
|
|
263
|
+
output = client.get(f"/api/Projects/instances/{instance_id}/output",
|
|
264
|
+
{"flowTemplateId": args.id})
|
|
265
|
+
inst = output.get("instance") if isinstance(output, dict) else None
|
|
266
|
+
return {"result": {**result,
|
|
267
|
+
"status": status_val,
|
|
268
|
+
"status_label": _STATUS_LABELS.get(status_val, str(status_val)),
|
|
269
|
+
"variable": (inst or {}).get("variable"),
|
|
270
|
+
"error": (inst or {}).get("error"),
|
|
271
|
+
"output": output}}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
# -- instances --------------------------------------------------------------
|
|
275
|
+
|
|
276
|
+
def _instances_args(p: argparse.ArgumentParser) -> None:
|
|
277
|
+
add_profile_arg(p)
|
|
278
|
+
p.add_argument("--id", required=True, help="process (project) id")
|
|
279
|
+
add_paging_args(p)
|
|
280
|
+
p.add_argument("--status", dest="filter_status", help="filterStatus value")
|
|
281
|
+
|
|
282
|
+
|
|
283
|
+
def list_instances(client, args) -> dict:
|
|
284
|
+
q = {"pageNumber": args.page, "pageItemCount": args.page_size,
|
|
285
|
+
"filterStatus": args.filter_status}
|
|
286
|
+
return {"result": client.get(f"/api/Projects/{args.id}/instances", q)}
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def _instance_status_args(p: argparse.ArgumentParser) -> None:
|
|
290
|
+
add_profile_arg(p)
|
|
291
|
+
p.add_argument("--id", required=True, help="instance id")
|
|
292
|
+
p.add_argument("--flow-template-id", dest="flow_template_id",
|
|
293
|
+
help="flowTemplateId (the process id)")
|
|
294
|
+
p.add_argument("--variables", action="store_true",
|
|
295
|
+
help="include variables (getVariables=true)")
|
|
296
|
+
p.add_argument("--actions", action="store_true",
|
|
297
|
+
help="include actions (getActions=true)")
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def get_instance_status(client, args) -> dict:
|
|
301
|
+
q = {"flowTemplateId": args.flow_template_id,
|
|
302
|
+
"getVariables": "true" if args.variables else None,
|
|
303
|
+
"getActions": "true" if args.actions else None}
|
|
304
|
+
return {"result": client.get(f"/api/Projects/instances/{args.id}/status", q)}
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
def _instance_id_args(p: argparse.ArgumentParser) -> None:
|
|
308
|
+
add_profile_arg(p)
|
|
309
|
+
p.add_argument("--id", required=True, help="instance id")
|
|
310
|
+
p.add_argument("--flow-template-id", dest="flow_template_id",
|
|
311
|
+
help="flowTemplateId (the process id)")
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
def get_instance_output(client, args) -> dict:
|
|
315
|
+
q = {"flowTemplateId": args.flow_template_id}
|
|
316
|
+
return {"result": client.get(f"/api/Projects/instances/{args.id}/output", q)}
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
def stop_instance(client, args) -> dict:
|
|
320
|
+
q = {"flowTemplateId": args.flow_template_id}
|
|
321
|
+
return {"result": client.post(f"/api/Projects/instances/{args.id}/stop", None, q)}
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
# -- put-projects (curated: empty-body echo hardening) ----------------------
|
|
325
|
+
|
|
326
|
+
_EMPTY_PUT_WARNING = (
|
|
327
|
+
"PUT /api/Projects returned a SUCCESS status with an EMPTY body. An empty-body "
|
|
328
|
+
"success has been observed to LIE: the response looked fine while the change did "
|
|
329
|
+
"NOT land server-side (see PROCESIO-API-NOTES.md 'Empirical reliability profile', "
|
|
330
|
+
"O4). Do NOT trust this echo — verify behaviourally: run the process "
|
|
331
|
+
"(run-process) and observe the effect, or re-read the definition and compare."
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
|
|
335
|
+
def _put_projects_args(p: argparse.ArgumentParser) -> None:
|
|
336
|
+
add_profile_arg(p)
|
|
337
|
+
p.add_argument("--body", help="request body as JSON (object or array)")
|
|
338
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
339
|
+
help="compose and return the request without sending it")
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
def _is_empty_echo(parsed) -> bool:
|
|
343
|
+
"""The PROCESIO empty-body shape: no JSON body -> _parse_body returns
|
|
344
|
+
{"raw_text": ""}; also treat {} / None as empty."""
|
|
345
|
+
if parsed is None or parsed == {}:
|
|
346
|
+
return True
|
|
347
|
+
if isinstance(parsed, dict) and set(parsed) <= {"raw_text"}:
|
|
348
|
+
return not parsed.get("raw_text")
|
|
349
|
+
return False
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def put_projects(client, args) -> dict:
|
|
353
|
+
"""Curated PUT /api/Projects: same passthrough as the generated action, but it
|
|
354
|
+
reports the HTTP status/elapsed/body-length and WARNS when the body is empty,
|
|
355
|
+
because an empty-body success can silently fail to persist (O4). Shadows the
|
|
356
|
+
autogenerated put-projects (curated names win in main.collect_actions)."""
|
|
357
|
+
body = parse_json_arg(args.body, "body")
|
|
358
|
+
if args.dry_run:
|
|
359
|
+
return {"dry_run": True, "method": "PUT", "path": "/api/Projects", "body": body}
|
|
360
|
+
result = client.put("/api/Projects", body)
|
|
361
|
+
meta = client.last_meta or {}
|
|
362
|
+
out = {
|
|
363
|
+
"result": result,
|
|
364
|
+
"http": {"status": meta.get("status"),
|
|
365
|
+
"elapsed_s": meta.get("elapsed_s"),
|
|
366
|
+
"body_len": meta.get("body_len")},
|
|
367
|
+
}
|
|
368
|
+
if _is_empty_echo(result) or meta.get("body_len") == 0:
|
|
369
|
+
out["warning"] = _EMPTY_PUT_WARNING
|
|
370
|
+
return out
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
ACTIONS = {
|
|
374
|
+
"list-processes": ActionDef(
|
|
375
|
+
func=list_processes, add_args=_list_args, needs_client=True,
|
|
376
|
+
description="List processes (GET /api/Projects).",
|
|
377
|
+
),
|
|
378
|
+
"get-process": ActionDef(
|
|
379
|
+
func=get_process, add_args=_get_process_args, needs_client=True,
|
|
380
|
+
description="Get one process by id (GET /api/Projects/{id}).",
|
|
381
|
+
),
|
|
382
|
+
"get-process-payload": ActionDef(
|
|
383
|
+
func=get_process_payload, add_args=_id_args, needs_client=True,
|
|
384
|
+
description="Get a process's input-variable payload shape for run-process.",
|
|
385
|
+
),
|
|
386
|
+
"run-process": ActionDef(
|
|
387
|
+
func=run_process, add_args=_run_args, needs_client=True,
|
|
388
|
+
description="Run a process (POST /api/Projects/{id}/run). Supports --dry-run.",
|
|
389
|
+
),
|
|
390
|
+
"run-process-with-file": ActionDef(
|
|
391
|
+
func=run_process_with_files, add_args=_run_with_files_args, needs_client=True,
|
|
392
|
+
description="Run a process that takes File input variable(s): publish -> upload "
|
|
393
|
+
"bytes -> launch -> poll -> output. --file VARNAME=PATH (repeatable).",
|
|
394
|
+
),
|
|
395
|
+
"list-instances": ActionDef(
|
|
396
|
+
func=list_instances, add_args=_instances_args, needs_client=True,
|
|
397
|
+
description="List a process's run instances (GET /api/Projects/{id}/instances).",
|
|
398
|
+
),
|
|
399
|
+
"get-instance-status": ActionDef(
|
|
400
|
+
func=get_instance_status, add_args=_instance_status_args, needs_client=True,
|
|
401
|
+
description="Get an instance's status/variables (GET /api/Projects/instances/{id}/status).",
|
|
402
|
+
),
|
|
403
|
+
"get-instance-output": ActionDef(
|
|
404
|
+
func=get_instance_output, add_args=_instance_id_args, needs_client=True,
|
|
405
|
+
description="Get an instance's output (GET /api/Projects/instances/{id}/output).",
|
|
406
|
+
),
|
|
407
|
+
"stop-instance": ActionDef(
|
|
408
|
+
func=stop_instance, add_args=_instance_id_args, needs_client=True,
|
|
409
|
+
description="Stop a running instance (POST /api/Projects/instances/{id}/stop).",
|
|
410
|
+
),
|
|
411
|
+
"put-projects": ActionDef(
|
|
412
|
+
func=put_projects, add_args=_put_projects_args, needs_client=True,
|
|
413
|
+
description="Update a process (PUT /api/Projects). Reports HTTP status/elapsed "
|
|
414
|
+
"and WARNS on an empty-body success (which can silently not persist).",
|
|
415
|
+
),
|
|
416
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"""Profile-management actions (no HTTP - they only touch Credential Manager).
|
|
2
|
+
|
|
3
|
+
These let the user keep MANY credentials: several API keys (one per workspace)
|
|
4
|
+
and one or more username/password accounts, switching between them with
|
|
5
|
+
--profile or a stored default.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import argparse
|
|
10
|
+
import getpass
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
from tools.procesio import environments, profiles
|
|
14
|
+
from tools.procesio.actiondef import ActionDef
|
|
15
|
+
from tools.procesio.errors import UsageError
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# -- add-credential ---------------------------------------------------------
|
|
19
|
+
|
|
20
|
+
def _add_args(p: argparse.ArgumentParser) -> None:
|
|
21
|
+
p.add_argument("--name", required=True, help="profile name, e.g. 'personal'")
|
|
22
|
+
p.add_argument("--type", required=True, choices=["apikey", "userpass"])
|
|
23
|
+
# apikey fields. PROCESIO's docs call these the API "key name" and "key value";
|
|
24
|
+
# keep --key/--value for compatibility, but use the product wording at prompts.
|
|
25
|
+
p.add_argument("--key", help="apikey: the key NAME header value (omit to be prompted without echoing)")
|
|
26
|
+
p.add_argument("--value", help="apikey: the key VALUE header value (omit to be prompted without echoing)")
|
|
27
|
+
p.add_argument("--workspace-id", dest="workspace_id",
|
|
28
|
+
help="apikey: workspace GUID (sent as the workspaceid header)")
|
|
29
|
+
p.add_argument("--workspace", help="apikey: a human label for the workspace")
|
|
30
|
+
# userpass fields
|
|
31
|
+
p.add_argument("--username", help="userpass: account email/username")
|
|
32
|
+
p.add_argument("--password", help="userpass: account password (omit to be prompted without echoing)")
|
|
33
|
+
p.add_argument("--realm", help="userpass: override realm (default procesio01)")
|
|
34
|
+
p.add_argument("--client-id", dest="client_id",
|
|
35
|
+
help="userpass: override client_id (default procesio-ui)")
|
|
36
|
+
# environment binding: which PROCESIO installation this credential authenticates
|
|
37
|
+
# against. Its host URLs come from that environment; unbound == Internal-PROD.
|
|
38
|
+
p.add_argument("--environment", dest="environment",
|
|
39
|
+
help="bind this credential to an environment, e.g. Internal-QA "
|
|
40
|
+
"(default: Internal-PROD). Add a client env first with add-environment.")
|
|
41
|
+
# shared optional base overrides (rare — normally the environment supplies these)
|
|
42
|
+
p.add_argument("--web-base", dest="web_base", help="override Web API base URL")
|
|
43
|
+
p.add_argument("--auth-base", dest="auth_base", help="override Proxy API base URL")
|
|
44
|
+
p.add_argument("--make-default", action="store_true",
|
|
45
|
+
help="set this profile as the default")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _secret_arg(value, label: str, flag: str):
|
|
49
|
+
"""Return the secret, prompting for it when the flag was omitted.
|
|
50
|
+
|
|
51
|
+
Passing a key/token/password as a CLI flag leaks it into shell history and into
|
|
52
|
+
every process listing on the box, which defeats the point of storing it in the OS
|
|
53
|
+
credential manager. So the flags stay OPTIONAL and an interactive terminal is
|
|
54
|
+
prompted via getpass (never echoed) — same contract as scripts/set-credential.py.
|
|
55
|
+
Non-interactive callers (CI, another tool) still pass the flag and are unaffected;
|
|
56
|
+
only a non-interactive caller that ALSO omits the flag gets the usage error.
|
|
57
|
+
|
|
58
|
+
The usage error names AAT_RUNNER_DIRECT because the common way to hit it is NOT
|
|
59
|
+
being non-interactive: run-tool routes tools through the persistent runner by
|
|
60
|
+
default, so the tool executes inside a daemon worker with no TTY and the prompt
|
|
61
|
+
is unreachable even for a human at a real console. "Run interactively" alone is
|
|
62
|
+
unactionable advice for someone who already is.
|
|
63
|
+
"""
|
|
64
|
+
if value:
|
|
65
|
+
return value
|
|
66
|
+
if not sys.stdin.isatty():
|
|
67
|
+
raise UsageError(f"{label} is required: pass {flag}, or re-run with the "
|
|
68
|
+
f"runner bypassed so it can prompt without echoing "
|
|
69
|
+
f"(PowerShell: $env:AAT_RUNNER_DIRECT=1)")
|
|
70
|
+
entered = getpass.getpass(f"{label}: ").strip()
|
|
71
|
+
if not entered:
|
|
72
|
+
raise UsageError(f"{label} cannot be empty")
|
|
73
|
+
return entered
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def add_credential(args) -> dict:
|
|
77
|
+
blob: dict = {"type": args.type}
|
|
78
|
+
if args.type == "apikey":
|
|
79
|
+
blob["key"] = _secret_arg(args.key, "PROCESIO API key name", "--key")
|
|
80
|
+
blob["value"] = _secret_arg(
|
|
81
|
+
args.value, "PROCESIO API key value (shown once)", "--value"
|
|
82
|
+
)
|
|
83
|
+
if args.workspace_id:
|
|
84
|
+
blob["workspace_id"] = args.workspace_id
|
|
85
|
+
if args.workspace:
|
|
86
|
+
blob["workspace"] = args.workspace
|
|
87
|
+
else: # userpass
|
|
88
|
+
if not args.username:
|
|
89
|
+
raise UsageError("userpass profiles need --username")
|
|
90
|
+
blob["username"] = args.username
|
|
91
|
+
blob["password"] = _secret_arg(args.password, "password", "--password")
|
|
92
|
+
if args.realm:
|
|
93
|
+
blob["realm"] = args.realm
|
|
94
|
+
if args.client_id:
|
|
95
|
+
blob["client_id"] = args.client_id
|
|
96
|
+
if getattr(args, "environment", None):
|
|
97
|
+
canon = environments.canonical_name(args.environment)
|
|
98
|
+
if not canon:
|
|
99
|
+
raise UsageError(
|
|
100
|
+
f"unknown environment '{args.environment}'. "
|
|
101
|
+
f"Known: {', '.join(sorted(environments.all_environments()))}. "
|
|
102
|
+
f"Add a client environment first with: run-tool procesio add-environment ..."
|
|
103
|
+
)
|
|
104
|
+
blob["environment"] = canon
|
|
105
|
+
for opt in ("web_base", "auth_base"):
|
|
106
|
+
if getattr(args, opt):
|
|
107
|
+
blob[opt] = getattr(args, opt)
|
|
108
|
+
profiles.save_profile(args.name, blob)
|
|
109
|
+
if args.make_default:
|
|
110
|
+
profiles.set_default(args.name)
|
|
111
|
+
return {
|
|
112
|
+
"saved": True,
|
|
113
|
+
"profile": profiles.public_view(blob, args.name),
|
|
114
|
+
"environment": blob.get("environment", environments.DEFAULT_ENV_NAME),
|
|
115
|
+
"default": profiles.get_default(),
|
|
116
|
+
"note": "secret values stored in Windows Credential Manager, never on disk",
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
# -- list-credentials -------------------------------------------------------
|
|
121
|
+
|
|
122
|
+
def list_credentials(_args) -> dict:
|
|
123
|
+
default = profiles.get_default()
|
|
124
|
+
out = []
|
|
125
|
+
for name in profiles.profile_names():
|
|
126
|
+
blob = profiles.get_profile(name)
|
|
127
|
+
view = profiles.public_view(blob, name)
|
|
128
|
+
view["is_default"] = (name == default)
|
|
129
|
+
# An unbound credential belongs to Internal-PROD (backward-compatible).
|
|
130
|
+
view["environment"] = blob.get("environment") or environments.DEFAULT_ENV_NAME
|
|
131
|
+
out.append(view)
|
|
132
|
+
return {
|
|
133
|
+
"count": len(out),
|
|
134
|
+
"default": default,
|
|
135
|
+
"default_environment": environments.get_default(),
|
|
136
|
+
"profiles": out,
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
# -- set-default ------------------------------------------------------------
|
|
141
|
+
|
|
142
|
+
def _name_arg(p: argparse.ArgumentParser) -> None:
|
|
143
|
+
p.add_argument("--name", required=True, help="profile name")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def set_default(args) -> dict:
|
|
147
|
+
profiles.set_default(args.name)
|
|
148
|
+
return {"default": args.name}
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def remove_credential(args) -> dict:
|
|
152
|
+
profiles.remove_profile(args.name)
|
|
153
|
+
return {"removed": args.name, "default": profiles.get_default(),
|
|
154
|
+
"remaining": profiles.profile_names()}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def show_credential(args) -> dict:
|
|
158
|
+
"""Non-secret view of one profile (secret fields shown only as has_*)."""
|
|
159
|
+
blob = profiles.get_profile(args.name)
|
|
160
|
+
return profiles.public_view(blob, args.name)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
ACTIONS = {
|
|
164
|
+
"add-credential": ActionDef(
|
|
165
|
+
func=add_credential, add_args=_add_args,
|
|
166
|
+
description="Store a new credential profile (apikey or userpass) in Credential Manager.",
|
|
167
|
+
),
|
|
168
|
+
"list-credentials": ActionDef(
|
|
169
|
+
func=list_credentials,
|
|
170
|
+
description="List stored credential profiles (names/types/workspaces only - no secrets).",
|
|
171
|
+
),
|
|
172
|
+
"set-default": ActionDef(
|
|
173
|
+
func=set_default, add_args=_name_arg,
|
|
174
|
+
description="Set the default profile used when --profile is omitted.",
|
|
175
|
+
),
|
|
176
|
+
"remove-credential": ActionDef(
|
|
177
|
+
func=remove_credential, add_args=_name_arg,
|
|
178
|
+
description="Delete a credential profile and its cached token.",
|
|
179
|
+
),
|
|
180
|
+
"show-credential": ActionDef(
|
|
181
|
+
func=show_credential, add_args=_name_arg,
|
|
182
|
+
description="Show one profile's non-secret fields (secrets shown only as has_*).",
|
|
183
|
+
),
|
|
184
|
+
}
|