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,13 @@
|
|
|
1
|
+
"""PROCESIO DTO sub-tools.
|
|
2
|
+
|
|
3
|
+
Deterministic, reusable builders that turn a small validated `config` into a full
|
|
4
|
+
PROCESIO DTO by merging it onto a captured golden template, then create/edit the
|
|
5
|
+
resource over the Web API. See DTO-SUBTOOLS-NOTE.md for the design.
|
|
6
|
+
|
|
7
|
+
Layout per component: tools/procesio/dto/<component>/
|
|
8
|
+
description.md - what it is / when to use / gotchas
|
|
9
|
+
config.schema.json - the JSON Schema the (LLM-produced) config must satisfy
|
|
10
|
+
template.dto.json - a real captured golden DTO with placeholders
|
|
11
|
+
builder.py - PURE config -> DTO (no I/O); + a Component spec
|
|
12
|
+
fixtures/ - golden config->DTO pairs (regression) + drift captures
|
|
13
|
+
"""
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Credential builder — PURE config -> CredentialsDto.
|
|
2
|
+
|
|
3
|
+
A credential instance is a saved set of property values for a credential template
|
|
4
|
+
(connection type). The builder resolves the template (gtid/gtpid + property ids,
|
|
5
|
+
fetched live in prepare_ctx) and maps config `properties: {label: value}` to
|
|
6
|
+
`properties: [{id, value}]`. Select/radio option *names* are resolved to their
|
|
7
|
+
option value (guid) automatically.
|
|
8
|
+
|
|
9
|
+
API (verified live 2026-06-24):
|
|
10
|
+
- Create: POST /api/Credentials {gtid, gtpid, name, properties[]} -> {id}
|
|
11
|
+
- Get: GET /api/Credentials/{id}
|
|
12
|
+
- Edit: PUT /api/Credentials {gid: id, ...}
|
|
13
|
+
- Validate@source: POST /api/Credentials/test (live connection probe)
|
|
14
|
+
"""
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
from tools.procesio.dto.framework import Component
|
|
20
|
+
from tools.procesio.errors import UsageError
|
|
21
|
+
|
|
22
|
+
DIR = Path(__file__).resolve().parent
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _property_index(template: dict) -> dict:
|
|
26
|
+
out: dict[str, dict] = {}
|
|
27
|
+
for p in template.get("properties") or []:
|
|
28
|
+
if p.get("label"):
|
|
29
|
+
out.setdefault(p["label"].strip().lower(), p)
|
|
30
|
+
if p.get("id"):
|
|
31
|
+
out[p["id"]] = p
|
|
32
|
+
return out
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
_GUIDISH = 32 # a guid without dashes is 32 hex chars; with dashes, 36
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _looks_guid(v) -> bool:
|
|
39
|
+
s = str(v or "").strip()
|
|
40
|
+
return len(s) >= _GUIDISH and s.count("-") >= 4
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _resolve_option(prop: dict, value):
|
|
44
|
+
"""Map an option property's value to the option **guid** the engine expects.
|
|
45
|
+
|
|
46
|
+
Accepts the option `name` ("GET"), its `be_value` ("Get"), or the guid itself.
|
|
47
|
+
|
|
48
|
+
RAISES on an unmatched value when the property's options are guid-valued. This
|
|
49
|
+
is deliberate: PROCESIO stores whatever string you send, the credential saves
|
|
50
|
+
fine, and then EVERY Call API run using it dies at runtime with
|
|
51
|
+
``Error while building input model: Unrecognized Guid format.`` — blamed on the
|
|
52
|
+
Call API action, not the credential, which sends you hunting in the wrong place.
|
|
53
|
+
(Cost hours on 2026-07-30 with ``"Method": "POST"``; POST is not even an option —
|
|
54
|
+
the credential Method is only used by the /test probe, Call API carries its own
|
|
55
|
+
Verb.) Non-guid option sets (checkbox-style "true"/"false") still pass through,
|
|
56
|
+
so nothing that worked before breaks.
|
|
57
|
+
"""
|
|
58
|
+
opts = prop.get("options")
|
|
59
|
+
if not (isinstance(opts, list) and opts) or not isinstance(value, str):
|
|
60
|
+
return value
|
|
61
|
+
want = value.strip().lower()
|
|
62
|
+
for key in ("name", "be_value", "value"):
|
|
63
|
+
for o in opts:
|
|
64
|
+
if str(o.get(key, "")).strip().lower() == want:
|
|
65
|
+
return o.get("value")
|
|
66
|
+
if any(_looks_guid(o.get("value")) for o in opts):
|
|
67
|
+
allowed = [o.get("name") for o in opts if o.get("name")]
|
|
68
|
+
raise UsageError(
|
|
69
|
+
f"credential property {prop.get('label')!r}: {value!r} is not one of its "
|
|
70
|
+
f"options {allowed}. This property is an option list valued by GUID — "
|
|
71
|
+
f"sending a raw string saves fine but makes every Call API run using this "
|
|
72
|
+
f"credential fail at runtime with 'Unrecognized Guid format'. Pass an "
|
|
73
|
+
f"option name (or its guid). Note: a REST credential's 'Method' is only "
|
|
74
|
+
f"used by the connection test; the Call API action carries its own 'Verb'."
|
|
75
|
+
)
|
|
76
|
+
return value
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def build(config: dict, ctx: dict) -> dict:
|
|
80
|
+
template = ctx.get("template")
|
|
81
|
+
if not template:
|
|
82
|
+
raise UsageError("credential build needs the resolved template in ctx "
|
|
83
|
+
"(prepare_ctx fetches /api/Credentials/types)")
|
|
84
|
+
pidx = _property_index(template)
|
|
85
|
+
props = []
|
|
86
|
+
for label, value in (config.get("properties") or {}).items():
|
|
87
|
+
prop = pidx.get(str(label).strip().lower()) or pidx.get(label)
|
|
88
|
+
if not prop:
|
|
89
|
+
known = sorted({p["label"] for p in template.get("properties") or [] if p.get("label")})
|
|
90
|
+
raise UsageError(f"credential template {template.get('name')!r} has no "
|
|
91
|
+
f"property {label!r}; known: {known}")
|
|
92
|
+
props.append({"id": prop["id"], "value": _resolve_option(prop, value)})
|
|
93
|
+
dto = {
|
|
94
|
+
"gid": config.get("id"),
|
|
95
|
+
"gtid": template.get("gid"),
|
|
96
|
+
"gtpid": template.get("pid"),
|
|
97
|
+
"name": config["name"],
|
|
98
|
+
"tname": template.get("name"),
|
|
99
|
+
"type": template.get("type"),
|
|
100
|
+
# status is the "validated" flag in the manager list. prepare_ctx runs the
|
|
101
|
+
# /test probe and sets ctx["validated"] so a passing credential persists as
|
|
102
|
+
# validated (functionally identical to not-validated, but cleaner).
|
|
103
|
+
"status": bool(ctx.get("validated", False)),
|
|
104
|
+
"description": config.get("description", ""),
|
|
105
|
+
"properties": props,
|
|
106
|
+
}
|
|
107
|
+
return dto
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def _test_ok(res) -> bool:
|
|
111
|
+
"""Did POST /api/Credentials/test succeed? Response: {isSuccess, statusCode, ...}."""
|
|
112
|
+
if not isinstance(res, dict):
|
|
113
|
+
return False
|
|
114
|
+
if str(res.get("isSuccess")).strip().lower() == "true":
|
|
115
|
+
return True
|
|
116
|
+
try:
|
|
117
|
+
return 200 <= int(res.get("statusCode")) < 300
|
|
118
|
+
except (TypeError, ValueError):
|
|
119
|
+
return False
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def prepare_ctx(client, config: dict) -> dict:
|
|
123
|
+
"""Resolve the named credential template to its full definition (gid/pid +
|
|
124
|
+
property ids/options) and run the /test probe so a passing credential is saved
|
|
125
|
+
as **validated** (set ctx["validated"]; build maps it to the status flag). The
|
|
126
|
+
test uses the credential's own `Test endpoint` / test-parameters — those are for
|
|
127
|
+
validation only and do NOT flow to the action, so the action still needs its own
|
|
128
|
+
request params."""
|
|
129
|
+
want = (config.get("template") or "").strip().lower()
|
|
130
|
+
if not want:
|
|
131
|
+
raise UsageError("config.template is required (a credential type name, e.g. 'REST API')")
|
|
132
|
+
types = client.get("/api/Credentials/types")
|
|
133
|
+
for t in types or []:
|
|
134
|
+
if (t.get("name") or "").strip().lower() == want:
|
|
135
|
+
validated = False
|
|
136
|
+
try: # probe so it can persist as validated
|
|
137
|
+
res = client.post("/api/Credentials/test", build(config, {"template": t}))
|
|
138
|
+
validated = _test_ok(res)
|
|
139
|
+
except Exception: # noqa: BLE001 - never block a create on the probe
|
|
140
|
+
validated = False
|
|
141
|
+
return {"template": t, "validated": validated}
|
|
142
|
+
names = sorted((t.get("name") or "") for t in (types or []))
|
|
143
|
+
raise UsageError(f"unknown credential template {config.get('template')!r}; known: {names}")
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _extract_id(resp, dto):
|
|
147
|
+
if isinstance(resp, dict):
|
|
148
|
+
return resp.get("id") or resp.get("Id") or resp.get("gid")
|
|
149
|
+
return None
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def _validate(client, dto, ctx):
|
|
153
|
+
"""POST /api/Credentials/test — a live connection probe. Returns the raw
|
|
154
|
+
result; shape is server-defined."""
|
|
155
|
+
try:
|
|
156
|
+
res = client.post("/api/Credentials/test", dto)
|
|
157
|
+
return {"tested": True, "result": res}
|
|
158
|
+
except Exception as e: # noqa: BLE001 - report, don't abort the create
|
|
159
|
+
return {"tested": False, "error": str(e)[:300]}
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def _edit(client, resource_id, config, ctx):
|
|
163
|
+
dto = build({**config, "id": resource_id}, ctx)
|
|
164
|
+
client.put("/api/Credentials", dto)
|
|
165
|
+
return client.get(f"/api/Credentials/{resource_id}")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
COMPONENT = Component(
|
|
169
|
+
name="credential",
|
|
170
|
+
description="PROCESIO credential instance: saved values for a connection template.",
|
|
171
|
+
dir=DIR,
|
|
172
|
+
build=build,
|
|
173
|
+
create_endpoint=("POST", "/api/Credentials"),
|
|
174
|
+
get_path="/api/Credentials/{id}",
|
|
175
|
+
extract_id=_extract_id,
|
|
176
|
+
prepare_ctx=prepare_ctx,
|
|
177
|
+
validate=_validate,
|
|
178
|
+
edit=_edit,
|
|
179
|
+
)
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"title": "PROCESIO Credential config",
|
|
4
|
+
"description": "Create/edit a credential instance for a connection template. 'template' is the type name (e.g. 'REST API', 'Outbound e-mail (SMTP)', 'SQL'); 'properties' maps property labels to values (select/radio option NAMES are accepted and resolved to their value).",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": ["template", "name", "properties"],
|
|
8
|
+
"properties": {
|
|
9
|
+
"template": {"type": "string", "minLength": 1, "description": "credential template/type name"},
|
|
10
|
+
"name": {"type": "string", "minLength": 1, "description": "instance name"},
|
|
11
|
+
"description": {"type": "string"},
|
|
12
|
+
"properties": {
|
|
13
|
+
"type": "object",
|
|
14
|
+
"description": "property label (or id) -> value (secrets included here). A value may be an array (e.g. an OAuth2 'Scopes' pills list) or object for structured properties.",
|
|
15
|
+
"minProperties": 1,
|
|
16
|
+
"additionalProperties": {"type": ["string", "number", "boolean", "null", "array", "object"]}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Credential sub-tool
|
|
2
|
+
|
|
3
|
+
Create/edit a PROCESIO **credential instance** — saved values for a connection
|
|
4
|
+
template (REST API, SMTP, SQL, SFTP, OAuth2 services, …). Actions reference a
|
|
5
|
+
credential by its instance id.
|
|
6
|
+
|
|
7
|
+
## Config
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"template": "REST API",
|
|
12
|
+
"name": "GitHub public",
|
|
13
|
+
"description": "no-auth REST",
|
|
14
|
+
"properties": {
|
|
15
|
+
"URL": "https://api.github.com",
|
|
16
|
+
"Authentication method": "No authentication",
|
|
17
|
+
"Method": "GET",
|
|
18
|
+
"Test endpoint": "/zen"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
- **template** — the connection type **name** (from `GET /api/Credentials/types`;
|
|
24
|
+
e.g. `REST API`, `Outbound e-mail (SMTP)`, `SQL`, `SFTP`).
|
|
25
|
+
- **properties** — property **label** (or id) → value. Secret values (passwords,
|
|
26
|
+
keys) go here. For `select`/`radio` properties you may pass the option **name**
|
|
27
|
+
(e.g. `"No authentication"`, `"GET"`) — it is resolved to the option's value.
|
|
28
|
+
|
|
29
|
+
## Database credentials — SQL Server, MySQL, and Redis
|
|
30
|
+
|
|
31
|
+
The DB credential type (named **`SQL`** in the live catalog) is now multi-engine: the
|
|
32
|
+
platform added `DbClientType.MYSQL = 2` alongside `MSSQL = 1` (Web-Api / Process-Execution
|
|
33
|
+
`CustomMySQLClient`, PRC-3696), so the SAME credential template creates a **MySQL**
|
|
34
|
+
connection by choosing the **"Server Type"** option `MySQL` (live-confirmed option value
|
|
35
|
+
`40404040-0001-0001-0002-cccccccccccc`; MSSQL is `…-0001-…`). No new tool code — the builder
|
|
36
|
+
resolves the option name to its guid like any other select property. The DB actions
|
|
37
|
+
(**Execute Query** / **Execute Command**, GUIDs `76470756-…` / `a1625da6-…`; the newer V2 variants add a Timeout + Parameters tab) then run against it
|
|
38
|
+
unchanged, and the credential's Test button opens a real `MySqlConnection`. Live property
|
|
39
|
+
labels on the `SQL` type: Server Type, Protocol Type, Server Name, Port Number, Database
|
|
40
|
+
Name, Encrypt, Pooling, Trust Server Certificate, Authentication Type, Username, Password.
|
|
41
|
+
|
|
42
|
+
```json
|
|
43
|
+
{
|
|
44
|
+
"template": "SQL",
|
|
45
|
+
"name": "reporting-mysql",
|
|
46
|
+
"properties": {
|
|
47
|
+
"Server Type": "MySQL",
|
|
48
|
+
"Server Name": "db.internal",
|
|
49
|
+
"Port Number": "3306",
|
|
50
|
+
"Database Name": "reporting",
|
|
51
|
+
"Username": "svc_report",
|
|
52
|
+
"Password": "<secret>"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
**Redis** is its own standalone credential type — `CredentialsType.REDIS = 9`, NOT a
|
|
58
|
+
`DbClientType`/SQL sub-type (Web-Api #1452 / Action-Core #130 / Process-Execution #250).
|
|
59
|
+
Set `template` to `Redis` and pass its properties: **Host** (req; bare host/IP), **Port**
|
|
60
|
+
(6379), **Username**, **Password**, **Database** (0), **UseTls** (false),
|
|
61
|
+
**ValidateCertificate** (true), **ConnectTimeoutSeconds** (5), **CommandTimeoutSeconds** (5;
|
|
62
|
+
both >0, ≤300). Its process action is **"Redis Connector"** (pick Operation family →
|
|
63
|
+
Operation; 19 typed ops across Key/String, Expiration, Hash, List, Set/SortedSet, Pub/Sub;
|
|
64
|
+
outputs Response / Found / AffectedCount; no raw-command execution). Template GUID referenced
|
|
65
|
+
by the connector: `80808080-0001-0000-0000-aaaaaaaaaaaa`.
|
|
66
|
+
|
|
67
|
+
> ⚠ **Redis shipped to prod but is not yet activated** — its credential template is not
|
|
68
|
+
> seeded in DataBase-Update, so `Redis` does not yet appear in `GET /api/Credentials/types`
|
|
69
|
+
> (only 34 types today; MySQL via `SQL` is live). The contract above is stable and will
|
|
70
|
+
> work as-is once activated; until then a Redis credential cannot be created. Verify with
|
|
71
|
+
> the property/option names before relying on the literals above. Still not activated at
|
|
72
|
+
> the v3.0.0 release (2026-10-21). (Outbound DB hosts are
|
|
73
|
+
> also SSRF-guarded by a host blacklist — `DbHostBlacklistChecker` — so a blacklisted /
|
|
74
|
+
> private host is rejected at connect time.)
|
|
75
|
+
|
|
76
|
+
**Prelude** ships as a REST-derived credential - `template: "REST API/ Prelude"`, Bearer
|
|
77
|
+
token, base `https://platform.prelude.so`, driving the Prelude connector (phone
|
|
78
|
+
verification + lookup). It IS live in `GET /api/Credentials/types` (verified 2026-09-21,
|
|
79
|
+
35 types). See `PROCESIO-CONNECTORS-NOTES.md`.
|
|
80
|
+
|
|
81
|
+
**Azure Storage Account** is a standalone ROOT credential type since v3.0.0 (2026-10):
|
|
82
|
+
`CredentialsType.AZURE_STORAGE = 10`, template name `Azure Storage Account`, live in
|
|
83
|
+
`GET /api/Credentials/types`. It drives the **Azure Storage** connector (id
|
|
84
|
+
`83838383-0000-0000-0000-aaaaaaaaaaaa`). Fields (`be_id`):
|
|
85
|
+
|
|
86
|
+
| be_id | Notes |
|
|
87
|
+
| --- | --- |
|
|
88
|
+
| `AuthenticationType` | radio; the option values are GUIDs, their `be_value`s are `SharedKey` / `ServicePrincipal` |
|
|
89
|
+
| `AccountName` | |
|
|
90
|
+
| `AccountKey` | secret |
|
|
91
|
+
| `TenantId` | |
|
|
92
|
+
| `ClientId` | |
|
|
93
|
+
| `ClientSecret` | secret |
|
|
94
|
+
| `BlobEndpoint` | |
|
|
95
|
+
|
|
96
|
+
Resolve the `AuthenticationType` option from the live template rather than hardcoding its
|
|
97
|
+
GUID, and send only the fields the chosen method needs (see the conditional-property gotcha
|
|
98
|
+
below). Do not confuse it with the older derived template **"OAuth2 (REST API) / Azure
|
|
99
|
+
Storage"** (`REST_API_OAUTH_PREDEFINED`), which is an OAuth2 REST credential, not this root type.
|
|
100
|
+
|
|
101
|
+
> ⚠ **A credential read returns its secrets in plaintext (PRC-5556):** `credential-get`
|
|
102
|
+
> and the read API hand back stored secret values, not a masked placeholder. Never log,
|
|
103
|
+
> print, or echo a fetched credential, and never write one to a file the secret scanner
|
|
104
|
+
> then flags. Treat the whole object as sensitive.
|
|
105
|
+
|
|
106
|
+
## API contract (verified live 2026-06-24)
|
|
107
|
+
|
|
108
|
+
- **Validate@source:** `POST /api/Credentials/test` — a **live connection probe**
|
|
109
|
+
(e.g. a real GET for REST). Run via `--dry-run` (returns the built DTO + test
|
|
110
|
+
result) or automatically on create.
|
|
111
|
+
- **Create:** `POST /api/Credentials` (`CredentialsDto {gtid, gtpid, name, properties[]}`)
|
|
112
|
+
→ `{ "id": "<gid>" }`.
|
|
113
|
+
- **Get:** `GET /api/Credentials/{id}`.
|
|
114
|
+
- **Edit:** `PUT /api/Credentials` with `gid = id`.
|
|
115
|
+
- **Delete:** `DELETE /api/Credentials/{id}`.
|
|
116
|
+
|
|
117
|
+
## Validated status (auto)
|
|
118
|
+
|
|
119
|
+
The credential list shows **validated** / **not validated** (the DTO `status` flag).
|
|
120
|
+
On create/edit the builder runs `POST /api/Credentials/test`; if it returns
|
|
121
|
+
`isSuccess`/2xx, the credential is saved as **validated** (`status:true`). A
|
|
122
|
+
not-validated credential is functionally identical — this is cosmetic. To make a
|
|
123
|
+
credential validate, give it whatever its connection type needs to probe: for REST,
|
|
124
|
+
set `Method` and a `Test endpoint` (e.g. `"?cx=...&q=..."`); for SMTP the connection
|
|
125
|
+
probe alone suffices. **These test parameters are for validation only — they do NOT
|
|
126
|
+
flow into the action**, so the action still needs its own request params (e.g. Call
|
|
127
|
+
API's `Request Parameters` queryParams).
|
|
128
|
+
|
|
129
|
+
## Using a credential in a process
|
|
130
|
+
|
|
131
|
+
A credentials-type action property (e.g. Call API's "Select REST API credentials")
|
|
132
|
+
is bound by passing the credential **id** as the param value:
|
|
133
|
+
`"Select REST API credentials": "<credential id>"`.
|
|
134
|
+
|
|
135
|
+
## Gotchas
|
|
136
|
+
|
|
137
|
+
- `gtid`/`gtpid` are stable per template; the builder reads them from the live
|
|
138
|
+
template so it never hardcodes ids.
|
|
139
|
+
- A credential type resolves to its ROOT template (changed in v3.0.0, 2026-10). Before, a
|
|
140
|
+
derived template that kept its parent's `Type` (the `REST API/ Prelude` template, for one)
|
|
141
|
+
made every custom-action upload whose action had a `Credentials_Rest` property fail with
|
|
142
|
+
`TEMPLATE_ERROR`. A derived template and its root now report the same root type.
|
|
143
|
+
- Some required properties are *conditional* (depend on a radio choice, e.g.
|
|
144
|
+
Basic-auth fields only matter when Basic auth is selected) — send only what your
|
|
145
|
+
chosen path needs.
|
|
146
|
+
|
|
147
|
+
## Editing an existing credential — what a partial `--config` silently costs
|
|
148
|
+
|
|
149
|
+
`credential-edit` builds a **whole** DTO from the config you pass; it does not
|
|
150
|
+
merge with what is on the server. Everything you leave out is re-derived or
|
|
151
|
+
sent empty, so an edit meant to change one field can quietly move several.
|
|
152
|
+
|
|
153
|
+
- **Unconditionally-required properties must be re-sent even when you are not
|
|
154
|
+
changing them.** Omitting one fails the PUT with
|
|
155
|
+
`{"statusCode": 113, "value": "Required credentials fields should not be
|
|
156
|
+
empty.", "target": "<Property Label>"}`. The 400 names the property, so read
|
|
157
|
+
`target` rather than guessing. For REST API that is at least `Method`; a
|
|
158
|
+
credential that carries a test probe also needs its `Test endpoint`.
|
|
159
|
+
- **Re-send the current value of every property you want left alone**, read
|
|
160
|
+
from `credential-get` — not typed from a console display. A value copied out
|
|
161
|
+
of terminal output is truncated at the terminal width, and the edit then
|
|
162
|
+
shortens the stored field to whatever fitted on screen. A description silently
|
|
163
|
+
went from 183 characters to 88 this way. Read the field, pass the field.
|
|
164
|
+
- **`status` cannot be pinned.** The config schema refuses the key outright
|
|
165
|
+
(`Additional properties are not allowed ('status' was unexpected)`), because
|
|
166
|
+
it is not a setting: it is the manager list's *validated* flag, recomputed on
|
|
167
|
+
every create/edit from the `POST /api/Credentials/test` probe. Expect it to
|
|
168
|
+
move on any edit and report it rather than claiming the field held still.
|
|
169
|
+
- **The validated flag proves only what the test endpoint proves.** If the
|
|
170
|
+
credential's `Test endpoint` points at an unauthenticated route, the probe
|
|
171
|
+
passes with no credentials at all and *validated* says nothing about whether
|
|
172
|
+
the auth material works. Only a real call through the action does.
|
|
173
|
+
- **Collapsable properties come back with different scaffolding after an edit.**
|
|
174
|
+
The server starts emitting a `be_id` per sub-field and stops emitting
|
|
175
|
+
`configurations`/`pill`, and it drops blank placeholder rows from table
|
|
176
|
+
properties. None of that is a value change. When diffing a before/after
|
|
177
|
+
export, reduce each property to its `{sub-field id -> value}` leaves — do not
|
|
178
|
+
compare the raw blobs (five phantom differences) and do not skip the
|
|
179
|
+
properties (a real change would hide).
|
|
180
|
+
- **⚠ The tool's response echoes secret-bearing property values back**, in both
|
|
181
|
+
the dry-run DTO and the edit result. Never log, capture or persist that
|
|
182
|
+
stdout. Build the config in-process from the credential store and parse the
|
|
183
|
+
response rather than printing it.
|
|
184
|
+
|
|
185
|
+
## No Bearer option in the REST API template
|
|
186
|
+
|
|
187
|
+
The authentication selector offers `NoAuth`, `BasicAuth`, `ApiKey`, `OAuth2`
|
|
188
|
+
and `Certificate` — there is **no Bearer**. To send `Authorization: Bearer
|
|
189
|
+
<token>`, choose API key authentication and set `Key` = `Authorization`,
|
|
190
|
+
`Value` = `Bearer <token>`, with the `Header` checkbox true (it routes the pair
|
|
191
|
+
to a header rather than a query parameter). The auth method must be given as the
|
|
192
|
+
option **name** (`"API key authentication"`), not its `be_value`; a raw string
|
|
193
|
+
saves but fails at runtime with `Unrecognized Guid format`.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"gid": null,
|
|
3
|
+
"gtid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
4
|
+
"gtpid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
5
|
+
"name": "GitHub",
|
|
6
|
+
"tname": "REST API",
|
|
7
|
+
"type": "rest",
|
|
8
|
+
"status": false,
|
|
9
|
+
"description": "public",
|
|
10
|
+
"properties": [
|
|
11
|
+
{
|
|
12
|
+
"id": "p-url",
|
|
13
|
+
"value": "https://api.github.com"
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
"id": "p-auth",
|
|
17
|
+
"value": "opt-noauth"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "p-method",
|
|
21
|
+
"value": "opt-get"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "p-test",
|
|
25
|
+
"value": "/zen"
|
|
26
|
+
}
|
|
27
|
+
]
|
|
28
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "REST API",
|
|
3
|
+
"gid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
4
|
+
"pid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
5
|
+
"type": "rest",
|
|
6
|
+
"properties": [
|
|
7
|
+
{
|
|
8
|
+
"id": "p-url",
|
|
9
|
+
"label": "URL",
|
|
10
|
+
"type": "text"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"id": "p-auth",
|
|
14
|
+
"label": "Authentication method",
|
|
15
|
+
"type": "radio",
|
|
16
|
+
"options": [
|
|
17
|
+
{
|
|
18
|
+
"name": "No authentication",
|
|
19
|
+
"value": "opt-noauth"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "Basic authentication",
|
|
23
|
+
"value": "opt-basic"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "p-method",
|
|
29
|
+
"label": "Method",
|
|
30
|
+
"type": "select",
|
|
31
|
+
"options": [
|
|
32
|
+
{
|
|
33
|
+
"name": "GET",
|
|
34
|
+
"value": "opt-get"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"id": "p-test",
|
|
40
|
+
"label": "Test endpoint",
|
|
41
|
+
"type": "text"
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_note": "Golden CredentialsDto (POST /api/Credentials body). gtid=template gid, gtpid=template pid (both stable per connection type, from GET /api/Credentials/types). properties[] = {id, value} where id is a template property id and value is the entered value (secrets live here; select/radio values are the option's guid). gid is null on create (server assigns) / the instance id on edit. Verified live 2026-06-24: created a REST API credential, POST /api/Credentials/test returned a live 200.",
|
|
3
|
+
"gid": null,
|
|
4
|
+
"gtid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
5
|
+
"gtpid": "10101010-0001-0000-0000-aaaaaaaaaaaa",
|
|
6
|
+
"name": "<name>",
|
|
7
|
+
"tname": "REST API",
|
|
8
|
+
"type": null,
|
|
9
|
+
"status": false,
|
|
10
|
+
"description": "",
|
|
11
|
+
"properties": [
|
|
12
|
+
{"id": "10101010-0001-0001-0000-bbbbbbbbbbbb", "value": "<URL>"},
|
|
13
|
+
{"id": "10101010-0001-0004-0000-bbbbbbbbbbbb", "value": "<auth method option guid>"},
|
|
14
|
+
{"id": "10101010-0001-0002-0000-bbbbbbbbbbbb", "value": "<method option guid>"}
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Refresh `action_catalog.json` from a live PROCESIO workspace.
|
|
2
|
+
|
|
3
|
+
The bundle is the process builder's OFFLINE default: `prepare_ctx` tries the live
|
|
4
|
+
workspace catalog first and falls back here when that fetch is slow or fails. A
|
|
5
|
+
stale bundle therefore does not fail loudly - it fails as
|
|
6
|
+
`unknown action '<name>' - not in the action catalog` for any action the platform
|
|
7
|
+
has gained since the bundle was taken, and only when the live fetch also misses
|
|
8
|
+
its deadline. That is a confusing pair of symptoms for one cause, which is why
|
|
9
|
+
this script exists rather than the bundle being hand-edited.
|
|
10
|
+
|
|
11
|
+
`action_catalog.json`'s own note has referred to this file since 24/06/2026; it
|
|
12
|
+
was not actually present until a build needed the `Data Store` action and found
|
|
13
|
+
the bundle 1 action behind.
|
|
14
|
+
|
|
15
|
+
python _refresh.py --profile <name> --workspace-id <guid> # report
|
|
16
|
+
python _refresh.py --profile <name> --workspace-id <guid> --write # apply
|
|
17
|
+
|
|
18
|
+
ADDITIVE BY DEFAULT. `--write` adds actions the bundle is missing and leaves
|
|
19
|
+
existing entries alone, because an in-place replacement of an action whose shape
|
|
20
|
+
has changed would silently alter every process the builder emits. Pass
|
|
21
|
+
`--replace-existing` to take the live definition for actions that are already
|
|
22
|
+
present, and diff the result before committing it.
|
|
23
|
+
"""
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
import json
|
|
28
|
+
import subprocess
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
HERE = Path(__file__).resolve().parent
|
|
33
|
+
BUNDLE = HERE / "action_catalog.json"
|
|
34
|
+
AAT = HERE.parents[3]
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def fetch_live(profile: str, workspace_id: str, timeout: int = 300) -> list:
|
|
38
|
+
"""`GET /api/Actions?getFullAction=true` through the registered tool.
|
|
39
|
+
|
|
40
|
+
That endpoint serialises every action's full configuration tree and is
|
|
41
|
+
occasionally very slow while the rest of the API stays sub-second, so this
|
|
42
|
+
runs with a generous timeout - it is a maintenance script, not a hot path."""
|
|
43
|
+
cmd = [sys.executable, str(AAT / "scripts" / "run-tool.py"), "procesio",
|
|
44
|
+
"request", "--method", "GET", "--path", "/api/Actions?getFullAction=true",
|
|
45
|
+
"--profile", profile, "--workspace-id", workspace_id]
|
|
46
|
+
proc = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8",
|
|
47
|
+
cwd=str(AAT), timeout=timeout)
|
|
48
|
+
body = json.loads(proc.stdout.strip() or "{}")
|
|
49
|
+
if "error" in body:
|
|
50
|
+
raise SystemExit(f"fetch failed: {json.dumps(body['error'])}")
|
|
51
|
+
res = body.get("result") or body
|
|
52
|
+
acts = res.get("actions") if isinstance(res, dict) else res
|
|
53
|
+
if not acts:
|
|
54
|
+
raise SystemExit("live catalog returned no actions")
|
|
55
|
+
return acts
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def main() -> int:
|
|
59
|
+
ap = argparse.ArgumentParser(description=__doc__.split("\n")[0])
|
|
60
|
+
ap.add_argument("--profile", required=True)
|
|
61
|
+
ap.add_argument("--workspace-id", required=True)
|
|
62
|
+
ap.add_argument("--write", action="store_true",
|
|
63
|
+
help="apply the change; without it, only report")
|
|
64
|
+
ap.add_argument("--replace-existing", action="store_true",
|
|
65
|
+
help="also take the live definition for actions already "
|
|
66
|
+
"bundled (diff the result before committing)")
|
|
67
|
+
ap.add_argument("--procesio-only", action="store_true",
|
|
68
|
+
help="keep only platform actions (isProcesioAction=true) "
|
|
69
|
+
"from the live catalog, so a workspace's own custom / "
|
|
70
|
+
"connector actions never leak into the offline bundle. "
|
|
71
|
+
"Use this whenever the refresh runs against a real "
|
|
72
|
+
"workspace, which the bundle is not meant to mirror.")
|
|
73
|
+
a = ap.parse_args()
|
|
74
|
+
|
|
75
|
+
bundle = json.loads(BUNDLE.read_text(encoding="utf-8"))
|
|
76
|
+
live = fetch_live(a.profile, a.workspace_id)
|
|
77
|
+
if a.procesio_only:
|
|
78
|
+
live = [x for x in live if x.get("isProcesioAction")]
|
|
79
|
+
|
|
80
|
+
# Project every live action to the bundle's canonical key set (the union of keys
|
|
81
|
+
# already in the bundle) BEFORE comparing or storing. The live API attaches volatile,
|
|
82
|
+
# workspace-specific fields (workspaceId, createdBy/updatedBy, *On timestamps, etc.)
|
|
83
|
+
# that must never enter a portable, checked-in snapshot; stripping them also makes
|
|
84
|
+
# `--replace-existing` flag only REAL config changes instead of timestamp churn.
|
|
85
|
+
from collections import Counter
|
|
86
|
+
_kc = Counter(k for x in bundle["actions"] for k in x.keys())
|
|
87
|
+
_n = len(bundle["actions"])
|
|
88
|
+
# Canonical keys appear in most actions; a volatile field (or one a few polluted
|
|
89
|
+
# entries carry) appears in a minority, so a majority threshold keeps the portable
|
|
90
|
+
# shape without hardcoding a blacklist that a new volatile field could slip past.
|
|
91
|
+
keep = {k for k, c in _kc.items() if c > _n / 2} if _n else None
|
|
92
|
+
|
|
93
|
+
def canon(act):
|
|
94
|
+
return {k: v for k, v in act.items() if k in keep} if keep else act
|
|
95
|
+
|
|
96
|
+
# First position per name — the bundle may carry duplicate names, so replace by
|
|
97
|
+
# recorded index (identity-based .index() blew up on a duplicated action).
|
|
98
|
+
pos = {}
|
|
99
|
+
for i, x in enumerate(bundle["actions"]):
|
|
100
|
+
nm = x.get("name")
|
|
101
|
+
if nm and nm not in pos:
|
|
102
|
+
pos[nm] = i
|
|
103
|
+
name_counts = Counter(x.get("name") for x in bundle["actions"])
|
|
104
|
+
by_name = {x.get("name"): x for x in bundle["actions"] if x.get("name")}
|
|
105
|
+
added, replaced, skipped_ambiguous = [], [], []
|
|
106
|
+
for act in live:
|
|
107
|
+
name = act.get("name")
|
|
108
|
+
if not name:
|
|
109
|
+
continue
|
|
110
|
+
act = canon(act)
|
|
111
|
+
if name not in by_name:
|
|
112
|
+
added.append(name)
|
|
113
|
+
pos[name] = len(bundle["actions"])
|
|
114
|
+
bundle["actions"].append(act)
|
|
115
|
+
by_name[name] = act
|
|
116
|
+
elif a.replace_existing and by_name[name] != act:
|
|
117
|
+
# A name that occurs more than once (e.g. an action shipped in two versions
|
|
118
|
+
# under one display name) cannot be targeted safely by name — replacing would
|
|
119
|
+
# collapse both onto one live definition. Skip and report it; fix those by id.
|
|
120
|
+
if name_counts[name] > 1:
|
|
121
|
+
if name not in skipped_ambiguous:
|
|
122
|
+
skipped_ambiguous.append(name)
|
|
123
|
+
continue
|
|
124
|
+
replaced.append(name)
|
|
125
|
+
bundle["actions"][pos[name]] = act
|
|
126
|
+
by_name[name] = act
|
|
127
|
+
|
|
128
|
+
missing_live = sorted(n for n in by_name if n not in {x.get("name") for x in live})
|
|
129
|
+
|
|
130
|
+
report = {"bundled_before": len(by_name), "live": len(live),
|
|
131
|
+
"added": sorted(added), "replaced": sorted(replaced),
|
|
132
|
+
"skipped_ambiguous_names": sorted(skipped_ambiguous),
|
|
133
|
+
"in_bundle_but_not_live": missing_live,
|
|
134
|
+
"written": False}
|
|
135
|
+
if a.write and (added or replaced):
|
|
136
|
+
# LF on purpose: the tree is LF (.gitattributes), and a bare write_text on Windows
|
|
137
|
+
# would turn every line into CRLF and bury the real change in EOL churn.
|
|
138
|
+
BUNDLE.write_text(json.dumps(bundle, indent=1, ensure_ascii=False),
|
|
139
|
+
encoding="utf-8", newline="\n")
|
|
140
|
+
report["written"] = True
|
|
141
|
+
report["bundled_after"] = len(bundle["actions"])
|
|
142
|
+
print(json.dumps(report, indent=2))
|
|
143
|
+
return 0
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
raise SystemExit(main())
|