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,275 @@
|
|
|
1
|
+
"""Full data-model (DataType) lifecycle actions beyond create/edit.
|
|
2
|
+
|
|
3
|
+
Mirrors how the PROCESIO UI works with data models (HAR-verified, see the
|
|
4
|
+
`procesio-datatype-create` memory note):
|
|
5
|
+
|
|
6
|
+
- `datatype-create` / `datatype-edit` (dto_actions) build a model attribute-by-attribute
|
|
7
|
+
via POST /api/dataTypes/attribute/{id} — the path that COMPILES attributes into the
|
|
8
|
+
runtime model and keeps referenced sub-models REUSABLE in other models.
|
|
9
|
+
- `datatype-create` with `fromJson` infers a model from a JSON sample; its nested inner
|
|
10
|
+
models are created PRIVATE (NOT reusable in other models) until promoted.
|
|
11
|
+
- `datatype-change-to-public` promotes a private inner model to PUBLIC (reusable).
|
|
12
|
+
- `datatype-clone` clones an inner model.
|
|
13
|
+
- `datatype-add-attribute` / `-edit-attribute` / `-delete-attribute` operate on one attr.
|
|
14
|
+
- `datatype-get` / `datatype-delete` read / remove a model.
|
|
15
|
+
|
|
16
|
+
JSON in / JSON out; impure (live client). The v1.19 surface is /api/DataTypes/*.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import re
|
|
22
|
+
|
|
23
|
+
from tools.procesio.actiondef import ActionDef
|
|
24
|
+
from tools.procesio.dto import refdata
|
|
25
|
+
from tools.procesio.errors import UsageError
|
|
26
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
27
|
+
|
|
28
|
+
_GUID = re.compile(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-"
|
|
29
|
+
r"[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def _bool_opt(s) -> bool:
|
|
33
|
+
return str(s).strip().lower() in ("1", "true", "yes", "y", "on")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _resolve_data_type(client, value: str) -> str:
|
|
37
|
+
"""Resolve a data-type reference to its id: a primitive name (string/integer/…),
|
|
38
|
+
an existing model name (looked up live), or a guid (used as-is)."""
|
|
39
|
+
v = (value or "").strip()
|
|
40
|
+
if not v:
|
|
41
|
+
raise UsageError("--data-type is required")
|
|
42
|
+
if _GUID.match(v):
|
|
43
|
+
return v
|
|
44
|
+
try:
|
|
45
|
+
return refdata.primitive_type_id(v)
|
|
46
|
+
except KeyError:
|
|
47
|
+
pass
|
|
48
|
+
r = client.get("/api/DataTypes", {"pageNumber": 1, "pageItemCount": 1000,
|
|
49
|
+
"includeProcesioEntries": True, "includeExternalEntries": True})
|
|
50
|
+
items = r.get("pageItems") if isinstance(r, dict) else r
|
|
51
|
+
for it in items or []:
|
|
52
|
+
if (it.get("name") or it.get("Name") or "").strip().lower() == v.lower():
|
|
53
|
+
return it.get("id") or it.get("Id")
|
|
54
|
+
raise UsageError(f"unknown data type {value!r} (not a primitive, a guid, or an existing model name)")
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _attr_summary(model: dict) -> list:
|
|
58
|
+
return [{"id": a.get("id"), "name": a.get("name"), "dataTypeId": a.get("dataTypeId"),
|
|
59
|
+
"isList": a.get("isList"), "isDataModel": a.get("isDataModel"),
|
|
60
|
+
"inlinedChildren": len(a.get("attributes") or [])}
|
|
61
|
+
for a in (model.get("attributes") or [])]
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
# -- model get / delete -------------------------------------------------------
|
|
65
|
+
|
|
66
|
+
def get_datatype(client, args) -> dict:
|
|
67
|
+
return {"result": client.get(f"/api/DataTypes/{args.id}")}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def delete_datatype(client, args) -> dict:
|
|
71
|
+
client.request("DELETE", f"/api/DataTypes/{args.id}")
|
|
72
|
+
return {"deleted": True, "id": args.id}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
# -- attribute add / edit / delete -------------------------------------------
|
|
76
|
+
|
|
77
|
+
def _store_built_on_model(client, model_id: str):
|
|
78
|
+
"""Best-effort: the id of a data store whose data-model IS `model_id`, else None.
|
|
79
|
+
|
|
80
|
+
B-048 cluster 4a reported that adding an attribute to such a model DESTROYS the store
|
|
81
|
+
(both POSTs return ok, then columns read `[]` and rows go unreadable). Re-tested on a
|
|
82
|
+
real from-data-model store (2026-09) it did NOT reproduce, so the caller only WARNS on a
|
|
83
|
+
match, never refuses. The store's own data-model id (a from-data-model store gets a COPY
|
|
84
|
+
model, distinct from the source) is what matches here — verified live against
|
|
85
|
+
`GET /api/DataStore/{id}/data-model`. Fail-OPEN: any read error/unknown shape -> None,
|
|
86
|
+
so a transient hiccup never even warns.
|
|
87
|
+
"""
|
|
88
|
+
try:
|
|
89
|
+
listing = client.get("/api/DataStore") or {}
|
|
90
|
+
except Exception: # noqa: BLE001 - advisory guard, never fatal
|
|
91
|
+
return None
|
|
92
|
+
stores = listing if isinstance(listing, list) else (
|
|
93
|
+
listing.get("data") or listing.get("pageItems") or listing.get("items") or [])
|
|
94
|
+
for s in stores if isinstance(stores, list) else []:
|
|
95
|
+
sid = (s.get("id") or s.get("dataStoreId")) if isinstance(s, dict) else None
|
|
96
|
+
if not sid:
|
|
97
|
+
continue
|
|
98
|
+
try:
|
|
99
|
+
dm = client.get(f"/api/DataStore/{sid}/data-model") or {}
|
|
100
|
+
except Exception: # noqa: BLE001
|
|
101
|
+
continue
|
|
102
|
+
mid = dm.get("id") or dm.get("dataTypeId") or (dm.get("dataModel") or {}).get("id")
|
|
103
|
+
if mid and str(mid) == str(model_id):
|
|
104
|
+
return sid
|
|
105
|
+
return None
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def add_attribute(client, args) -> dict:
|
|
109
|
+
"""Add ONE attribute via POST /api/dataTypes/attribute/{id} — the only path that
|
|
110
|
+
COMPILES the attribute into the runtime model (and inlines a referenced child model
|
|
111
|
+
+ links its parentIds). --data-type accepts a primitive name, an existing model name,
|
|
112
|
+
or a guid; --is-list makes it a list of that type.
|
|
113
|
+
|
|
114
|
+
WARNS (non-blocking) when the model backs a data store: B-048 cluster 4a reported that
|
|
115
|
+
such an add DESTROYS the store, but re-testing on a real from-data-model store (2026-09)
|
|
116
|
+
did NOT reproduce it — the store kept its columns and rows — so this is a caution, not a
|
|
117
|
+
refusal. --force suppresses the warning."""
|
|
118
|
+
warning = None
|
|
119
|
+
if not getattr(args, "force", False):
|
|
120
|
+
store = _store_built_on_model(client, args.id)
|
|
121
|
+
if store:
|
|
122
|
+
warning = (
|
|
123
|
+
f"model {args.id} backs data store {store}. B-048 cluster 4a reported that "
|
|
124
|
+
f"adding an attribute to a store-backing model DESTROYS the store (columns "
|
|
125
|
+
f"read [], rows unreadable), but a real from-data-model store re-tested "
|
|
126
|
+
f"2026-09 SURVIVED this exact add, so treat it as a caution rather than a "
|
|
127
|
+
f"certainty: re-read the store (datastore-get / get-rows) and confirm its "
|
|
128
|
+
f"columns and rows afterwards. --force suppresses this warning.")
|
|
129
|
+
dtid = _resolve_data_type(client, args.data_type)
|
|
130
|
+
payload = {"id": None, "name": args.name,
|
|
131
|
+
"displayName": args.display_name or args.name, "dataTypeId": dtid,
|
|
132
|
+
"isList": bool(args.is_list), "jsonProperty": args.json_property or args.name,
|
|
133
|
+
"parentDataTypeId": args.id}
|
|
134
|
+
if args.hidden:
|
|
135
|
+
payload["hidden"] = True
|
|
136
|
+
if args.public:
|
|
137
|
+
payload["isPublic"] = True
|
|
138
|
+
client.post(f"/api/DataTypes/attribute/{args.id}", payload)
|
|
139
|
+
model = client.get(f"/api/DataTypes/{args.id}")
|
|
140
|
+
out = {"added": True, "model": args.id, "attribute": args.name,
|
|
141
|
+
"attributes": _attr_summary(model)}
|
|
142
|
+
if warning:
|
|
143
|
+
out["warning"] = warning
|
|
144
|
+
return out
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def edit_attribute(client, args) -> dict:
|
|
148
|
+
"""Edit an existing attribute via PUT /api/dataTypes/attribute/{id} (full object).
|
|
149
|
+
--attribute is the attribute id or its current name; only the flags you pass change."""
|
|
150
|
+
model = client.get(f"/api/DataTypes/{args.id}")
|
|
151
|
+
attr = next((a for a in (model.get("attributes") or [])
|
|
152
|
+
if a.get("id") == args.attribute
|
|
153
|
+
or (a.get("name") or "").lower() == str(args.attribute).lower()), None)
|
|
154
|
+
if not attr:
|
|
155
|
+
raise UsageError(f"model {args.id} has no attribute {args.attribute!r}")
|
|
156
|
+
if args.name:
|
|
157
|
+
attr["name"] = args.name
|
|
158
|
+
if args.display_name:
|
|
159
|
+
attr["displayName"] = args.display_name
|
|
160
|
+
if args.data_type:
|
|
161
|
+
attr["dataTypeId"] = _resolve_data_type(client, args.data_type)
|
|
162
|
+
if args.is_list is not None:
|
|
163
|
+
attr["isList"] = bool(args.is_list)
|
|
164
|
+
if args.json_property:
|
|
165
|
+
attr["jsonProperty"] = args.json_property
|
|
166
|
+
if args.hidden is not None:
|
|
167
|
+
attr["hidden"] = bool(args.hidden)
|
|
168
|
+
if args.public is not None:
|
|
169
|
+
attr["isPublic"] = bool(args.public)
|
|
170
|
+
client.put(f"/api/DataTypes/attribute/{args.id}", attr)
|
|
171
|
+
return {"edited": True, "model": args.id, "attribute": attr.get("name"),
|
|
172
|
+
"attributes": _attr_summary(client.get(f"/api/DataTypes/{args.id}"))}
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def delete_attribute(client, args) -> dict:
|
|
176
|
+
model = client.get(f"/api/DataTypes/{args.id}")
|
|
177
|
+
attr = next((a for a in (model.get("attributes") or [])
|
|
178
|
+
if a.get("id") == args.attribute
|
|
179
|
+
or (a.get("name") or "").lower() == str(args.attribute).lower()), None)
|
|
180
|
+
if not attr:
|
|
181
|
+
raise UsageError(f"model {args.id} has no attribute {args.attribute!r}")
|
|
182
|
+
client.request("DELETE", f"/api/DataTypes/attribute/{args.id}/{attr.get('id')}")
|
|
183
|
+
return {"deleted": True, "model": args.id, "attribute": attr.get("name")}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
# -- promote private inner model / clone -------------------------------------
|
|
187
|
+
|
|
188
|
+
def change_to_public(client, args) -> dict:
|
|
189
|
+
"""Promote a PRIVATE inner data model (one created by `fromJson`) to PUBLIC so it can
|
|
190
|
+
be reused in other models. --root-id = the top/root model id, --id = the inner id."""
|
|
191
|
+
client.post("/api/DataTypes/changeToPublic",
|
|
192
|
+
{"rootDataTypeId": args.root_id, "dataTypeId": args.id})
|
|
193
|
+
return {"changedToPublic": True, "rootDataTypeId": args.root_id, "dataTypeId": args.id,
|
|
194
|
+
"result": client.get(f"/api/DataTypes/{args.id}")}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def clone_datatype(client, args) -> dict:
|
|
198
|
+
"""Clone an inner data model. --root-id = the top/root model id, --id = the inner id."""
|
|
199
|
+
resp = client.post("/api/DataTypes/clone",
|
|
200
|
+
{"rootDataTypeId": args.root_id, "dataTypeId": args.id})
|
|
201
|
+
return {"cloned": True, "rootDataTypeId": args.root_id, "dataTypeId": args.id, "result": resp}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
# -- argparse -----------------------------------------------------------------
|
|
205
|
+
|
|
206
|
+
def _id_args(p: argparse.ArgumentParser) -> None:
|
|
207
|
+
add_profile_arg(p)
|
|
208
|
+
p.add_argument("--id", required=True, help="data model id")
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
def _add_attr_args(p: argparse.ArgumentParser) -> None:
|
|
212
|
+
add_profile_arg(p)
|
|
213
|
+
p.add_argument("--id", required=True, help="parent model id")
|
|
214
|
+
p.add_argument("--name", required=True, help="attribute name")
|
|
215
|
+
p.add_argument("--data-type", dest="data_type", required=True,
|
|
216
|
+
help="primitive name (string/integer/…), an existing model name, or a guid")
|
|
217
|
+
p.add_argument("--is-list", dest="is_list", action="store_true",
|
|
218
|
+
help="attribute holds a list of the type")
|
|
219
|
+
p.add_argument("--display-name", dest="display_name")
|
|
220
|
+
p.add_argument("--json-property", dest="json_property", help="JSON key (defaults to name)")
|
|
221
|
+
p.add_argument("--hidden", action="store_true")
|
|
222
|
+
p.add_argument("--public", action="store_true", help="mark the attribute isPublic")
|
|
223
|
+
p.add_argument("--force", action="store_true",
|
|
224
|
+
help="suppress the store-backing caution (B-048 cluster 4a)")
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def _edit_attr_args(p: argparse.ArgumentParser) -> None:
|
|
228
|
+
add_profile_arg(p)
|
|
229
|
+
p.add_argument("--id", required=True, help="parent model id")
|
|
230
|
+
p.add_argument("--attribute", required=True, help="attribute id or current name")
|
|
231
|
+
p.add_argument("--name")
|
|
232
|
+
p.add_argument("--display-name", dest="display_name")
|
|
233
|
+
p.add_argument("--data-type", dest="data_type", help="new type (primitive/model/guid)")
|
|
234
|
+
p.add_argument("--json-property", dest="json_property")
|
|
235
|
+
p.add_argument("--is-list", dest="is_list", type=_bool_opt, default=None,
|
|
236
|
+
help="true/false (omit to leave unchanged)")
|
|
237
|
+
p.add_argument("--hidden", type=_bool_opt, default=None, help="true/false")
|
|
238
|
+
p.add_argument("--public", type=_bool_opt, default=None, help="isPublic true/false")
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _del_attr_args(p: argparse.ArgumentParser) -> None:
|
|
242
|
+
add_profile_arg(p)
|
|
243
|
+
p.add_argument("--id", required=True, help="parent model id")
|
|
244
|
+
p.add_argument("--attribute", required=True, help="attribute id or current name")
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def _promote_args(p: argparse.ArgumentParser) -> None:
|
|
248
|
+
add_profile_arg(p)
|
|
249
|
+
p.add_argument("--root-id", dest="root_id", required=True, help="root/top model id")
|
|
250
|
+
p.add_argument("--id", required=True, help="inner model id to promote/clone")
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
ACTIONS = {
|
|
254
|
+
"datatype-get": ActionDef(
|
|
255
|
+
func=get_datatype, add_args=_id_args, needs_client=True,
|
|
256
|
+
description="Get a data model with its attributes (GET /api/DataTypes/{id})."),
|
|
257
|
+
"datatype-delete": ActionDef(
|
|
258
|
+
func=delete_datatype, add_args=_id_args, needs_client=True,
|
|
259
|
+
description="Delete a data model (DELETE /api/DataTypes/{id})."),
|
|
260
|
+
"datatype-add-attribute": ActionDef(
|
|
261
|
+
func=add_attribute, add_args=_add_attr_args, needs_client=True,
|
|
262
|
+
description="Add one attribute to a model — compiles it; a model-typed attr inlines the child + keeps it reusable."),
|
|
263
|
+
"datatype-edit-attribute": ActionDef(
|
|
264
|
+
func=edit_attribute, add_args=_edit_attr_args, needs_client=True,
|
|
265
|
+
description="Edit one attribute (PUT /api/dataTypes/attribute/{id})."),
|
|
266
|
+
"datatype-delete-attribute": ActionDef(
|
|
267
|
+
func=delete_attribute, add_args=_del_attr_args, needs_client=True,
|
|
268
|
+
description="Delete one attribute (DELETE /api/dataTypes/attribute/{id}/{attrId})."),
|
|
269
|
+
"datatype-change-to-public": ActionDef(
|
|
270
|
+
func=change_to_public, add_args=_promote_args, needs_client=True,
|
|
271
|
+
description="Promote a private inner model (from fromJson) to public so it's reusable (POST /api/DataTypes/changeToPublic)."),
|
|
272
|
+
"datatype-clone": ActionDef(
|
|
273
|
+
func=clone_datatype, add_args=_promote_args, needs_client=True,
|
|
274
|
+
description="Clone an inner data model (POST /api/DataTypes/clone)."),
|
|
275
|
+
}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"""Generic <component>-create / <component>-edit actions for the DTO sub-tools.
|
|
2
|
+
|
|
3
|
+
One pair per registered component (dto/registry.py). Each:
|
|
4
|
+
- validates --config against the component's JSON Schema (fail-fast),
|
|
5
|
+
- builds the full DTO by merging onto the golden template (pure),
|
|
6
|
+
- --dry-run: returns the built DTO (+ validate@source oracle if any), sends nothing,
|
|
7
|
+
- otherwise create (POST) or edit (desired-state), then re-GET and return it.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import json
|
|
13
|
+
|
|
14
|
+
from tools.procesio.actiondef import ActionDef
|
|
15
|
+
from tools.procesio.dto import framework, registry
|
|
16
|
+
from tools.procesio.errors import UsageError
|
|
17
|
+
from tools.procesio.handlers.common import add_profile_arg
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _load_config(args) -> dict:
|
|
21
|
+
raw = None
|
|
22
|
+
if getattr(args, "config_file", None):
|
|
23
|
+
with open(args.config_file, encoding="utf-8") as f:
|
|
24
|
+
raw = f.read()
|
|
25
|
+
elif getattr(args, "config", None):
|
|
26
|
+
raw = args.config
|
|
27
|
+
if raw is None:
|
|
28
|
+
raise UsageError("provide --config '<json>' or --config-file <path>")
|
|
29
|
+
try:
|
|
30
|
+
cfg = json.loads(raw)
|
|
31
|
+
except json.JSONDecodeError as e:
|
|
32
|
+
raise UsageError(f"--config must be valid JSON: {e}") from e
|
|
33
|
+
if not isinstance(cfg, dict):
|
|
34
|
+
raise UsageError("--config must be a JSON object")
|
|
35
|
+
return cfg
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _add_gate_args(p: argparse.ArgumentParser) -> None:
|
|
39
|
+
"""Shared save-gate flags (process only enforces them; harmless elsewhere)."""
|
|
40
|
+
p.add_argument("--force", action="store_true",
|
|
41
|
+
help="bypass the pre-save FE (designer) + BE validation gate")
|
|
42
|
+
p.add_argument("--no-types", dest="no_types", action="store_true",
|
|
43
|
+
help="skip the advisory data-type-mismatch (warning) layer in the gate")
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _create_args(p: argparse.ArgumentParser) -> None:
|
|
47
|
+
add_profile_arg(p)
|
|
48
|
+
p.add_argument("--config", help="resource config as a JSON object")
|
|
49
|
+
p.add_argument("--config-file", dest="config_file", help="path to a JSON config file")
|
|
50
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
51
|
+
help="build + validate the DTO and return it without creating")
|
|
52
|
+
_add_gate_args(p)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def _edit_args(p: argparse.ArgumentParser) -> None:
|
|
56
|
+
add_profile_arg(p)
|
|
57
|
+
p.add_argument("--id", required=True, help="id of the resource to edit")
|
|
58
|
+
p.add_argument("--config", help="desired-state config as a JSON object")
|
|
59
|
+
p.add_argument("--config-file", dest="config_file", help="path to a JSON config file")
|
|
60
|
+
p.add_argument("--dry-run", dest="dry_run", action="store_true",
|
|
61
|
+
help="build the DTO and return it without editing")
|
|
62
|
+
# Separate from --force on purpose: --force answers "save it even though it is
|
|
63
|
+
# invalid"; this answers "yes, delete what the config leaves out". A create has
|
|
64
|
+
# nothing to remove, so the flag is only offered on edit.
|
|
65
|
+
p.add_argument("--allow-remove", dest="allow_remove", action="store_true",
|
|
66
|
+
help="permit this desired-state config to REMOVE actions/variables "
|
|
67
|
+
"the live resource has (refused by default)")
|
|
68
|
+
_add_gate_args(p)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _make_create(component):
|
|
72
|
+
def func(client, args):
|
|
73
|
+
config = _load_config(args)
|
|
74
|
+
ctx = framework.prepare(component, client, config)
|
|
75
|
+
ctx["_force"] = getattr(args, "force", False)
|
|
76
|
+
ctx["_no_types"] = getattr(args, "no_types", False)
|
|
77
|
+
dto = framework.build_dto(component, config, ctx)
|
|
78
|
+
# Pre-save gate (process): FE designer + BE validation. Raises ValidationBlocked
|
|
79
|
+
# on blocking errors unless --force. For --dry-run we force it open so the report
|
|
80
|
+
# is shown without aborting. Components without a save_gate fall back to the oracle.
|
|
81
|
+
if component.save_gate:
|
|
82
|
+
gate_ctx = {**ctx, "_force": True} if args.dry_run else ctx
|
|
83
|
+
oracle = component.save_gate(client, dto, gate_ctx)
|
|
84
|
+
else:
|
|
85
|
+
oracle = framework.run_validate(component, client, dto, ctx)
|
|
86
|
+
# Non-blocking lint of what is about to be saved (for a form: field names a
|
|
87
|
+
# designer save would rename, phantom parents, ...). Reported, never enforced.
|
|
88
|
+
warnings = component.lint(dto) if component.lint else []
|
|
89
|
+
if args.dry_run:
|
|
90
|
+
out = {"dry_run": True, "component": component.name, "dto": dto,
|
|
91
|
+
"validation": oracle}
|
|
92
|
+
if warnings:
|
|
93
|
+
out["warnings"] = warnings
|
|
94
|
+
return out
|
|
95
|
+
resp = framework.run_create(component, client, dto, ctx)
|
|
96
|
+
rid = component.extract_id(resp, dto)
|
|
97
|
+
verified = framework.run_get(component, client, rid, ctx) if rid else None
|
|
98
|
+
out = {"created": True, "component": component.name, "id": rid,
|
|
99
|
+
"validation": oracle, "result": verified if verified is not None else resp}
|
|
100
|
+
if isinstance(resp, dict) and resp.get("_capture"): # AUTO webhook listen+capture log
|
|
101
|
+
out["capture"] = resp["_capture"]
|
|
102
|
+
if warnings:
|
|
103
|
+
out["warnings"] = warnings
|
|
104
|
+
return out
|
|
105
|
+
return func
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _process_edit_args(p: argparse.ArgumentParser) -> None:
|
|
109
|
+
_edit_args(p)
|
|
110
|
+
p.add_argument("--keep-layout", dest="keep_layout", action="store_true",
|
|
111
|
+
help="keep the current canvas positions and place only new actions "
|
|
112
|
+
"(default: re-arrange the whole canvas, classic engine + clustering, "
|
|
113
|
+
"exactly as process-create does)")
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _make_edit(component):
|
|
117
|
+
def func(client, args):
|
|
118
|
+
config = _load_config(args)
|
|
119
|
+
if getattr(args, "keep_layout", False) and isinstance(config, dict) and "actions" in config:
|
|
120
|
+
config.setdefault("relayout", "new") # processes only: keep positions, place new actions
|
|
121
|
+
ctx = framework.prepare(component, client, config)
|
|
122
|
+
ctx["_force"] = getattr(args, "force", False)
|
|
123
|
+
ctx["_no_types"] = getattr(args, "no_types", False)
|
|
124
|
+
ctx["_allow_remove"] = getattr(args, "allow_remove", False)
|
|
125
|
+
if args.dry_run:
|
|
126
|
+
# Build it the way the EDIT would, so the preview shows the ids the edit would keep.
|
|
127
|
+
dto = framework.build_edit_dto(component, client, args.id, config, ctx)
|
|
128
|
+
out = {"dry_run": True, "edit": True, "component": component.name,
|
|
129
|
+
"id": args.id, "dto": dto}
|
|
130
|
+
warnings = component.lint(dto) if component.lint else []
|
|
131
|
+
if warnings:
|
|
132
|
+
out["warnings"] = warnings
|
|
133
|
+
return out
|
|
134
|
+
if not component.edit:
|
|
135
|
+
raise UsageError(f"{component.name} does not support edit yet")
|
|
136
|
+
framework.validate_config(component, config)
|
|
137
|
+
resp = component.edit(client, args.id, config, ctx)
|
|
138
|
+
out = {"edited": True, "component": component.name, "id": args.id, "result": resp}
|
|
139
|
+
warnings = component.lint(resp) if component.lint else []
|
|
140
|
+
if warnings:
|
|
141
|
+
out["warnings"] = warnings
|
|
142
|
+
return out
|
|
143
|
+
return func
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def _payload_docs(comp) -> tuple[dict, list]:
|
|
147
|
+
"""The component's OWN schema and a working config, for the manifest.
|
|
148
|
+
|
|
149
|
+
Both are read from the files the component already ships: the schema is the one
|
|
150
|
+
`validate_config` enforces, and the example is a test fixture. Reading them here
|
|
151
|
+
rather than restating them means a caller that only sees the manifest gets the same
|
|
152
|
+
contract the tool enforces, and no second copy exists to fall behind. Absent files
|
|
153
|
+
are not an error - a component without them simply publishes less.
|
|
154
|
+
"""
|
|
155
|
+
schema: dict = {}
|
|
156
|
+
try:
|
|
157
|
+
if comp.schema_path.exists():
|
|
158
|
+
schema = {"config": json.loads(comp.schema_path.read_text(encoding="utf-8"))}
|
|
159
|
+
except (OSError, json.JSONDecodeError):
|
|
160
|
+
schema = {}
|
|
161
|
+
|
|
162
|
+
examples: list = []
|
|
163
|
+
fixtures = comp.dir / "fixtures"
|
|
164
|
+
try:
|
|
165
|
+
for f in sorted(fixtures.glob("*.config.json")):
|
|
166
|
+
examples.append(json.loads(f.read_text(encoding="utf-8")))
|
|
167
|
+
break # one worked example is the point, not a corpus
|
|
168
|
+
except (OSError, json.JSONDecodeError):
|
|
169
|
+
examples = []
|
|
170
|
+
return schema, examples
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def _list_properties(comp) -> list[str]:
|
|
174
|
+
"""The config's top-level LIST properties, read from the component's own schema.
|
|
175
|
+
|
|
176
|
+
These are the collections the desired-state rule bites on, so naming them turns an
|
|
177
|
+
abstract rule ("the config replaces the definition") into an instruction a caller can
|
|
178
|
+
follow ("append to `actions` and send the whole list back"). Derived rather than
|
|
179
|
+
written down, so a schema that grows a list cannot leave the description behind.
|
|
180
|
+
"""
|
|
181
|
+
try:
|
|
182
|
+
schema = json.loads(comp.schema_path.read_text(encoding="utf-8"))
|
|
183
|
+
except (OSError, json.JSONDecodeError, AttributeError):
|
|
184
|
+
return []
|
|
185
|
+
props = schema.get("properties")
|
|
186
|
+
if not isinstance(props, dict):
|
|
187
|
+
return []
|
|
188
|
+
return [k for k, v in props.items()
|
|
189
|
+
if not k.startswith("_") and isinstance(v, dict) and v.get("type") == "array"]
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def build_actions() -> dict[str, ActionDef]:
|
|
193
|
+
out: dict[str, ActionDef] = {}
|
|
194
|
+
for name, comp in registry.all_components().items():
|
|
195
|
+
arg_schemas, examples = _payload_docs(comp)
|
|
196
|
+
lists = _list_properties(comp)
|
|
197
|
+
# Named lists make both descriptions concrete; a component with none still gets
|
|
198
|
+
# the rule, worded for a flat config.
|
|
199
|
+
listed = ", ".join(lists[:5])
|
|
200
|
+
# "node" is the word a caller reaches for when it wants to put one step on a
|
|
201
|
+
# canvas, and it belongs ONLY to the component that has such a list. Spraying it
|
|
202
|
+
# over every component would make a search for "add node" return six identical
|
|
203
|
+
# -edit actions and bury the one that answers the question.
|
|
204
|
+
node = " (no add-node either: a node IS an entry in actions)" if "actions" in lists else ""
|
|
205
|
+
adder = getattr(comp, "add_action", "")
|
|
206
|
+
|
|
207
|
+
out[f"{name}-create"] = ActionDef(
|
|
208
|
+
func=_make_create(comp), add_args=_create_args, needs_client=True,
|
|
209
|
+
description=(
|
|
210
|
+
f"Create a PROCESIO {name} from a validated config "
|
|
211
|
+
f"(build->validate->POST->re-GET). --config carries the WHOLE definition "
|
|
212
|
+
f"in ONE call - not a skeleton to fill in later"
|
|
213
|
+
+ (f": put all of {listed} in it up front" if lists else "")
|
|
214
|
+
+ ". There is no separate add/insert step afterwards. "
|
|
215
|
+
f"--dry-run previews the DTO without creating."
|
|
216
|
+
+ (" Non-blocking lint findings come back as `warnings`." if comp.lint else "")
|
|
217
|
+
),
|
|
218
|
+
arg_schemas=arg_schemas, examples=examples,
|
|
219
|
+
)
|
|
220
|
+
# The single fact that cost the most re-discovery: an agent holding only the arg
|
|
221
|
+
# schema knows --config takes a config, and reasonably assumes some add/insert/
|
|
222
|
+
# append action exists for putting ONE node in. None does, so it searches, fails,
|
|
223
|
+
# and eventually learns the rule by tripping the removal guard. Say it here, in
|
|
224
|
+
# the first sentence, and the search that goes looking for "add node" lands on
|
|
225
|
+
# this action and reads the answer.
|
|
226
|
+
out[f"{name}-edit"] = ActionDef(
|
|
227
|
+
func=_make_edit(comp), add_args=_process_edit_args if name == "process" else _edit_args, needs_client=True,
|
|
228
|
+
description=(
|
|
229
|
+
f"Edit a PROCESIO {name} (--id required). DESIRED STATE: the --config you "
|
|
230
|
+
f"send REPLACES the whole definition"
|
|
231
|
+
+ ((f". To ADD one item WITHOUT restating the rest, use {adder}; "
|
|
232
|
+
f"otherwise GET the {name}, append yours to the matching list "
|
|
233
|
+
f"({listed}), and send the WHOLE config back. Batch freely: N items "
|
|
234
|
+
f"cost the same single call as 1."
|
|
235
|
+
if adder else
|
|
236
|
+
f". There is NO add / insert / append action{node} - to ADD or change "
|
|
237
|
+
f"one item, GET the {name}, append yours to the matching list "
|
|
238
|
+
f"({listed}), and send the WHOLE config back. Batch freely: N items "
|
|
239
|
+
f"cost the same single call as 1.")
|
|
240
|
+
# A flat component has no lists to append to, so the add/insert
|
|
241
|
+
# vocabulary would only put it in the way of searches meant for the
|
|
242
|
+
# components that do.
|
|
243
|
+
if lists else
|
|
244
|
+
f" - send the COMPLETE config every time, not only the fields you "
|
|
245
|
+
f"want to change.")
|
|
246
|
+
+ " Anything you omit is REMOVED (refused unless --allow-remove)."
|
|
247
|
+
+ (f" To move ONE field without restating the rest, use "
|
|
248
|
+
f"{comp.patch_action} instead - it deep-merges a patch."
|
|
249
|
+
if getattr(comp, "patch_action", "") else "")
|
|
250
|
+
+ " --dry-run previews the DTO."
|
|
251
|
+
+ (" Non-blocking lint findings come back as `warnings`." if comp.lint else "")
|
|
252
|
+
),
|
|
253
|
+
arg_schemas=arg_schemas, examples=examples,
|
|
254
|
+
)
|
|
255
|
+
return out
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
ACTIONS = build_actions()
|