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,175 @@
|
|
|
1
|
+
"""MCP protocol mechanics shared by both surfaces: version negotiation and the 2026-07-28 era.
|
|
2
|
+
|
|
3
|
+
The two servers publish different tools for different audiences and stay independent of each
|
|
4
|
+
other (neither imports the other; tests/test_chat_surface.py asserts it). The protocol they
|
|
5
|
+
speak is a different matter. It has one correct behaviour, and keeping a copy of it in each
|
|
6
|
+
server is how both came to agree to any protocol version a client asked for, including ones
|
|
7
|
+
that do not exist. So the mechanics live here, once. Each server supplies only what is its
|
|
8
|
+
own: its tools, its dispatcher and its identity.
|
|
9
|
+
|
|
10
|
+
MCP's own terms for the two eras:
|
|
11
|
+
|
|
12
|
+
legacy 2025-11-25 and earlier. An `initialize` handshake fixes the version for the process.
|
|
13
|
+
modern 2026-07-28. No handshake: every request carries its version in `_meta`, every result
|
|
14
|
+
carries `resultType`, list results carry `ttlMs` and `cacheScope`, and servers MUST
|
|
15
|
+
implement `server/discover`.
|
|
16
|
+
|
|
17
|
+
A server that speaks both is "dual-era". Both servers are dual-era over stdio, because a
|
|
18
|
+
modern-only stdio server would fail every legacy client, and legacy clients have no way to
|
|
19
|
+
fall forward.
|
|
20
|
+
|
|
21
|
+
The HTTP transport calls ``handle(..., modern=False)``. Modern Streamable HTTP adds header
|
|
22
|
+
rules (`Mcp-Method`, `Mcp-Name`) that transport does not implement, so it must not advertise
|
|
23
|
+
the modern era. Over it, `server/discover` stays a plain method-not-found: that is the answer a
|
|
24
|
+
dual-era client reads as "legacy server, fall back". Never answer it with a version-gated
|
|
25
|
+
message instead; one public MCP server did, and the client took it as a modern reply and
|
|
26
|
+
stopped seeing its tools.
|
|
27
|
+
|
|
28
|
+
Pure standard library, so either server can import it without widening what it depends on.
|
|
29
|
+
"""
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import hashlib
|
|
33
|
+
import json
|
|
34
|
+
import sys
|
|
35
|
+
from typing import Callable
|
|
36
|
+
|
|
37
|
+
MODERN_VERSIONS = ("2026-07-28",)
|
|
38
|
+
# Newest first. A tools-only server meets every one of these: later revisions only ADD
|
|
39
|
+
# optional fields (annotations, title, outputSchema), which earlier clients ignore.
|
|
40
|
+
LEGACY_VERSIONS = ("2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05")
|
|
41
|
+
|
|
42
|
+
META_VERSION = "io.modelcontextprotocol/protocolVersion"
|
|
43
|
+
META_SERVER_INFO = "io.modelcontextprotocol/serverInfo"
|
|
44
|
+
META_TOOLS_DIGEST = "com.procesio/toolsDigest"
|
|
45
|
+
|
|
46
|
+
PARSE_ERROR = -32700
|
|
47
|
+
METHOD_NOT_FOUND = -32601
|
|
48
|
+
INTERNAL_ERROR = -32603
|
|
49
|
+
UNSUPPORTED_PROTOCOL_VERSION = -32022
|
|
50
|
+
|
|
51
|
+
# The tool list cannot change while the process runs: it is built once at import and
|
|
52
|
+
# `listChanged` is false. So a long freshness hint is honest, and "public" is too, because
|
|
53
|
+
# the list carries no per-user data a shared intermediary should keep to itself.
|
|
54
|
+
LIST_TTL_MS = 3_600_000
|
|
55
|
+
CACHE_SCOPE = "public"
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def negotiate_legacy(requested) -> str:
|
|
59
|
+
"""The version to answer `initialize` with: the client's if we serve it, else our newest.
|
|
60
|
+
|
|
61
|
+
`initialize` always selects the legacy era, so a client asking for a modern version there
|
|
62
|
+
gets the newest legacy one. That is what a dual-era server is required to do, and it is
|
|
63
|
+
the answer that keeps a client from expecting fields this era never sends."""
|
|
64
|
+
return requested if requested in LEGACY_VERSIONS else LEGACY_VERSIONS[0]
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def tools_digest(tools) -> str:
|
|
68
|
+
"""sha256 over the canonical JSON of a `tools/list` tools array.
|
|
69
|
+
|
|
70
|
+
Canonical means keys sorted, no whitespace, UTF-8, non-ASCII left unescaped. A client or
|
|
71
|
+
gateway reproduces it from the list it actually RECEIVED and compares it with the value
|
|
72
|
+
published in server.json, which the MCP Registry does not let anyone change after
|
|
73
|
+
publication. The value a server reports about itself is a convenience for spotting which
|
|
74
|
+
release you are talking to, not a control: the spec says self-reported server information
|
|
75
|
+
must not drive security decisions."""
|
|
76
|
+
raw = json.dumps(tools, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
|
|
77
|
+
return "sha256:" + hashlib.sha256(raw.encode("utf-8")).hexdigest()
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def handle(req: dict, *, tools: list, call_tool: Callable[[str, dict], tuple[dict, bool]],
|
|
81
|
+
server_info: dict, modern: bool = True) -> dict | None:
|
|
82
|
+
"""Dispatch one JSON-RPC request. Returns a response, or None for a notification."""
|
|
83
|
+
method = req.get("method") or ""
|
|
84
|
+
req_id = req.get("id")
|
|
85
|
+
is_notification = "id" not in req
|
|
86
|
+
params = req.get("params") if isinstance(req.get("params"), dict) else {}
|
|
87
|
+
meta = params.get("_meta")
|
|
88
|
+
requested = meta.get(META_VERSION) if isinstance(meta, dict) else None
|
|
89
|
+
is_modern = modern and requested is not None
|
|
90
|
+
|
|
91
|
+
def ok(result):
|
|
92
|
+
return {"jsonrpc": "2.0", "id": req_id, "result": result}
|
|
93
|
+
|
|
94
|
+
def err(code, message, data=None):
|
|
95
|
+
error = {"code": code, "message": message}
|
|
96
|
+
if data is not None:
|
|
97
|
+
error["data"] = data
|
|
98
|
+
return {"jsonrpc": "2.0", "id": req_id, "error": error}
|
|
99
|
+
|
|
100
|
+
def complete(result, *, cacheable=False):
|
|
101
|
+
"""Modern results carry resultType and the server's identity; lists add cache hints."""
|
|
102
|
+
result = dict(result)
|
|
103
|
+
result["resultType"] = "complete"
|
|
104
|
+
result["_meta"] = {**(result.get("_meta") or {}), META_SERVER_INFO: server_info}
|
|
105
|
+
if cacheable:
|
|
106
|
+
result["ttlMs"] = LIST_TTL_MS
|
|
107
|
+
result["cacheScope"] = CACHE_SCOPE
|
|
108
|
+
return ok(result)
|
|
109
|
+
|
|
110
|
+
if method.startswith("notifications/"):
|
|
111
|
+
return None
|
|
112
|
+
|
|
113
|
+
if is_modern and requested not in MODERN_VERSIONS:
|
|
114
|
+
if is_notification:
|
|
115
|
+
return None
|
|
116
|
+
# A recognised modern error: it tells a dual-era client this server IS modern, so it
|
|
117
|
+
# retries with a listed version instead of falling back to `initialize`.
|
|
118
|
+
return err(UNSUPPORTED_PROTOCOL_VERSION, "Unsupported protocol version",
|
|
119
|
+
{"supported": list(MODERN_VERSIONS), "requested": requested})
|
|
120
|
+
|
|
121
|
+
if method == "server/discover":
|
|
122
|
+
if not modern:
|
|
123
|
+
return err(METHOD_NOT_FOUND, f"method not found: {method}")
|
|
124
|
+
return complete({"supportedVersions": list(MODERN_VERSIONS),
|
|
125
|
+
"capabilities": {"tools": {}},
|
|
126
|
+
"_meta": {META_TOOLS_DIGEST: tools_digest(tools)}}, cacheable=True)
|
|
127
|
+
|
|
128
|
+
if method == "initialize":
|
|
129
|
+
return ok({"protocolVersion": negotiate_legacy(params.get("protocolVersion")),
|
|
130
|
+
"capabilities": {"tools": {"listChanged": False}},
|
|
131
|
+
"serverInfo": server_info})
|
|
132
|
+
|
|
133
|
+
if method == "ping": # removed in the modern era; harmless to keep answering for legacy
|
|
134
|
+
return ok({})
|
|
135
|
+
|
|
136
|
+
if method == "tools/list":
|
|
137
|
+
return complete({"tools": tools}, cacheable=True) if is_modern else ok({"tools": tools})
|
|
138
|
+
|
|
139
|
+
if method == "tools/call":
|
|
140
|
+
payload, is_error = call_tool(params.get("name", ""), params.get("arguments") or {})
|
|
141
|
+
result = {"content": [{"type": "text", "text": json.dumps(payload, ensure_ascii=False)}],
|
|
142
|
+
"isError": is_error}
|
|
143
|
+
return complete(result) if is_modern else ok(result)
|
|
144
|
+
|
|
145
|
+
if is_notification:
|
|
146
|
+
return None
|
|
147
|
+
return err(METHOD_NOT_FOUND, f"method not found: {method}")
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def serve_stdio(handle_fn: Callable[[dict], dict | None], log: Callable[[str], None]) -> None:
|
|
151
|
+
"""Newline-delimited JSON-RPC over stdin/stdout. Never raises out of the loop."""
|
|
152
|
+
try:
|
|
153
|
+
sys.stdout.reconfigure(encoding="utf-8", newline="\n")
|
|
154
|
+
sys.stdin.reconfigure(encoding="utf-8")
|
|
155
|
+
except Exception: # noqa: BLE001 - older interpreters; best effort
|
|
156
|
+
pass
|
|
157
|
+
for line in sys.stdin:
|
|
158
|
+
line = line.strip()
|
|
159
|
+
if not line:
|
|
160
|
+
continue
|
|
161
|
+
try:
|
|
162
|
+
req = json.loads(line)
|
|
163
|
+
except ValueError:
|
|
164
|
+
resp = {"jsonrpc": "2.0", "id": None,
|
|
165
|
+
"error": {"code": PARSE_ERROR, "message": "parse error"}}
|
|
166
|
+
else:
|
|
167
|
+
try:
|
|
168
|
+
resp = handle_fn(req)
|
|
169
|
+
except Exception as e: # noqa: BLE001
|
|
170
|
+
log(f"handler error: {e}")
|
|
171
|
+
resp = {"jsonrpc": "2.0", "id": req.get("id") if isinstance(req, dict) else None,
|
|
172
|
+
"error": {"code": INTERNAL_ERROR, "message": f"internal error: {e}"}}
|
|
173
|
+
if resp is not None:
|
|
174
|
+
sys.stdout.write(json.dumps(resp, ensure_ascii=False) + "\n")
|
|
175
|
+
sys.stdout.flush()
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
"""aat-mcp: a stdio MCP server exposing the AAT registry as a small generic surface.
|
|
2
|
+
|
|
3
|
+
Hand-rolled JSON-RPC 2.0 over newline-delimited stdio (no third-party dependency,
|
|
4
|
+
robust to environment quirks). A driver (opencode, or any MCP client) connects and
|
|
5
|
+
gets these tools (opencode shows them prefixed with the server name, e.g.
|
|
6
|
+
`aat_run_tool`):
|
|
7
|
+
|
|
8
|
+
capabilities - list tools/agents/skills; or one capability's full arg schema
|
|
9
|
+
run_tool - run a REVERSIBLE tool with structured JSON args
|
|
10
|
+
run_agent - run a REVERSIBLE agent
|
|
11
|
+
run_tool_confirmed - run a tool INCLUDING irreversible actions (human-approved)
|
|
12
|
+
run_agent_confirmed - run an agent INCLUDING irreversible actions (human-approved)
|
|
13
|
+
get_skill - fetch a skill's markdown (model-decided loading; spec 04)
|
|
14
|
+
|
|
15
|
+
Two things this fixes vs the B0 bash spike: args are JSON objects (no shell
|
|
16
|
+
quote-escaping) and capability schemas replace `--help` spelunking.
|
|
17
|
+
|
|
18
|
+
Safety (spec 03): the reversibility gate is CODE, evaluated before execution
|
|
19
|
+
(gate.py -> agents/_lib/reversibility, the same policy as `orchestrator drive` and
|
|
20
|
+
`deputy`). `run_tool`/`run_agent` refuse irreversible actions and return
|
|
21
|
+
`approval_required`, naming the `*_confirmed` path. Only the `*_confirmed` tools are
|
|
22
|
+
marked `ask` in opencode, so a HUMAN approves each side effect; a model cannot forge
|
|
23
|
+
the click and cannot bypass by picking the plain tool. Set AAT_MCP_DENY_IRREVERSIBLE
|
|
24
|
+
for a headless run where even confirmed actions must be refused.
|
|
25
|
+
|
|
26
|
+
Run: python webplatform/aat_mcp/server.py (opencode spawns this over stdio)
|
|
27
|
+
"""
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
import json
|
|
31
|
+
import os
|
|
32
|
+
import sys
|
|
33
|
+
|
|
34
|
+
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
35
|
+
import bridge # noqa: E402 (sibling module)
|
|
36
|
+
import gate # noqa: E402
|
|
37
|
+
import protocol # noqa: E402 (shared MCP mechanics)
|
|
38
|
+
|
|
39
|
+
SERVER_INFO = {"name": "aat-mcp", "version": "0.2.0"}
|
|
40
|
+
DEFAULT_PROTOCOL = protocol.LEGACY_VERSIONS[0] # what `initialize` gets when it names no version
|
|
41
|
+
|
|
42
|
+
_RUN_TOOL_SCHEMA = {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"properties": {
|
|
45
|
+
"tool": {"type": "string", "description": "registered tool name"},
|
|
46
|
+
"action": {"type": "string", "description": "action name (omit for a flat tool)"},
|
|
47
|
+
"args": {"type": "object", "description": "flag name -> value (objects/arrays pass cleanly)"},
|
|
48
|
+
},
|
|
49
|
+
"required": ["tool"],
|
|
50
|
+
}
|
|
51
|
+
_RUN_AGENT_SCHEMA = {
|
|
52
|
+
"type": "object",
|
|
53
|
+
"properties": {
|
|
54
|
+
"agent": {"type": "string", "description": "registered agent name"},
|
|
55
|
+
"action": {"type": "string", "description": "action name"},
|
|
56
|
+
"args": {"type": "object", "description": "flag name -> value"},
|
|
57
|
+
},
|
|
58
|
+
"required": ["agent"],
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TOOLS = [
|
|
62
|
+
{
|
|
63
|
+
"name": "capabilities",
|
|
64
|
+
"description": (
|
|
65
|
+
"Discover AAT capabilities. No args -> a compact list of every ready "
|
|
66
|
+
"tool/agent/skill (name, description, primary_action). "
|
|
67
|
+
"search='<keywords>' -> find the right ACTION by keyword across every "
|
|
68
|
+
"tool/agent (add name= to search within one). name=<tool or agent> + "
|
|
69
|
+
"action=<action> -> that one action's full argument schema; use this "
|
|
70
|
+
"INSTEAD of guessing flags or running --help. name= alone returns the "
|
|
71
|
+
"whole schema, but for a large tool that is automatically reduced to "
|
|
72
|
+
"the action-name index - so prefer search= or action=. Optional kind "
|
|
73
|
+
"filter: tool|agent|skill."
|
|
74
|
+
),
|
|
75
|
+
"inputSchema": {
|
|
76
|
+
"type": "object",
|
|
77
|
+
"properties": {
|
|
78
|
+
"kind": {"type": "string", "enum": ["tool", "agent", "skill"]},
|
|
79
|
+
"name": {"type": "string", "description": "tool or agent name"},
|
|
80
|
+
"action": {"type": "string",
|
|
81
|
+
"description": "one action of `name` - returns just its arg schema"},
|
|
82
|
+
"search": {"type": "string",
|
|
83
|
+
"description": "keywords to find a matching action"},
|
|
84
|
+
"full": {"type": "boolean",
|
|
85
|
+
"description": "include the longer description + example per "
|
|
86
|
+
"entry (default false keeps the listing small)"},
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"name": "run_tool",
|
|
92
|
+
"description": (
|
|
93
|
+
"Run a registered AAT tool for a REVERSIBLE / read action. 'args' is a "
|
|
94
|
+
"JSON object of flag name->value (objects/arrays pass cleanly, no shell "
|
|
95
|
+
"escaping). Targets the PROCESIO platform API - see "
|
|
96
|
+
"https://docs.procesio.com. If the action is irreversible (send/delete/pay/post/...), "
|
|
97
|
+
"this REFUSES and returns approval_required telling you to use "
|
|
98
|
+
"run_tool_confirmed. Discover tools/actions via capabilities."
|
|
99
|
+
),
|
|
100
|
+
"inputSchema": _RUN_TOOL_SCHEMA,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "run_tool_confirmed",
|
|
104
|
+
"description": (
|
|
105
|
+
"Run a tool INCLUDING an irreversible action (send/delete/pay/post/"
|
|
106
|
+
"issue-invoice/...). Targets the PROCESIO platform API - see "
|
|
107
|
+
"https://docs.procesio.com. The operator is asked to approve before it runs. "
|
|
108
|
+
"Use this only after run_tool returned approval_required, or when you "
|
|
109
|
+
"know the action has a real-world side effect."
|
|
110
|
+
),
|
|
111
|
+
"inputSchema": _RUN_TOOL_SCHEMA,
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"name": "run_agent",
|
|
115
|
+
"description": (
|
|
116
|
+
"Run a registered AAT agent for a REVERSIBLE action. In an interactive "
|
|
117
|
+
"session, route a substantive request first with agent='orchestrator', "
|
|
118
|
+
"action='intake', args={'request': '<the ask>'} (per AGENTS.md). If you "
|
|
119
|
+
"were told you are already inside one step of an externally-managed plan, "
|
|
120
|
+
"do NOT route or plan - act directly; 'orchestrator drive' is refused "
|
|
121
|
+
"there because it would start a second orchestration loop. Irreversible "
|
|
122
|
+
"agent actions are refused here - use run_agent_confirmed."
|
|
123
|
+
),
|
|
124
|
+
"inputSchema": _RUN_AGENT_SCHEMA,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "run_agent_confirmed",
|
|
128
|
+
"description": (
|
|
129
|
+
"Run an agent INCLUDING an irreversible action. The operator is asked to "
|
|
130
|
+
"approve before it runs."
|
|
131
|
+
),
|
|
132
|
+
"inputSchema": _RUN_AGENT_SCHEMA,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "get_skill",
|
|
136
|
+
"description": (
|
|
137
|
+
"Fetch a registered skill's SKILL.md plus a metadata-only resource index. "
|
|
138
|
+
"To retrieve one bundled resource, pass a path from that index in the "
|
|
139
|
+
"optional resource field."
|
|
140
|
+
),
|
|
141
|
+
"inputSchema": {
|
|
142
|
+
"type": "object",
|
|
143
|
+
"properties": {
|
|
144
|
+
"name": {"type": "string"},
|
|
145
|
+
"resource": {"type": "string"},
|
|
146
|
+
},
|
|
147
|
+
"required": ["name"],
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
]
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
# Titles and hints, kept in one table so the claim each tool makes about itself can be
|
|
154
|
+
# audited in one place. The hints drive auto-permissions in a client: a readOnlyHint tool
|
|
155
|
+
# may run without asking, so a wrong one here is a write that fires unprompted.
|
|
156
|
+
#
|
|
157
|
+
# run_* are NOT read-only. They dispatch any registered action, and the reversible set
|
|
158
|
+
# they admit still includes creates and updates (add-credential, datastore-add-rows,
|
|
159
|
+
# update-*). "Reversible" answers whether a thing can be undone; "read-only" answers
|
|
160
|
+
# whether it changes anything, and those are different questions. Mapping one onto the
|
|
161
|
+
# other would mislabel roughly ninety write actions as safe to run unattended.
|
|
162
|
+
_ANNOTATIONS = {
|
|
163
|
+
"capabilities": ("Discover PROCESIO capabilities", True),
|
|
164
|
+
"get_skill": ("Read a PROCESIO skill", True),
|
|
165
|
+
"run_tool": ("Run a PROCESIO tool action", False),
|
|
166
|
+
"run_tool_confirmed": ("Run a PROCESIO tool action (approval required)", False),
|
|
167
|
+
"run_agent": ("Run a PROCESIO agent action", False),
|
|
168
|
+
"run_agent_confirmed": ("Run a PROCESIO agent action (approval required)", False),
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
for _t in TOOLS:
|
|
172
|
+
_title, _read_only = _ANNOTATIONS[_t["name"]]
|
|
173
|
+
_t["title"] = _title
|
|
174
|
+
_t["annotations"] = {
|
|
175
|
+
"title": _title,
|
|
176
|
+
"readOnlyHint": _read_only,
|
|
177
|
+
# A dispatcher can reach an update, which overwrites data. Only a tool that
|
|
178
|
+
# cannot change anything may claim otherwise.
|
|
179
|
+
"destructiveHint": not _read_only,
|
|
180
|
+
"idempotentHint": _read_only,
|
|
181
|
+
# Read-only calls answer from the local registry; the rest reach the platform.
|
|
182
|
+
"openWorldHint": not _read_only,
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _log(msg: str) -> None:
|
|
187
|
+
print(f"[aat-mcp] {msg}", file=sys.stderr, flush=True)
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _run(kind: str, arguments: dict, confirmed: bool) -> tuple[dict, bool]:
|
|
191
|
+
"""Execute a tool/agent through the reversibility gate.
|
|
192
|
+
|
|
193
|
+
kind: 'tool' or 'agent'. confirmed: True for the *_confirmed tools (opencode has
|
|
194
|
+
already asked the operator). Returns (payload, is_error)."""
|
|
195
|
+
key = "tool" if kind == "tool" else "agent"
|
|
196
|
+
target = arguments.get(key)
|
|
197
|
+
if not target:
|
|
198
|
+
return {"error": f"run_{kind} requires '{key}'"}, True
|
|
199
|
+
action = arguments.get("action")
|
|
200
|
+
verdict = gate.classify(target, action)
|
|
201
|
+
|
|
202
|
+
if not confirmed and not verdict["reversible"]:
|
|
203
|
+
# Plain tool refuses an irreversible action and names the confirmed path.
|
|
204
|
+
return {"approval_required": {
|
|
205
|
+
key: target, "action": action, "verb": verdict["verb"],
|
|
206
|
+
"blast_class": verdict["blast_class"], "reason": verdict["reason"],
|
|
207
|
+
"next": (f"This action is irreversible ({verdict['blast_class']}). To "
|
|
208
|
+
f"proceed, call run_{kind}_confirmed with the same arguments - "
|
|
209
|
+
f"the operator will be asked to approve it."),
|
|
210
|
+
}}, False
|
|
211
|
+
|
|
212
|
+
if confirmed and not verdict["reversible"] and gate.deny_irreversible_env():
|
|
213
|
+
# Headless fail-safe: no human in the seat to approve.
|
|
214
|
+
return {"refused": ("irreversible action denied (AAT_MCP_DENY_IRREVERSIBLE "
|
|
215
|
+
"is set; no human in the seat)"),
|
|
216
|
+
"verb": verdict["verb"], "blast_class": verdict["blast_class"]}, True
|
|
217
|
+
|
|
218
|
+
runner = bridge.run_tool if kind == "tool" else bridge.run_agent
|
|
219
|
+
res = runner(target, action, arguments.get("args"))
|
|
220
|
+
if not res.get("ok", False):
|
|
221
|
+
# Recovery hint so the driver re-discovers instead of guessing again, falling
|
|
222
|
+
# back to bash, or claiming it lacks access (observed with weaker models on a
|
|
223
|
+
# bad action/args or a transient tool error).
|
|
224
|
+
res = dict(res)
|
|
225
|
+
res["hint"] = (f"This {kind} call failed - it does NOT mean you lack access. "
|
|
226
|
+
f"Call capabilities with name='{target}' and action='{action}' "
|
|
227
|
+
f"(or search='<keywords>') to see the valid args, then retry "
|
|
228
|
+
f"run_{kind}. Do NOT fall back to bash.")
|
|
229
|
+
schema = _usage_help(kind, target, action, res)
|
|
230
|
+
if schema:
|
|
231
|
+
res["schema"] = schema
|
|
232
|
+
return res, True
|
|
233
|
+
return res, False
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
# A usage failure is a naming failure: a flag spelled `workspace_id` instead of
|
|
237
|
+
# `workspace-id`, an invented action, or a required arg the caller probed for by
|
|
238
|
+
# calling the action empty. The framework already knows the right answer at this
|
|
239
|
+
# exact moment - it just never said it, so the model guessed again (measured: the
|
|
240
|
+
# same action retried with four different arg spellings). Answering here fixes it
|
|
241
|
+
# for every tool at once, with no per-tool change.
|
|
242
|
+
_USAGE_MARKERS = ("unknown action", "unrecognized arguments",
|
|
243
|
+
"arguments are required", "invalid choice")
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
def _usage_help(kind: str, target: str, action: str | None, res: dict) -> dict | None:
|
|
247
|
+
"""Attach the valid action/arg names when a call failed on USAGE, not on the
|
|
248
|
+
remote system. Never raises - enrichment must not turn into a second error."""
|
|
249
|
+
err = res.get("error") or {}
|
|
250
|
+
message = str(err.get("message") or "")
|
|
251
|
+
if not any(marker in message for marker in _USAGE_MARKERS):
|
|
252
|
+
return None
|
|
253
|
+
try:
|
|
254
|
+
return bridge.action_help(target, action, kind)
|
|
255
|
+
except Exception: # noqa: BLE001 - best effort; the original error still stands
|
|
256
|
+
return None
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def _call_tool(name: str, arguments: dict) -> tuple[dict, bool]:
|
|
260
|
+
"""Return (result_payload, is_error). Never raises: failures come back as a
|
|
261
|
+
structured payload the model can read."""
|
|
262
|
+
try:
|
|
263
|
+
if name == "capabilities":
|
|
264
|
+
return bridge.capabilities(arguments.get("kind"), arguments.get("name"),
|
|
265
|
+
arguments.get("action"),
|
|
266
|
+
arguments.get("search"),
|
|
267
|
+
bool(arguments.get("full", False))), False
|
|
268
|
+
if name == "run_tool":
|
|
269
|
+
return _run("tool", arguments, confirmed=False)
|
|
270
|
+
if name == "run_tool_confirmed":
|
|
271
|
+
return _run("tool", arguments, confirmed=True)
|
|
272
|
+
if name == "run_agent":
|
|
273
|
+
return _run("agent", arguments, confirmed=False)
|
|
274
|
+
if name == "run_agent_confirmed":
|
|
275
|
+
return _run("agent", arguments, confirmed=True)
|
|
276
|
+
if name == "get_skill":
|
|
277
|
+
if not arguments.get("name"):
|
|
278
|
+
return {"error": "get_skill requires 'name'"}, True
|
|
279
|
+
if "resource" in arguments:
|
|
280
|
+
return bridge.get_skill_resource(arguments["name"], arguments["resource"]), False
|
|
281
|
+
return bridge.get_skill(arguments["name"]), False
|
|
282
|
+
return {"error": f"unknown tool: {name}"}, True
|
|
283
|
+
except KeyError as e:
|
|
284
|
+
return {"error": str(e)}, True
|
|
285
|
+
except Exception as e: # noqa: BLE001 - surface as a readable tool error
|
|
286
|
+
return {"error": f"{type(e).__name__}: {e}"}, True
|
|
287
|
+
|
|
288
|
+
|
|
289
|
+
def handle(req: dict, *, modern: bool = True) -> dict | None:
|
|
290
|
+
"""Dispatch one JSON-RPC request. Returns a response dict, or None for a
|
|
291
|
+
notification (no response).
|
|
292
|
+
|
|
293
|
+
The protocol mechanics - version negotiation and the 2026-07-28 era - live in
|
|
294
|
+
protocol.py, shared with the chat surface; this server supplies only its tools and its
|
|
295
|
+
dispatcher. ``modern=False`` is for the HTTP transport, which serves the legacy era only."""
|
|
296
|
+
return protocol.handle(req, tools=TOOLS, call_tool=_call_tool,
|
|
297
|
+
server_info=SERVER_INFO, modern=modern)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def main() -> None:
|
|
301
|
+
_log("started (stdio). Waiting for JSON-RPC on stdin.")
|
|
302
|
+
protocol.serve_stdio(handle, _log)
|
|
303
|
+
|
|
304
|
+
|
|
305
|
+
if __name__ == "__main__":
|
|
306
|
+
main()
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import sys
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
|
|
4
|
+
# Make the aat_mcp package modules (bridge, server) importable under pytest's
|
|
5
|
+
# importlib mode without turning aat_mcp into an installed package.
|
|
6
|
+
_AAT_MCP = Path(__file__).resolve().parents[1]
|
|
7
|
+
if str(_AAT_MCP) not in sys.path:
|
|
8
|
+
sys.path.insert(0, str(_AAT_MCP))
|