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,115 @@
|
|
|
1
|
+
"""Load the agent's knowledge base (the markdown docs in this folder).
|
|
2
|
+
|
|
3
|
+
The `guidance` action serves these so any session/LLM loads the methodology from
|
|
4
|
+
ONE registry-discoverable place instead of re-deriving it. The docs are the
|
|
5
|
+
source of truth; this module just reads them.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
|
|
11
|
+
KB_DIR = Path(__file__).resolve().parent
|
|
12
|
+
|
|
13
|
+
# The form-building guide lives beside the TOOL it documents (form DTO, event config,
|
|
14
|
+
# field paths), not in this folder. Serving it from here rather than copying it keeps
|
|
15
|
+
# one source of truth: a 100 KB guide duplicated into the agent would be stale within a
|
|
16
|
+
# release, and the version the model reads is the one that would be wrong.
|
|
17
|
+
FORM_GUIDE = KB_DIR.parents[1] / "tools" / "procesio" / "FORM-DEV-GUIDE"
|
|
18
|
+
|
|
19
|
+
# The house style, distilled from auditing a production workspace: HOW this team builds,
|
|
20
|
+
# where the best-practices doc says WHAT good looks like. Served per file like the form
|
|
21
|
+
# guide (~80 KB together); `patterns` is the index and names the rest.
|
|
22
|
+
PATTERNS = KB_DIR / "IMPLEMENTATION-PATTERNS"
|
|
23
|
+
|
|
24
|
+
# topic -> (path relative to KB_DIR, or an absolute Path; human label)
|
|
25
|
+
TOPICS: dict[str, tuple[str | Path, str]] = {
|
|
26
|
+
"playbook": ("PROCESIO-BUILD-AND-TEST-PLAYBOOK.md",
|
|
27
|
+
"Build-and-test operating procedure"),
|
|
28
|
+
"best-practices": ("PROCESIO-BEST-PRACTICES.md",
|
|
29
|
+
"PROCESIO implementation best practices"),
|
|
30
|
+
"visual-organization": ("PROCESIO-VISUAL-ORGANIZATION.md",
|
|
31
|
+
"Visual canvas layout + recurring build patterns"),
|
|
32
|
+
"datastore": ("PROCESIO-DATASTORE.md",
|
|
33
|
+
"Data Store module: API actions, process node, form trigger"),
|
|
34
|
+
"scheduling": ("PROCESIO-SCHEDULING.md",
|
|
35
|
+
"Scheduling a process (recurrences + crontab)"),
|
|
36
|
+
"environments": ("PROCESIO-ENVIRONMENTS.md",
|
|
37
|
+
"Working across PROCESIO environments (switch/add <Client>-<ENV>)"),
|
|
38
|
+
"reliability": ("PROCESIO-API-RELIABILITY-DOCTRINE.md",
|
|
39
|
+
"Driving the PROCESIO Web API safely: sequential calls, "
|
|
40
|
+
"behavioural verification, deadlines/retries, form-build traps"),
|
|
41
|
+
"boundary": ("README.md", "Agent knowledge base + tool-vs-agent boundary"),
|
|
42
|
+
|
|
43
|
+
# Building a FORM is a different discipline from building a process, and asking for
|
|
44
|
+
# it returned `unknown topic` - so an agent that needed the field-path shape, the
|
|
45
|
+
# event contract or the known traps had no way to reach the guide that documents
|
|
46
|
+
# all three. Measured cost of that gap in one run: a RUN_PROCESS map written with
|
|
47
|
+
# invented paths ("root.fields.<id>.value" instead of the four-GUID chain) and the
|
|
48
|
+
# two sides transposed, which the API accepts silently and which binds nothing.
|
|
49
|
+
#
|
|
50
|
+
# Served as ONE entry per guide file rather than a single `forms` blob: the guide is
|
|
51
|
+
# ~100 KB, over the character budget a run carries forward, so a single topic would
|
|
52
|
+
# be an answer no step could keep. `forms` is the index, which names the rest.
|
|
53
|
+
"forms": (FORM_GUIDE / "00-INDEX.md",
|
|
54
|
+
"Form development guide - START HERE, names the sub-topics below"),
|
|
55
|
+
"forms-anatomy": (FORM_GUIDE / "01-ANATOMY.md",
|
|
56
|
+
"Form anatomy: elements, config ids, the field VALUE PATH"),
|
|
57
|
+
"forms-code": (FORM_GUIDE / "02-CODE-INJECTION.md",
|
|
58
|
+
"Injecting custom code into a form"),
|
|
59
|
+
"forms-dom": (FORM_GUIDE / "03-DOM-CONTRACT.md",
|
|
60
|
+
"The rendered DOM contract a form's code may rely on"),
|
|
61
|
+
"forms-interaction": (FORM_GUIDE / "04-INTERACTION-RECIPES.md",
|
|
62
|
+
"Interaction recipes: show/hide, validation, computed fields"),
|
|
63
|
+
"forms-motion": (FORM_GUIDE / "05-STEPPER-AND-MOTION.md",
|
|
64
|
+
"Multi-step forms (stepper) and motion"),
|
|
65
|
+
"forms-process": (FORM_GUIDE / "06-PROCESS-INTEGRATION.md",
|
|
66
|
+
"Wiring a control to a process: RUN_PROCESS event, inputMap/"
|
|
67
|
+
"outputMap row shape, form value paths"),
|
|
68
|
+
"forms-deploy": (FORM_GUIDE / "07-DEPLOY-WORKFLOW.md",
|
|
69
|
+
"Publishing a form and its custom URL"),
|
|
70
|
+
"forms-pitfalls": (FORM_GUIDE / "08-PITFALLS.md",
|
|
71
|
+
"Known form traps and their signatures"),
|
|
72
|
+
|
|
73
|
+
"patterns": (PATTERNS / "00-INDEX.md",
|
|
74
|
+
"House implementation patterns - START HERE, names the sub-topics + the "
|
|
75
|
+
"workspace-knowledge folder convention"),
|
|
76
|
+
"patterns-processes": (PATTERNS / "01-PROCESSES.md",
|
|
77
|
+
"How we build processes: result flags, HTML rendering, Node idioms, utilities"),
|
|
78
|
+
"patterns-forms": (PATTERNS / "02-FORMS.md",
|
|
79
|
+
"How we build forms and form<->process communication"),
|
|
80
|
+
"patterns-integrations": (PATTERNS / "03-INTEGRATIONS.md",
|
|
81
|
+
"How we build integrations: webhooks, ERP, SFTP, LLM extraction, documents"),
|
|
82
|
+
"patterns-database": (PATTERNS / "04-DATABASE.md",
|
|
83
|
+
"How we design tables and stored procedures for PROCESIO"),
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
# `topic=all` concatenates everything it lists, so the form guide's chapters stay out of
|
|
87
|
+
# it: they would multiply that payload sixfold and bury the process guidance most callers
|
|
88
|
+
# actually asked for. The `forms` index IS included - it is small and it advertises the
|
|
89
|
+
# chapters, which is exactly what a caller who did not know they existed needs.
|
|
90
|
+
_ALL_EXCLUDED = {t for t in TOPICS if t.startswith(("forms-", "patterns-"))}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def topics() -> list[str]:
|
|
94
|
+
return list(TOPICS.keys())
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def load(topic: str) -> dict:
|
|
98
|
+
if topic not in TOPICS:
|
|
99
|
+
raise KeyError(
|
|
100
|
+
f"unknown topic: {topic}. Known: {', '.join(TOPICS)}")
|
|
101
|
+
filename, label = TOPICS[topic]
|
|
102
|
+
path = filename if isinstance(filename, Path) else KB_DIR / filename
|
|
103
|
+
if not path.exists():
|
|
104
|
+
raise FileNotFoundError(f"knowledge file missing: {path}")
|
|
105
|
+
return {
|
|
106
|
+
"topic": topic,
|
|
107
|
+
"label": label,
|
|
108
|
+
"source": str(path),
|
|
109
|
+
"content": path.read_text(encoding="utf-8"),
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def load_all() -> list[dict]:
|
|
114
|
+
"""Every topic that belongs in a `topic=all` answer (see _ALL_EXCLUDED)."""
|
|
115
|
+
return [load(t) for t in TOPICS if t not in _ALL_EXCLUDED]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"""procesio agent entrypoint - action dispatch.
|
|
2
|
+
|
|
3
|
+
Drives the `procesio` tool (and, in later slices, web + google-* for forms and
|
|
4
|
+
deliverables) to create, verify, and audit PROCESIO resources. Invoked exactly
|
|
5
|
+
like an action-dispatch tool: action name first, JSON in / JSON out. It is the
|
|
6
|
+
executable side of the build-and-test playbook in this folder.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import sys
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
AGENT_ROOT = Path(__file__).resolve().parent
|
|
14
|
+
FRAMEWORK_ROOT = AGENT_ROOT.parents[1]
|
|
15
|
+
# .venv layout is per-OS: Scripts/python.exe on Windows, bin/python everywhere else.
|
|
16
|
+
_VENV_PY = (FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe" if sys.platform == "win32"
|
|
17
|
+
else FRAMEWORK_ROOT / ".venv" / "bin" / "python")
|
|
18
|
+
if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
|
|
19
|
+
import subprocess
|
|
20
|
+
sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
|
|
21
|
+
|
|
22
|
+
import argparse # noqa: E402
|
|
23
|
+
|
|
24
|
+
if str(FRAMEWORK_ROOT) not in sys.path:
|
|
25
|
+
sys.path.insert(0, str(FRAMEWORK_ROOT))
|
|
26
|
+
|
|
27
|
+
from tools._lib.io import emit, fail # noqa: E402
|
|
28
|
+
from agents._lib import errors # noqa: E402
|
|
29
|
+
from agents._lib.actiondef import ActionDef # noqa: E402
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class _Parser(argparse.ArgumentParser):
|
|
33
|
+
def error(self, message: str):
|
|
34
|
+
raise errors.UsageError(message)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def collect_actions() -> dict[str, ActionDef]:
|
|
38
|
+
actions: dict[str, ActionDef] = {}
|
|
39
|
+
from agents.procesio.handlers import (status, guidance, checklist as checklist_h,
|
|
40
|
+
verify as verify_h, audit as audit_h)
|
|
41
|
+
actions.update(status.ACTIONS)
|
|
42
|
+
actions.update(guidance.ACTIONS)
|
|
43
|
+
actions.update(checklist_h.ACTIONS)
|
|
44
|
+
actions.update(verify_h.ACTIONS)
|
|
45
|
+
actions.update(audit_h.ACTIONS)
|
|
46
|
+
return actions
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
ACTIONS = collect_actions()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _build_context():
|
|
53
|
+
from agents.procesio.context import ProcesioContext
|
|
54
|
+
return ProcesioContext.create()
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def dispatch(action: str, argv: list[str], *, context_builder=None) -> dict:
|
|
58
|
+
if action not in ACTIONS:
|
|
59
|
+
raise errors.UsageError(
|
|
60
|
+
f"unknown action: {action}. Known: {', '.join(sorted(ACTIONS))}")
|
|
61
|
+
defn = ACTIONS[action]
|
|
62
|
+
parser = _Parser(prog=f"procesio {action}", description=defn.description)
|
|
63
|
+
defn.add_args(parser)
|
|
64
|
+
parsed = parser.parse_args(argv)
|
|
65
|
+
if defn.context:
|
|
66
|
+
builder = context_builder or _build_context
|
|
67
|
+
ctx = builder()
|
|
68
|
+
return defn.func(ctx, parsed)
|
|
69
|
+
return defn.func(parsed)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def main(argv=None) -> None:
|
|
73
|
+
argv = list(sys.argv[1:] if argv is None else argv)
|
|
74
|
+
if not argv or argv[0] in ("-h", "--help"):
|
|
75
|
+
print("Actions:", file=sys.stderr)
|
|
76
|
+
for name in sorted(ACTIONS):
|
|
77
|
+
print(f" {name:<12} {ACTIONS[name].description}", file=sys.stderr)
|
|
78
|
+
sys.exit(0)
|
|
79
|
+
action, rest = argv[0], argv[1:]
|
|
80
|
+
try:
|
|
81
|
+
result = dispatch(action, rest)
|
|
82
|
+
except Exception as exc: # noqa: BLE001
|
|
83
|
+
code, message, details, exit_code = errors.classify(exc)
|
|
84
|
+
fail(code, message, details, exit_code)
|
|
85
|
+
emit(result)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
if __name__ == "__main__":
|
|
89
|
+
main()
|
|
File without changes
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"""Fixtures for the PROCESIO agent tests. Zero live calls: the tool invoker is a
|
|
2
|
+
recording fake, Credential Manager is never touched.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
FRAMEWORK_ROOT = Path(__file__).resolve().parents[3]
|
|
12
|
+
if str(FRAMEWORK_ROOT) not in sys.path:
|
|
13
|
+
sys.path.insert(0, str(FRAMEWORK_ROOT))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@pytest.fixture(autouse=True)
|
|
17
|
+
def _no_keyring(monkeypatch):
|
|
18
|
+
from tools._lib import creds
|
|
19
|
+
monkeypatch.setattr(creds, "get_optional", lambda tool, name: None)
|
|
20
|
+
monkeypatch.setattr(creds, "has", lambda tool, name: False)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class FakeInvoke:
|
|
24
|
+
"""Drop-in for toolrunner.invoke: __call__(tool, action, *args) -> dict.
|
|
25
|
+
|
|
26
|
+
Map an action name to the dict it should return, or to a ToolError instance
|
|
27
|
+
to simulate a tool failure. Records every call for assertions.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
def __init__(self):
|
|
31
|
+
self.calls: list[tuple[str, str, list]] = []
|
|
32
|
+
self._map: dict[str, object] = {}
|
|
33
|
+
|
|
34
|
+
def set(self, action: str, value) -> "FakeInvoke":
|
|
35
|
+
self._map[action] = value
|
|
36
|
+
return self
|
|
37
|
+
|
|
38
|
+
def __call__(self, tool: str, action: str, *args):
|
|
39
|
+
self.calls.append((tool, action, list(args)))
|
|
40
|
+
v = self._map.get(action, {})
|
|
41
|
+
if isinstance(v, Exception):
|
|
42
|
+
raise v
|
|
43
|
+
return v
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@pytest.fixture
|
|
47
|
+
def fake_invoke():
|
|
48
|
+
return FakeInvoke()
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
def flow(actions, *, title="T", description="") -> dict:
|
|
52
|
+
"""Build a get-process style envelope around a flow with these actions."""
|
|
53
|
+
return {"result": {"flow": {
|
|
54
|
+
"Title": title, "Description": description, "Actions": actions}}}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def action(template, *, params=None, settings=None, name=None) -> dict:
|
|
58
|
+
a = {"ActionName": name or template, "ActionTemplateName": template,
|
|
59
|
+
"Parameters": params or []}
|
|
60
|
+
if settings is not None:
|
|
61
|
+
a["CustomData"] = {"configuration": [{"settings": settings}]}
|
|
62
|
+
return a
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from agents.procesio import audit
|
|
4
|
+
from agents.procesio.tests.conftest import action
|
|
5
|
+
|
|
6
|
+
START = action("Start")
|
|
7
|
+
STOP = action("Stop")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _codes(findings):
|
|
11
|
+
return {f["code"] for f in findings}
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
def test_clean_process_has_no_correctness_findings():
|
|
15
|
+
configured = action("Add", params=[{"Value": "x", "Variable": []}],
|
|
16
|
+
settings=[{"value": "x"}])
|
|
17
|
+
flow = {"Title": "Clean", "Description": "does a thing",
|
|
18
|
+
"Actions": [START, configured, STOP]}
|
|
19
|
+
assert audit.correctness_findings(flow) == []
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_designer_blank_is_flagged_as_correctness_warn():
|
|
23
|
+
# runtime Parameters set, designer configuration empty -> the documented bug
|
|
24
|
+
blank = action("Send Email", params=[{"Value": "<%0%>", "Variable": [{"id": 0}]}],
|
|
25
|
+
settings=[{"value": ""}])
|
|
26
|
+
flow = {"Actions": [START, blank, STOP]}
|
|
27
|
+
cf = audit.correctness_findings(flow)
|
|
28
|
+
assert "designer-blank" in _codes(cf)
|
|
29
|
+
assert all(f["severity"] in ("warn", "fail") for f in cf)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def test_datastore_masquerade_flagged_as_fail():
|
|
33
|
+
# a Call API node NAMED like a cache op is the FX-usecase bug: it never touches
|
|
34
|
+
# the Data Store, but the process still runs green.
|
|
35
|
+
masq = action("Call API", name="Cache read")
|
|
36
|
+
flow = {"Actions": [START, masq, STOP]}
|
|
37
|
+
cf = audit.correctness_findings(flow)
|
|
38
|
+
hits = [f for f in cf if f["code"] == "datastore-as-callapi"]
|
|
39
|
+
assert hits and hits[0]["severity"] == "fail"
|
|
40
|
+
assert hits[0]["action"] == "Cache read"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def test_real_datastore_node_and_plain_callapi_not_flagged():
|
|
44
|
+
real_cache = action("Data Store", name="Cache read",
|
|
45
|
+
params=[{"Value": "x"}], settings=[{"value": "x"}])
|
|
46
|
+
plain_api = action("Call API", name="Fetch BNR XML",
|
|
47
|
+
params=[{"Value": "https://bnr.ro"}], settings=[{"value": "url"}])
|
|
48
|
+
flow = {"Actions": [START, real_cache, plain_api, STOP]}
|
|
49
|
+
assert "datastore-as-callapi" not in _codes(audit.correctness_findings(flow))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_practice_smells_flagged():
|
|
53
|
+
acts = [START, STOP]
|
|
54
|
+
acts += [action("Call API"), action("SQL Server"), action("Decisional")]
|
|
55
|
+
acts += [action(f"Add{i}", params=[{"Value": "1"}], settings=[{"value": "1"}])
|
|
56
|
+
for i in range(4)] # push count over 5
|
|
57
|
+
flow = {"Title": "Heavy", "Description": "", "Actions": acts}
|
|
58
|
+
rep = audit.audit_process(flow)
|
|
59
|
+
codes = _codes(rep["findings"])
|
|
60
|
+
assert "high-action-count" in codes
|
|
61
|
+
assert "slow-actions" in codes
|
|
62
|
+
assert "missing-description" in codes
|
|
63
|
+
assert rep["summary"]["nonstructural_action_count"] == 7
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def test_audit_handles_live_camelcase_shape():
|
|
67
|
+
# the LIVE Web-API returns camelCase; the auditor must work on it, not just
|
|
68
|
+
# PascalCase export goldens (regression: live audit found 0 actions before ci()).
|
|
69
|
+
flow = {"title": "Live", "description": "", "actions": [
|
|
70
|
+
{"actionTemplateName": "Start", "parameters": []},
|
|
71
|
+
{"actionName": "notify", "actionTemplateName": "Send Email",
|
|
72
|
+
"parameters": [{"value": "<%0%>", "variable": [{"id": 0}]}],
|
|
73
|
+
"customData": {"configuration": [{"settings": [{"value": ""}]}]}},
|
|
74
|
+
{"actionTemplateName": "Stop", "parameters": []}]}
|
|
75
|
+
rep = audit.audit_process(flow)
|
|
76
|
+
assert rep["summary"]["nonstructural_action_count"] == 1
|
|
77
|
+
assert rep["summary"]["title"] == "Live"
|
|
78
|
+
assert "designer-blank" in _codes(rep["findings"])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_inline_secret_flagged_but_guid_credential_is_not():
|
|
82
|
+
secret = action("Connect", params=[{"Value": "p@ssw0rd-secret-value", "Variable": []}])
|
|
83
|
+
credid = action("Send Email",
|
|
84
|
+
params=[{"Value": "2aacf4f1-310c-469f-80ef-394d6ab9582f", "Variable": []}])
|
|
85
|
+
flow = {"Actions": [START, secret, credid, STOP]}
|
|
86
|
+
codes = _codes(audit.audit_process(flow)["findings"])
|
|
87
|
+
assert "possible-inline-secret" in codes
|
|
88
|
+
# the credential GUID literal must NOT be mistaken for a secret
|
|
89
|
+
secret_findings = [f for f in audit.audit_process(flow)["findings"]
|
|
90
|
+
if f["code"] == "possible-inline-secret"]
|
|
91
|
+
assert all(f["action"] != "Send Email" for f in secret_findings)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from agents.procesio import checklist as cl
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def test_all_steps_have_required_keys():
|
|
7
|
+
keys = {"id", "phase", "title", "how", "tool", "automatable", "citation"}
|
|
8
|
+
for s in cl.STEPS:
|
|
9
|
+
assert keys <= set(s), f"{s.get('id')} missing {keys - set(s)}"
|
|
10
|
+
assert s["phase"] in cl.PHASES
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def test_phase_filter():
|
|
14
|
+
val = cl.steps(phase="validate")
|
|
15
|
+
assert val and all(s["phase"] == "validate" for s in val)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def test_automatable_only_is_subset():
|
|
19
|
+
auto = cl.steps(automatable_only=True)
|
|
20
|
+
assert auto and all(s["automatable"] for s in auto)
|
|
21
|
+
assert len(auto) < len(cl.STEPS) # there are genuine manual steps too
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_manual_steps_are_the_non_automatable_ones():
|
|
25
|
+
manual = cl.manual_steps()
|
|
26
|
+
assert manual and all(not s["automatable"] for s in manual)
|
|
27
|
+
# the real-browser form check must be in the manual set - it cannot be automated
|
|
28
|
+
assert "form-behavior" in {s["id"] for s in manual}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from agents.procesio import knowledge
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def test_topics_present():
|
|
11
|
+
assert set(knowledge.topics()) == {
|
|
12
|
+
"playbook", "best-practices", "visual-organization", "datastore",
|
|
13
|
+
"scheduling", "environments", "reliability", "boundary",
|
|
14
|
+
"forms", "forms-anatomy", "forms-code", "forms-dom", "forms-interaction",
|
|
15
|
+
"forms-motion", "forms-process", "forms-deploy", "forms-pitfalls",
|
|
16
|
+
"patterns", "patterns-processes", "patterns-forms", "patterns-integrations",
|
|
17
|
+
"patterns-database"}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def test_each_topic_loads_real_content():
|
|
21
|
+
for t in knowledge.topics():
|
|
22
|
+
doc = knowledge.load(t)
|
|
23
|
+
assert doc["content"].strip(), f"{t} empty"
|
|
24
|
+
assert Path(doc["source"]).exists()
|
|
25
|
+
assert doc["topic"] == t
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def test_all_excludes_the_form_chapters_but_keeps_their_index():
|
|
29
|
+
"""`topic=all` is a payload a run carries forward under a character budget. The
|
|
30
|
+
form guide is ~100 KB across nine files; folding it in would evict the process
|
|
31
|
+
guidance most callers asked for. The index is small and advertises the rest."""
|
|
32
|
+
served = {d["topic"] for d in knowledge.load_all()}
|
|
33
|
+
assert "forms" in served
|
|
34
|
+
assert not [t for t in served if t.startswith(("forms-", "patterns-"))]
|
|
35
|
+
assert "patterns" in served
|
|
36
|
+
assert sum(len(d["content"]) for d in knowledge.load_all()) < 100_000
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_the_form_chapters_are_reachable_one_at_a_time():
|
|
40
|
+
for t in ("forms-anatomy", "forms-process", "forms-pitfalls"):
|
|
41
|
+
assert knowledge.load(t)["content"].strip()
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def test_the_form_index_names_the_chapters_a_caller_must_ask_for():
|
|
45
|
+
"""The index is the only form topic in `all`, so it has to be the map: a caller
|
|
46
|
+
that lands there must learn the sub-topics exist without a second guess."""
|
|
47
|
+
body = knowledge.load("forms")["content"]
|
|
48
|
+
for chapter in ("ANATOMY", "PROCESS-INTEGRATION", "PITFALLS"):
|
|
49
|
+
assert chapter in body
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_the_process_integration_chapter_carries_the_map_row_contract():
|
|
53
|
+
"""This is the fact the gap actually cost: a RUN_PROCESS map row's two sides are
|
|
54
|
+
objects with DIFFERENT shapes, and the form side's path is a four-GUID chain, not
|
|
55
|
+
a readable pseudo-path. If this ever stops being served, the guide is not doing
|
|
56
|
+
the one job it was registered for."""
|
|
57
|
+
body = knowledge.load("forms-process")["content"]
|
|
58
|
+
assert "inputMap" in body and "outputMap" in body
|
|
59
|
+
assert "11223344-5566-7788-99aa-aabbccddeeff" in body # the FIELDS_NS constant
|
|
60
|
+
assert "isList" in body # the row object shape
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_unknown_topic_raises():
|
|
64
|
+
with pytest.raises(KeyError):
|
|
65
|
+
knowledge.load("nope")
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def test_implementation_patterns_carry_no_workspace_data():
|
|
69
|
+
"""Hard rule 10: the patterns are framework files read by other teams. They were
|
|
70
|
+
distilled from one client's workspace, so guard the obvious leaks: GUIDs, e-mail
|
|
71
|
+
addresses and connection strings."""
|
|
72
|
+
import re
|
|
73
|
+
for t in ("patterns", "patterns-processes", "patterns-forms", "patterns-integrations",
|
|
74
|
+
"patterns-database"):
|
|
75
|
+
text = knowledge.load(t)["content"]
|
|
76
|
+
assert not re.search(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", text), t
|
|
77
|
+
assert not re.search(r"[\w.-]+@[\w-]+\.[a-z]{2,}", text), t
|
|
78
|
+
assert not re.search(r"(?i)password\s*=|pwd=\w", text), t
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"""Guard: agent.yaml must declare exactly the actions the dispatcher registers,
|
|
2
|
+
the per-action args must match, and every driven tool must be registered.
|
|
3
|
+
"""
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
|
|
8
|
+
from tools._lib.manifest import load_agent
|
|
9
|
+
from agents.procesio import main
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def _manifest():
|
|
13
|
+
agent_root = Path(main.__file__).resolve().parent
|
|
14
|
+
return load_agent(agent_root / "agent.yaml")
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def test_manifest_actions_match_dispatch():
|
|
18
|
+
m = _manifest()
|
|
19
|
+
assert set(m.action_names()) == set(main.ACTIONS), (
|
|
20
|
+
f"only in manifest: {set(m.action_names()) - set(main.ACTIONS)}; "
|
|
21
|
+
f"only in code: {set(main.ACTIONS) - set(m.action_names())}")
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_expected_actions_registered():
|
|
25
|
+
assert set(main.ACTIONS) == {
|
|
26
|
+
"status", "guidance", "checklist", "verify", "audit"}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_declared_tools_are_registered():
|
|
30
|
+
from registry import get_tool
|
|
31
|
+
for tool_name in _manifest().tools:
|
|
32
|
+
get_tool(tool_name) # raises KeyError if missing
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_manifest_args_match_dispatch():
|
|
36
|
+
"""Each action's manifest args (kebab) must match the argparse flags the
|
|
37
|
+
handler registers (so the contract cannot drift from the code)."""
|
|
38
|
+
import argparse
|
|
39
|
+
m = _manifest()
|
|
40
|
+
for name, defn in main.ACTIONS.items():
|
|
41
|
+
parser = argparse.ArgumentParser()
|
|
42
|
+
defn.add_args(parser)
|
|
43
|
+
code_args = {a.dest.replace("_", "-") for a in parser._actions
|
|
44
|
+
if a.dest not in ("help",)}
|
|
45
|
+
spec = m.get_action(name)
|
|
46
|
+
manifest_args = {a.name for a in spec.args}
|
|
47
|
+
assert manifest_args == code_args, (
|
|
48
|
+
f"{name}: manifest {manifest_args} != code {code_args}")
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from agents._lib.toolrunner import ToolError
|
|
4
|
+
from agents.procesio import verifylib
|
|
5
|
+
from agents.procesio.tests.conftest import action, flow
|
|
6
|
+
|
|
7
|
+
START = action("Start")
|
|
8
|
+
STOP = action("Stop")
|
|
9
|
+
CONFIGURED = action("Add", params=[{"Value": "x", "Variable": []}],
|
|
10
|
+
settings=[{"value": "x"}])
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def _check(report, cid):
|
|
14
|
+
return next(c for c in report["checks"] if c["id"] == cid)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def test_clean_process_passes_without_run(fake_invoke):
|
|
18
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
19
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
20
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
21
|
+
assert rep["verdict"] == "pass"
|
|
22
|
+
assert _check(rep, "validate-process")["status"] == "pass"
|
|
23
|
+
assert _check(rep, "config-parity-audit")["status"] == "pass"
|
|
24
|
+
assert _check(rep, "run-instance")["status"] == "skip"
|
|
25
|
+
# manual checks must always be surfaced
|
|
26
|
+
assert any(s["id"] == "form-behavior" for s in rep["manual_checks"])
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def test_designer_blank_drops_verdict_to_warn(fake_invoke):
|
|
30
|
+
blank = action("Send Email", params=[{"Value": "<%0%>", "Variable": [{"id": 0}]}],
|
|
31
|
+
settings=[{"value": ""}])
|
|
32
|
+
fake_invoke.set("get-process", flow([START, blank, STOP]))
|
|
33
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
34
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
35
|
+
assert rep["verdict"] == "warn"
|
|
36
|
+
assert _check(rep, "config-parity-audit")["status"] == "warn"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_validate_sends_flow_via_body_file_not_inline(fake_invoke):
|
|
40
|
+
# regression: a large flow passed as inline --body overflows the OS command line
|
|
41
|
+
# (Windows WinError 206 / POSIX E2BIG) and crashed the gate. The validate call must
|
|
42
|
+
# use --body-file, never --body.
|
|
43
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
44
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
45
|
+
verifylib.verify_process(fake_invoke, "pid")
|
|
46
|
+
req = next(c for c in fake_invoke.calls
|
|
47
|
+
if c[0] == "procesio" and c[1] == "request" and "/api/Projects/validate" in c[2])
|
|
48
|
+
assert "--body-file" in req[2]
|
|
49
|
+
assert "--body" not in req[2]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def test_datastore_masquerade_hard_fails_the_gate(fake_invoke):
|
|
53
|
+
# a Call-API node named like a cache op is a hard defect (severity fail), so the
|
|
54
|
+
# config-parity check and the whole verdict must be `fail`, not merely `warn`.
|
|
55
|
+
masq = action("Call API", name="Cache read")
|
|
56
|
+
fake_invoke.set("get-process", flow([START, masq, STOP]))
|
|
57
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
58
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
59
|
+
assert _check(rep, "config-parity-audit")["status"] == "fail"
|
|
60
|
+
assert rep["verdict"] == "fail"
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
def test_run_finished_status_50_passes(fake_invoke):
|
|
64
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
65
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
66
|
+
fake_invoke.set("run-process", {"result": {"id": "iid", "status": 50}})
|
|
67
|
+
fake_invoke.set("get-instance-status", {"result": {"status": 50, "actions": []}})
|
|
68
|
+
rep = verifylib.verify_process(fake_invoke, "pid", run=True)
|
|
69
|
+
assert rep["verdict"] == "pass"
|
|
70
|
+
assert _check(rep, "run-instance")["status"] == "pass"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_run_with_errors_status_40_fails(fake_invoke):
|
|
74
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
75
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
76
|
+
fake_invoke.set("run-process", {"result": {"id": "iid", "status": 40}})
|
|
77
|
+
fake_invoke.set("get-instance-status", {"result": {
|
|
78
|
+
"status": 40, "actions": [{"name": "Add", "errorMessage": "boom"}]}})
|
|
79
|
+
rep = verifylib.verify_process(fake_invoke, "pid", run=True)
|
|
80
|
+
assert rep["verdict"] == "fail"
|
|
81
|
+
rc = _check(rep, "run-instance")
|
|
82
|
+
assert rc["status"] == "fail"
|
|
83
|
+
assert rc["detail"]["action_errors"][0]["errorMessage"] == "boom"
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def test_validate_surfaces_400_validation_messages_as_warn(fake_invoke):
|
|
87
|
+
# PROCESIO returns HTTP 400 + a list of validation messages for an invalid
|
|
88
|
+
# process; verify must surface them as a warn, not skip.
|
|
89
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
90
|
+
fake_invoke.set("request", ToolError(
|
|
91
|
+
"procesio", "invalid_argument", "HTTP 400",
|
|
92
|
+
{"status": 400, "body": {"body": [
|
|
93
|
+
{"statusCode": 390, "value": "Action has too few input ports.",
|
|
94
|
+
"target": "prc"}]}}))
|
|
95
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
96
|
+
vc = _check(rep, "validate-process")
|
|
97
|
+
assert vc["status"] == "warn"
|
|
98
|
+
assert vc["detail"]["errors"][0]["statusCode"] == 390
|
|
99
|
+
assert rep["verdict"] == "warn"
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def test_validate_endpoint_error_is_skip_not_fail(fake_invoke):
|
|
103
|
+
fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
|
|
104
|
+
fake_invoke.set("request", ToolError("procesio", "server_error", "no validate here"))
|
|
105
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
106
|
+
assert _check(rep, "validate-process")["status"] == "skip"
|
|
107
|
+
assert rep["verdict"] == "pass" # a skipped optional check does not fail the gate
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def test_verify_reads_live_camelcase_shapes(fake_invoke):
|
|
111
|
+
# regression: live get-process/instance status are camelCase and nest actions
|
|
112
|
+
# under instance.actions; verify must parse both.
|
|
113
|
+
fake_invoke.set("get-process", {"result": {"flow": {
|
|
114
|
+
"title": "Live", "actions": [
|
|
115
|
+
{"actionTemplateName": "Start", "parameters": []},
|
|
116
|
+
{"actionName": "a", "actionTemplateName": "Add",
|
|
117
|
+
"parameters": [{"value": "x"}],
|
|
118
|
+
"customData": {"configuration": [{"settings": [{"value": "x"}]}]}},
|
|
119
|
+
{"actionTemplateName": "Stop", "parameters": []}]}}})
|
|
120
|
+
fake_invoke.set("request", {"result": {"isValid": True}})
|
|
121
|
+
fake_invoke.set("run-process", {"result": {"id": "iid", "status": 50}})
|
|
122
|
+
fake_invoke.set("get-instance-status",
|
|
123
|
+
{"result": {"instance": {"status": 50, "actions": []}}})
|
|
124
|
+
rep = verifylib.verify_process(fake_invoke, "pid", run=True)
|
|
125
|
+
assert rep["title"] == "Live"
|
|
126
|
+
assert rep["verdict"] == "pass"
|
|
127
|
+
assert _check(rep, "run-instance")["status"] == "pass"
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def test_fetch_failure_fails_fast(fake_invoke):
|
|
131
|
+
fake_invoke.set("get-process", ToolError("procesio", "not_found", "no such process"))
|
|
132
|
+
rep = verifylib.verify_process(fake_invoke, "pid")
|
|
133
|
+
assert rep["verdict"] == "fail"
|
|
134
|
+
assert _check(rep, "fetch")["status"] == "fail"
|