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
procesio_cli/__init__.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"""PROCESIO CLI + Agent - installed entry points.
|
|
2
|
+
|
|
3
|
+
The repository is path-based: a tool is a folder under ``tools/`` with its own
|
|
4
|
+
``main.py``, and the runner resolves it by path rather than importing it by name
|
|
5
|
+
(``google-calendar`` is a folder name, never a module name). So the wheel ships the
|
|
6
|
+
whole tree under this package and puts this directory on ``sys.path``, which makes
|
|
7
|
+
``import tools`` and ``import registry`` resolve exactly as they do in a clone.
|
|
8
|
+
|
|
9
|
+
Running from a clone is unchanged and still documented:
|
|
10
|
+
``uv sync`` then ``python scripts/run-tool.py <tool> <action>``.
|
|
11
|
+
"""
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
__version__ = "0.1.1"
|
|
15
|
+
|
|
16
|
+
#: The bundled repository root. In a wheel this directory holds tools/, agents/,
|
|
17
|
+
#: scripts/, skills/ and registry.py; in a clone it is the package beside them.
|
|
18
|
+
ROOT = Path(__file__).resolve().parent
|
procesio_cli/_cli.py
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"""Console-script entry points.
|
|
2
|
+
|
|
3
|
+
Each one runs the corresponding script from the bundled tree, unchanged. Delegating
|
|
4
|
+
with ``runpy`` rather than importing a ``main()`` keeps one code path: the script a
|
|
5
|
+
clone runs and the script an installed package runs are the same file, so they cannot
|
|
6
|
+
drift apart.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import runpy
|
|
11
|
+
import sys
|
|
12
|
+
|
|
13
|
+
from . import ROOT
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _run(script: str, *, where: str = "scripts") -> int:
|
|
17
|
+
path = ROOT / where / script
|
|
18
|
+
if not path.is_file():
|
|
19
|
+
print(f"error: {script} is missing from the installed package", file=sys.stderr)
|
|
20
|
+
return 2
|
|
21
|
+
root = str(ROOT)
|
|
22
|
+
if root not in sys.path:
|
|
23
|
+
sys.path.insert(0, root) # so `import tools` / `import registry` resolve
|
|
24
|
+
sys.argv = [str(path), *sys.argv[1:]]
|
|
25
|
+
try:
|
|
26
|
+
runpy.run_path(str(path), run_name="__main__")
|
|
27
|
+
except SystemExit as exc: # the scripts exit through sys.exit
|
|
28
|
+
return int(exc.code or 0)
|
|
29
|
+
return 0
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def run_tool() -> int:
|
|
33
|
+
return _run("run-tool.py")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def run_agent() -> int:
|
|
37
|
+
return _run("run-agent.py")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def list_tools() -> int:
|
|
41
|
+
return _run("list-tools.py")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def get_skill() -> int:
|
|
45
|
+
return _run("get-skill.py")
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def mcp_server() -> int:
|
|
49
|
+
"""The full stdio MCP server, as a command instead of an absolute path.
|
|
50
|
+
|
|
51
|
+
Configuring it used to mean writing /abs/path/to/the/clone into every client's
|
|
52
|
+
JSON. Installed, the client names a command and the path problem disappears.
|
|
53
|
+
|
|
54
|
+
Six generic tools over the whole registry, so any tool you add shows up without
|
|
55
|
+
integration code. That reach is the point, and it is also why this is not what the
|
|
56
|
+
plugin launches - see mcp_chat_server.
|
|
57
|
+
"""
|
|
58
|
+
return _run("server.py", where="webplatform/aat_mcp")
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def mcp_chat_server() -> int:
|
|
62
|
+
"""The curated stdio MCP server: one named tool per operation.
|
|
63
|
+
|
|
64
|
+
What `.mcp.json` launches, and what a general chat client should get. Every tool
|
|
65
|
+
states what it does and none of them forward a caller-supplied action, which is
|
|
66
|
+
what makes the surface reviewable - by a person reading a directory listing, and
|
|
67
|
+
by a model choosing between tools.
|
|
68
|
+
|
|
69
|
+
`procesio-mcp` is still there for anyone who wants the whole registry.
|
|
70
|
+
"""
|
|
71
|
+
return _run("chat_server.py", where="webplatform/aat_mcp")
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""ActionDef - dispatchable action unit for agents.
|
|
2
|
+
|
|
3
|
+
Like the tool-side ActionDef, but instead of a `client` flag it has a `context`
|
|
4
|
+
flag: when True the dispatcher builds the agent's shared context (config + state
|
|
5
|
+
backend) and passes it as the first argument. Pure actions (status, version)
|
|
6
|
+
leave it False and just receive the parsed argparse namespace.
|
|
7
|
+
"""
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
import argparse
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from typing import Callable
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _no_args(_parser: argparse.ArgumentParser) -> None:
|
|
16
|
+
return None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
@dataclass
|
|
20
|
+
class ActionDef:
|
|
21
|
+
func: Callable
|
|
22
|
+
add_args: Callable[[argparse.ArgumentParser], None] = _no_args
|
|
23
|
+
context: bool = False # True -> dispatch builds the agent context, passes it first
|
|
24
|
+
description: str = ""
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Shared error handling for agents.
|
|
2
|
+
|
|
3
|
+
Mirrors the tool-side contract: every uncaught exception is classified into a
|
|
4
|
+
(code, message, details, exit_code) tuple that becomes the {"error": ...} JSON
|
|
5
|
+
envelope. ToolError from a driven tool is surfaced with its origin preserved.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from agents._lib.toolrunner import ToolError
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class UsageError(Exception):
|
|
15
|
+
"""Bad CLI usage (unknown action, missing/invalid arg). Exit code 2."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class AgentError(Exception):
|
|
19
|
+
"""Agent-level failure with an explicit error code."""
|
|
20
|
+
|
|
21
|
+
def __init__(self, code: str, message: str, details: dict[str, Any] | None = None):
|
|
22
|
+
self.code = code
|
|
23
|
+
self.message = message
|
|
24
|
+
self.details = details or {}
|
|
25
|
+
super().__init__(message)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def classify(exc: Exception) -> tuple[str, str, dict[str, Any], int]:
|
|
29
|
+
if isinstance(exc, UsageError):
|
|
30
|
+
return "usage_error", str(exc), {}, 2
|
|
31
|
+
if isinstance(exc, AgentError):
|
|
32
|
+
return exc.code, exc.message, exc.details, 1
|
|
33
|
+
if isinstance(exc, ToolError):
|
|
34
|
+
# A tool the agent drives failed. Keep its code/message and note the tool.
|
|
35
|
+
details = dict(exc.details)
|
|
36
|
+
details.setdefault("tool", exc.tool)
|
|
37
|
+
return f"tool:{exc.code}", f"{exc.tool}: {exc.message}", details, 1
|
|
38
|
+
if isinstance(exc, KeyError):
|
|
39
|
+
return "not_found", str(exc), {}, 1
|
|
40
|
+
return "internal_error", str(exc), {"type": type(exc).__name__}, 1
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"""Reversibility classification - the shared definition of "irreversible".
|
|
2
|
+
|
|
3
|
+
The decision policy turns on exactly one axis: reversible, act; irreversible, stop
|
|
4
|
+
and ask a human. This is a MODULE rather than a rule in a prompt because a rule in
|
|
5
|
+
a prompt is something a model can talk itself past. Here it is evaluated BEFORE the
|
|
6
|
+
model is asked anything, so an irreversible action cannot be auto-decided even when
|
|
7
|
+
the prompt is wrong.
|
|
8
|
+
|
|
9
|
+
Deliberately conservative. A hit means "treat as irreversible" and escalate or
|
|
10
|
+
refuse. A false positive costs one escalation; a false negative costs real-world
|
|
11
|
+
blast radius, and the caller reporting on itself is not a reliable witness. The
|
|
12
|
+
asymmetry is the reason to lean.
|
|
13
|
+
|
|
14
|
+
KNOW WHAT THIS IS. It matches VERBS, in English, in the action name and argv. An
|
|
15
|
+
action whose name carries no listed verb is reported reversible, so silence here is
|
|
16
|
+
absence of evidence and not a safety guarantee. Treat it as a guard rail that stops
|
|
17
|
+
the obvious mistakes, never as a sandbox: it does not inspect what a call will
|
|
18
|
+
actually do, and it does not read any language but English. Extending the verb list
|
|
19
|
+
is the intended way to close a gap you find.
|
|
20
|
+
|
|
21
|
+
One definition, one place. The verb list started inside a single agent's driver
|
|
22
|
+
loop; it lives here so that every caller shares it and no two of them can drift
|
|
23
|
+
into different ideas of what "irreversible" means.
|
|
24
|
+
"""
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import re
|
|
28
|
+
|
|
29
|
+
# Verbs / action fragments that name an irreversible, real-world side effect.
|
|
30
|
+
# Matched against a tool/agent name, its action verb (argv[0]), and every argv
|
|
31
|
+
# token. Kept as a flat tuple on purpose: greppable, testable, no clever grouping.
|
|
32
|
+
IRREVERSIBLE_VERBS: tuple[str, ...] = (
|
|
33
|
+
"send", "delete", "remove", "purge", "drop", "pay", "purchase", "buy",
|
|
34
|
+
"charge", "transfer", "post", "publish", "ban", "kick", "issue-invoice",
|
|
35
|
+
"wire", "refund", "archive", "revoke", "deactivate", "wipe",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# The four blast-radius classes worth naming: data loss, money out, message sent,
|
|
39
|
+
# someone else's production. Used to explain WHY something escalated, in terms a
|
|
40
|
+
# person recognises rather than an invented taxonomy.
|
|
41
|
+
_CLASS_OF_VERB: dict[str, str] = {
|
|
42
|
+
"send": "message-sent", "post": "message-sent", "publish": "message-sent",
|
|
43
|
+
"issue-invoice": "money-out", "pay": "money-out", "purchase": "money-out",
|
|
44
|
+
"buy": "money-out", "charge": "money-out", "transfer": "money-out",
|
|
45
|
+
"wire": "money-out", "refund": "money-out",
|
|
46
|
+
"delete": "data-loss", "remove": "data-loss", "purge": "data-loss",
|
|
47
|
+
"drop": "data-loss", "wipe": "data-loss", "archive": "data-loss",
|
|
48
|
+
"ban": "third-party-state", "kick": "third-party-state",
|
|
49
|
+
"revoke": "third-party-state", "deactivate": "third-party-state",
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _probe_hit(probe: str) -> str | None:
|
|
54
|
+
"""Return the irreversible verb matched in one string, or None.
|
|
55
|
+
|
|
56
|
+
Word-ish match so `send` hits "send" and "send-message" but not "sender" or
|
|
57
|
+
"resend-guard". Hyphen/underscore/space are all treated as token separators
|
|
58
|
+
because tool actions are kebab-case and argv tokens are not.
|
|
59
|
+
"""
|
|
60
|
+
probe = probe.lower()
|
|
61
|
+
for verb in IRREVERSIBLE_VERBS:
|
|
62
|
+
if probe == verb:
|
|
63
|
+
return verb
|
|
64
|
+
if re.search(rf"(^|[-_ ]){re.escape(verb)}([-_ ]|$)", probe):
|
|
65
|
+
return verb
|
|
66
|
+
return None
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def match(name: str, argv: list[str] | None = None) -> str | None:
|
|
70
|
+
"""Return the matched irreversible verb for an action, or None.
|
|
71
|
+
|
|
72
|
+
Checks the tool/agent name, the action verb (argv[0]), and every argv token.
|
|
73
|
+
This is the function drive.py's `_looks_irreversible` becomes.
|
|
74
|
+
"""
|
|
75
|
+
argv = list(argv or [])
|
|
76
|
+
probes = [str(name)] + [str(tok) for tok in argv]
|
|
77
|
+
for probe in probes:
|
|
78
|
+
hit = _probe_hit(probe)
|
|
79
|
+
if hit:
|
|
80
|
+
return hit
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def classify(name: str, argv: list[str] | None = None) -> dict:
|
|
85
|
+
"""Classify an action's reversibility.
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
{"reversible": bool, "verb": str|None, "blast_class": str|None,
|
|
89
|
+
"reason": str}
|
|
90
|
+
|
|
91
|
+
`blast_class` is one of money-out, message-sent, data-loss or
|
|
92
|
+
third-party-state, and None when the action is reversible.
|
|
93
|
+
"""
|
|
94
|
+
verb = match(name, argv)
|
|
95
|
+
if verb is None:
|
|
96
|
+
return {"reversible": True, "verb": None, "blast_class": None,
|
|
97
|
+
"reason": "no irreversible verb in action name or argv"}
|
|
98
|
+
blast = _CLASS_OF_VERB.get(verb, "irreversible")
|
|
99
|
+
return {"reversible": False, "verb": verb, "blast_class": blast,
|
|
100
|
+
"reason": f"action matches irreversible verb {verb!r} ({blast})"}
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def classify_text(text: str) -> dict:
|
|
104
|
+
"""Classify a free-text question / proposed action.
|
|
105
|
+
|
|
106
|
+
The deputy is asked questions in prose ("should I send the reminder?"), not
|
|
107
|
+
argv. Same verb list, tokenised over the text. Conservative by construction:
|
|
108
|
+
any irreversible verb anywhere in the text trips the gate, because the cost of
|
|
109
|
+
a needless escalation is one WhatsApp line and the cost of a miss is real.
|
|
110
|
+
"""
|
|
111
|
+
for token in re.split(r"[^\w-]+", str(text).lower()):
|
|
112
|
+
if not token:
|
|
113
|
+
continue
|
|
114
|
+
hit = _probe_hit(token)
|
|
115
|
+
if hit:
|
|
116
|
+
blast = _CLASS_OF_VERB.get(hit, "irreversible")
|
|
117
|
+
return {"reversible": False, "verb": hit, "blast_class": blast,
|
|
118
|
+
"reason": f"text names irreversible verb {hit!r} ({blast})"}
|
|
119
|
+
return {"reversible": True, "verb": None, "blast_class": None,
|
|
120
|
+
"reason": "no irreversible verb in text"}
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
# ---------------------------------------------------------------------------
|
|
124
|
+
# Autonomy levels (spec P0.0-07). The binary gate above is generalized to four
|
|
125
|
+
# graded levels WITHOUT weakening it: today's behaviour (reversible runs;
|
|
126
|
+
# irreversible needs approval) is exactly L1, the default. Still code-authoritative
|
|
127
|
+
# and evaluated before the model is asked - a model cannot self-escalate.
|
|
128
|
+
# ---------------------------------------------------------------------------
|
|
129
|
+
|
|
130
|
+
LEVELS: tuple[str, ...] = ("L0", "L1", "L2", "L3")
|
|
131
|
+
_LEVEL_RANK = {lvl: i for i, lvl in enumerate(LEVELS)}
|
|
132
|
+
|
|
133
|
+
# Verbs that are PURE READS (no side effect). L0 allows ONLY these. Conservative by
|
|
134
|
+
# construction: anything whose primary verb is not clearly a read is refused at L0.
|
|
135
|
+
READ_VERBS: tuple[str, ...] = (
|
|
136
|
+
"get", "list", "read", "search", "find", "show", "view", "fetch", "status",
|
|
137
|
+
"describe", "inspect", "check", "count", "lookup", "resolve", "recall", "query",
|
|
138
|
+
"probe", "catalog", "help", "guidance", "checklist", "summary", "stats",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
# role -> the maximum autonomy that role may run or grant (spec P0.0-07 / D14).
|
|
142
|
+
_ROLE_MAX: dict[str, str | None] = {
|
|
143
|
+
"none": None, "read": "L0", "update": "L1", "write": "L2", "admin": "L3",
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _read_hit(probe: str) -> str | None:
|
|
148
|
+
probe = probe.lower()
|
|
149
|
+
for verb in READ_VERBS:
|
|
150
|
+
if probe == verb or re.search(rf"(^|[-_ ]){re.escape(verb)}([-_ ]|$)", probe):
|
|
151
|
+
return verb
|
|
152
|
+
return None
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def is_read_only(name: str, argv: list[str] | None = None) -> bool:
|
|
156
|
+
"""True iff the action has no irreversible verb AND its primary verb (argv[0], else
|
|
157
|
+
the action name) is a known read verb. Used to gate L0 (read-only)."""
|
|
158
|
+
argv = list(argv or [])
|
|
159
|
+
if match(name, argv) is not None:
|
|
160
|
+
return False
|
|
161
|
+
primary = str(argv[0]) if argv else str(name)
|
|
162
|
+
return _read_hit(primary) is not None
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _in_scope(name: str, argv: list[str], scopes: set, verb: str | None) -> bool:
|
|
166
|
+
"""L2: is this irreversible action inside the caller-provided allow-list? Matches on
|
|
167
|
+
the tool/agent name, ``name:action``, the action verb, or the irreversible verb."""
|
|
168
|
+
if not scopes:
|
|
169
|
+
return False
|
|
170
|
+
action = str(argv[0]) if argv else ""
|
|
171
|
+
cands = {str(name), (f"{name}:{action}" if action else str(name)), action, verb or ""}
|
|
172
|
+
return bool(cands & set(scopes))
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
def decide(name: str, argv: list[str] | None = None, *, level: str = "L1",
|
|
176
|
+
scopes=None) -> dict:
|
|
177
|
+
"""Graded autonomy decision, built on ``classify()``. Returns:
|
|
178
|
+
{allow, needs_confirmation, level, reason, verb, blast_class}
|
|
179
|
+
- allow=False -> blocked outright (L0 mutation).
|
|
180
|
+
- allow, needs_confirmation=False -> runs directly.
|
|
181
|
+
- allow, needs_confirmation=True -> runs only via the human-approval path.
|
|
182
|
+
"""
|
|
183
|
+
argv = list(argv or [])
|
|
184
|
+
cls = classify(name, argv)
|
|
185
|
+
lvl = level if level in _LEVEL_RANK else "L1"
|
|
186
|
+
rank = _LEVEL_RANK[lvl]
|
|
187
|
+
|
|
188
|
+
if rank == 0: # L0 read-only
|
|
189
|
+
ro = is_read_only(name, argv)
|
|
190
|
+
return {"allow": ro, "needs_confirmation": False, "level": "L0",
|
|
191
|
+
"reason": ("read-only action permitted at L0" if ro
|
|
192
|
+
else "L0 is read-only; this action may cause a side effect"),
|
|
193
|
+
"verb": cls["verb"], "blast_class": cls["blast_class"]}
|
|
194
|
+
|
|
195
|
+
if cls["reversible"]: # L1/L2/L3: reversible always runs
|
|
196
|
+
return {"allow": True, "needs_confirmation": False, "level": lvl,
|
|
197
|
+
"reason": "reversible action", "verb": None, "blast_class": None}
|
|
198
|
+
|
|
199
|
+
if rank == 1: # L1 ask
|
|
200
|
+
return {"allow": True, "needs_confirmation": True, "level": "L1",
|
|
201
|
+
"reason": f"L1: irreversible ({cls['blast_class']}) needs approval",
|
|
202
|
+
"verb": cls["verb"], "blast_class": cls["blast_class"]}
|
|
203
|
+
|
|
204
|
+
if rank == 2: # L2 bounded
|
|
205
|
+
if _in_scope(name, argv, set(scopes or []), cls["verb"]):
|
|
206
|
+
return {"allow": True, "needs_confirmation": False, "level": "L2",
|
|
207
|
+
"reason": "L2: irreversible action within authorized scope",
|
|
208
|
+
"verb": cls["verb"], "blast_class": cls["blast_class"]}
|
|
209
|
+
return {"allow": True, "needs_confirmation": True, "level": "L2",
|
|
210
|
+
"reason": "L2: irreversible action outside scope needs approval",
|
|
211
|
+
"verb": cls["verb"], "blast_class": cls["blast_class"]}
|
|
212
|
+
|
|
213
|
+
# L3 full - irreversible allowed, still classified for the record.
|
|
214
|
+
return {"allow": True, "needs_confirmation": False, "level": "L3",
|
|
215
|
+
"reason": "L3: full autonomy (irreversible action logged)",
|
|
216
|
+
"verb": cls["verb"], "blast_class": cls["blast_class"]}
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
def max_level_for_role(role: str | None) -> str | None:
|
|
220
|
+
"""The maximum autonomy level a role may run/grant. ``None`` = no AAT access."""
|
|
221
|
+
return _ROLE_MAX.get(str(role or "").strip().lower())
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def clamp(requested: str, role: str | None = None, ws_cap: str | None = None) -> str | None:
|
|
225
|
+
"""Effective level = min(requested, role-max, workspace-cap). A caller may always
|
|
226
|
+
choose LOWER than their max. Returns ``None`` iff the role has no AAT access.
|
|
227
|
+
``role``/``ws_cap`` unset = not clamped (local single-user), so default is unchanged."""
|
|
228
|
+
levels = [requested if requested in _LEVEL_RANK else "L1"]
|
|
229
|
+
if role is not None:
|
|
230
|
+
role_max = max_level_for_role(role)
|
|
231
|
+
if role_max is None:
|
|
232
|
+
return None
|
|
233
|
+
levels.append(role_max)
|
|
234
|
+
if ws_cap in _LEVEL_RANK:
|
|
235
|
+
levels.append(ws_cap)
|
|
236
|
+
return min(levels, key=lambda lvl: _LEVEL_RANK[lvl])
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"""Drive registered tools from an agent.
|
|
2
|
+
|
|
3
|
+
An agent never imports a tool's internals. It invokes the tool's entrypoint as a
|
|
4
|
+
subprocess and parses the single JSON object the tool prints to stdout — exactly
|
|
5
|
+
the JSON-in / JSON-out contract every tool already honors. This keeps agents
|
|
6
|
+
decoupled: a tool can be rewritten freely as long as its manifest contract holds.
|
|
7
|
+
|
|
8
|
+
Throughput note: subprocess-per-call adds ~hundreds of ms, which is irrelevant for
|
|
9
|
+
outreach (deliberately throttled, warmup-capped sends) and keeps the boundary clean.
|
|
10
|
+
|
|
11
|
+
Testability: `invoke` takes an optional `runner` callable so tests can fake tool
|
|
12
|
+
execution without spawning processes or hitting the network.
|
|
13
|
+
"""
|
|
14
|
+
from __future__ import annotations
|
|
15
|
+
|
|
16
|
+
import json
|
|
17
|
+
import subprocess
|
|
18
|
+
import sys
|
|
19
|
+
from pathlib import Path
|
|
20
|
+
from typing import Any, Callable
|
|
21
|
+
|
|
22
|
+
_FRAMEWORK_ROOT = Path(__file__).resolve().parents[2]
|
|
23
|
+
if str(_FRAMEWORK_ROOT) not in sys.path:
|
|
24
|
+
sys.path.insert(0, str(_FRAMEWORK_ROOT))
|
|
25
|
+
|
|
26
|
+
from registry import get_agent, get_tool # noqa: E402
|
|
27
|
+
|
|
28
|
+
# A runner takes the argv list and returns (returncode, stdout, stderr).
|
|
29
|
+
Runner = Callable[[list[str]], "tuple[int, str, str]"]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ToolError(Exception):
|
|
33
|
+
"""A driven tool failed: it returned an {"error": {...}} envelope, produced
|
|
34
|
+
non-JSON output, or could not be located/spawned."""
|
|
35
|
+
|
|
36
|
+
def __init__(self, tool: str, code: str, message: str,
|
|
37
|
+
details: dict[str, Any] | None = None):
|
|
38
|
+
self.tool = tool
|
|
39
|
+
self.code = code
|
|
40
|
+
self.message = message
|
|
41
|
+
self.details = details or {}
|
|
42
|
+
super().__init__(f"{tool}: {code}: {message}")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def _subprocess_runner(timeout: int) -> Runner:
|
|
46
|
+
def run(cmd: list[str]) -> tuple[int, str, str]:
|
|
47
|
+
proc = subprocess.run(cmd, capture_output=True, text=True,
|
|
48
|
+
encoding="utf-8", timeout=timeout)
|
|
49
|
+
return proc.returncode, proc.stdout or "", proc.stderr or ""
|
|
50
|
+
return run
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _parse_tool_output(tool: str, stdout: str, stderr: str) -> dict[str, Any]:
|
|
54
|
+
"""Tools emit exactly one JSON object on stdout (logs go to stderr). Parse the
|
|
55
|
+
last non-empty stdout line defensively, raising ToolError on anything else."""
|
|
56
|
+
lines = [ln for ln in stdout.splitlines() if ln.strip()]
|
|
57
|
+
if not lines:
|
|
58
|
+
raise ToolError(tool, "no_output", "tool produced no stdout",
|
|
59
|
+
{"stderr": stderr[-800:]})
|
|
60
|
+
try:
|
|
61
|
+
data = json.loads(lines[-1])
|
|
62
|
+
except ValueError:
|
|
63
|
+
raise ToolError(tool, "bad_output", "tool stdout was not JSON",
|
|
64
|
+
{"stdout": stdout[-800:], "stderr": stderr[-800:]})
|
|
65
|
+
if isinstance(data, dict) and "error" in data and isinstance(data["error"], dict):
|
|
66
|
+
err = data["error"]
|
|
67
|
+
raise ToolError(tool, err.get("code", "tool_error"),
|
|
68
|
+
err.get("message", ""), err.get("details") or {})
|
|
69
|
+
if not isinstance(data, dict):
|
|
70
|
+
raise ToolError(tool, "bad_output", "tool JSON was not an object",
|
|
71
|
+
{"stdout": stdout[-800:]})
|
|
72
|
+
return data
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def invoke(tool_name: str, *args: Any, runner: Runner | None = None,
|
|
76
|
+
timeout: int = 120) -> dict[str, Any]:
|
|
77
|
+
"""Run a registered tool and return its parsed JSON object.
|
|
78
|
+
|
|
79
|
+
Example: invoke("apollo", "search-people", "--keywords", "energy", "--per-page", 25)
|
|
80
|
+
Raises ToolError on tool-not-found, spawn failure, non-JSON output, or an
|
|
81
|
+
{"error": ...} envelope from the tool.
|
|
82
|
+
"""
|
|
83
|
+
try:
|
|
84
|
+
# respect_hidden=False: a scoped surface limits what a session is offered,
|
|
85
|
+
# it must not break an agent's own plumbing. See registry.get_tool.
|
|
86
|
+
m = get_tool(tool_name, respect_hidden=False)
|
|
87
|
+
except KeyError:
|
|
88
|
+
raise ToolError(tool_name, "tool_not_found",
|
|
89
|
+
f"no registered tool named {tool_name!r}")
|
|
90
|
+
if m.path is None:
|
|
91
|
+
raise ToolError(tool_name, "no_path", "tool manifest has no path")
|
|
92
|
+
entry = m.path / m.entrypoint
|
|
93
|
+
if not entry.exists():
|
|
94
|
+
raise ToolError(tool_name, "no_entrypoint", f"entrypoint missing: {entry}")
|
|
95
|
+
|
|
96
|
+
argv = [sys.executable, str(entry), *[str(a) for a in args]]
|
|
97
|
+
run = runner or _subprocess_runner(timeout)
|
|
98
|
+
try:
|
|
99
|
+
rc, out, err = run(argv)
|
|
100
|
+
except subprocess.TimeoutExpired:
|
|
101
|
+
raise ToolError(tool_name, "timeout", f"tool timed out after {timeout}s")
|
|
102
|
+
except Exception as exc: # noqa: BLE001
|
|
103
|
+
raise ToolError(tool_name, "spawn_failed", str(exc))
|
|
104
|
+
# A tool failure still prints a JSON error envelope, so parse before trusting rc.
|
|
105
|
+
return _parse_tool_output(tool_name, out, err)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def invoke_agent(agent_name: str, *args: Any, runner: Runner | None = None,
|
|
109
|
+
timeout: int = 300) -> dict[str, Any]:
|
|
110
|
+
"""Run a registered AGENT and return its parsed JSON object.
|
|
111
|
+
|
|
112
|
+
An agent honors the same JSON-in / JSON-out contract as a tool (action name
|
|
113
|
+
as the first positional arg, one JSON object on stdout, {"error": ...} on
|
|
114
|
+
failure), so this mirrors ``invoke`` but resolves the entrypoint via
|
|
115
|
+
``get_agent``. This is what lets the headless ``orchestrator drive`` loop
|
|
116
|
+
drive OTHER agents (curator, email-classifier, ...) as well as tools.
|
|
117
|
+
|
|
118
|
+
Example: invoke_agent("curator", "recall", "--query", "pricing deck")
|
|
119
|
+
Raises ToolError (with the agent name as ``.tool``) on not-found, spawn
|
|
120
|
+
failure, non-JSON output, or an {"error": ...} envelope from the agent.
|
|
121
|
+
"""
|
|
122
|
+
try:
|
|
123
|
+
m = get_agent(agent_name)
|
|
124
|
+
except KeyError:
|
|
125
|
+
raise ToolError(agent_name, "agent_not_found",
|
|
126
|
+
f"no registered agent named {agent_name!r}")
|
|
127
|
+
if m.path is None:
|
|
128
|
+
raise ToolError(agent_name, "no_path", "agent manifest has no path")
|
|
129
|
+
entry = m.path / m.entrypoint
|
|
130
|
+
if not entry.exists():
|
|
131
|
+
raise ToolError(agent_name, "no_entrypoint", f"entrypoint missing: {entry}")
|
|
132
|
+
|
|
133
|
+
argv = [sys.executable, str(entry), *[str(a) for a in args]]
|
|
134
|
+
run = runner or _subprocess_runner(timeout)
|
|
135
|
+
try:
|
|
136
|
+
rc, out, err = run(argv)
|
|
137
|
+
except subprocess.TimeoutExpired:
|
|
138
|
+
raise ToolError(agent_name, "timeout", f"agent timed out after {timeout}s")
|
|
139
|
+
except Exception as exc: # noqa: BLE001
|
|
140
|
+
raise ToolError(agent_name, "spawn_failed", str(exc))
|
|
141
|
+
return _parse_tool_output(agent_name, out, err)
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Connector Builder — build → test → improve playbook
|
|
2
|
+
|
|
3
|
+
The operating procedure for producing a working PROCESIO Custom Action with the AI Connector Builder. The agent's `next-step` and `checklist` actions are the executable form of this document.
|
|
4
|
+
|
|
5
|
+
> **Running it for real?** Read `guidance --topic troubleshooting` alongside this — it has the tool/skill inventory, the live-run realities (sync stages 504 at the proxy but keep running → poll; the clarification-questions shape; the MSYS path gotcha), and the compile failure triage (NU1301 = platform NuGet, not your code, vs NU1102 = a bad version pin you fix in the .csproj). `next-step --build-id` attaches that triage automatically on a failed compile.
|
|
6
|
+
|
|
7
|
+
## The loop
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
1 scope → create-build (API docs + clear requirements)
|
|
11
|
+
2 gather → gather (GATHER+CLARIFY) → read api_profile + questions
|
|
12
|
+
3 clarify → answer (every question; keys are the question ids) → PLAN
|
|
13
|
+
4 plan → revise-plan* then approve-plan → GENERATE (pauses)
|
|
14
|
+
5 generate → review files; regenerate-file* then approve-generate
|
|
15
|
+
6 validate → validate-continue / validate-autofix / validate-return-to-generate
|
|
16
|
+
compile → (automatic) on failure: retry --from-step 6
|
|
17
|
+
7 deliver → download-artifact → connector.nupkg
|
|
18
|
+
8 install → procesio customaction-upload --file connector.nupkg
|
|
19
|
+
9 test → exercise it in PROCESIO (hand off to the procesio agent)
|
|
20
|
+
10 improve → feed failures back (see "Where feedback goes")
|
|
21
|
+
11 cleanup → procesio customaction-delete before re-uploading a new build
|
|
22
|
+
→ recompile, re-upload, repeat 8-11 until green
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`*` = repeat as needed before the approve.
|
|
26
|
+
|
|
27
|
+
## Two ways to drive stages 2-6
|
|
28
|
+
|
|
29
|
+
- **Manual (default for a first build):** call each stage yourself so you can read and steer every output. Use `next-step --build-id <ID>` after each call.
|
|
30
|
+
- **Automatic:** `start-build --build-id <ID>` runs the entire pipeline as one background task. Poll `get-build`. Use this only once the requirements + clarifications are trusted (it won't pause for review).
|
|
31
|
+
|
|
32
|
+
## Stage discipline
|
|
33
|
+
|
|
34
|
+
- **Scope (1).** Requirements are the highest-leverage input. State the operations the connector must expose, the auth scheme, and the data shapes. A vague requirement produces a vague plan and a weak connector. The docs URL is scraped; if the docs are poor, paste the relevant section via `--api-docs-text`.
|
|
35
|
+
- **Clarify (3).** Answer *all* questions — unanswered ones fall back to defaults that may not match intent. The answer keys are the question **ids** returned by `gather` (or `get-build`).
|
|
36
|
+
- **Plan (4).** This is the cheapest place to fix structure (files, classes, methods, NuGet deps, input/output controls). Prefer `revise-plan` here over fixing generated code later. `set-version` is only valid at this stage.
|
|
37
|
+
- **Generate (5).** Review before approving. Fix a single file with `regenerate-file`; use `regenerate` for cross-file/general guidance. Approving moves you into validate→compile→fix→deliver (a background task).
|
|
38
|
+
- **Validate/Compile (6).** Read findings before continuing. On a compile failure, `retry --from-step 6` skips straight to compile→fix→deliver (no regeneration); use `--from-step 4` to regenerate first.
|
|
39
|
+
- **Deliver (7).** The artifact is a real PROCESIO Custom Action `.nupkg`. It is not "done" until it has been **installed and exercised in PROCESIO** — compiling is necessary, not sufficient.
|
|
40
|
+
|
|
41
|
+
## Where feedback goes (improve, stage 10)
|
|
42
|
+
|
|
43
|
+
| Symptom seen in PROCESIO | Fix in the builder |
|
|
44
|
+
|---|---|
|
|
45
|
+
| Wrong inputs/outputs, missing operation | `revise-plan` (re-shape) → re-approve |
|
|
46
|
+
| One file's logic wrong | `regenerate-file --filename X --instructions "..."` |
|
|
47
|
+
| Compiles but misbehaves at runtime | `regenerate` with the PROCESIO error text as `--step-instructions` |
|
|
48
|
+
| Validation too weak/strong | edit `validation_rule` knowledge module |
|
|
49
|
+
| **Every connector makes the same mistake** | edit `prompt` / `spec_module` / `example` knowledge, then `reload-config` — this fixes generation for ALL future builds |
|
|
50
|
+
|
|
51
|
+
The knowledge edits are the deepest loop: they improve the *builder*, not just one connector. Reach for them when you see a systemic pattern (e.g. the model keeps mis-using a PROCESIO SDK decorator) — encode the correction once as a spec module or few-shot example.
|
|
52
|
+
|
|
53
|
+
## Diagnostics
|
|
54
|
+
|
|
55
|
+
- `get-build` — current status/step_status + all JSONB state.
|
|
56
|
+
- `logs --success false` — the failing stage's LLM logs (model/cost/tokens, prompt via the admin prompt endpoint).
|
|
57
|
+
- `list-issues --build-id <ID>` / `get-issue` — recorded failure cases with code snapshots (before/after a fix).
|
|
58
|
+
- `build-selftest` — is the compiler service itself healthy? (trivial 2-file C#, no LLM spend.)
|
|
59
|
+
|
|
60
|
+
## Definition of done
|
|
61
|
+
|
|
62
|
+
A connector is done when: it compiled, **installed into PROCESIO** (`customaction-list` shows it), and ran correctly inside a real PROCESIO process with expected inputs/outputs — verified per the procesio agent's build-and-test playbook. Anything short of a live PROCESIO run is "compiles", not "works".
|