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,24 @@
|
|
|
1
|
+
"""ActionDef - dispatchable action unit for the connector-builder tool.
|
|
2
|
+
|
|
3
|
+
Mirrors the redmine/quickmail-web pattern. Actions that talk to the API receive
|
|
4
|
+
a live ``client`` first (so tests inject a fake and run with no network);
|
|
5
|
+
``needs_client`` decides that. Pure/local actions (none today, but kept for
|
|
6
|
+
parity) leave it False and receive only 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
|
+
needs_client: bool = True
|
|
24
|
+
description: str = ""
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"""HTTP client for the AI Connector Builder API (connector-builder.procesio.app).
|
|
2
|
+
|
|
3
|
+
Both supported auth modes resolve to the SAME wire shape: an
|
|
4
|
+
``Authorization: Bearer <token>`` header (verified against the backend's
|
|
5
|
+
``app/core/permissions.py`` — an API key is just a bearer token that starts with
|
|
6
|
+
``acb_``). So the client only ever sets one header; how the token is obtained is
|
|
7
|
+
the only difference between the two modes:
|
|
8
|
+
|
|
9
|
+
1. **API key** (default, simplest): the ``acb_...`` key, stored under
|
|
10
|
+
``agents-and-tools:connector-builder:api-key``. Used verbatim as the bearer.
|
|
11
|
+
2. **Username / password**: ``username`` + ``password`` secrets → ``POST
|
|
12
|
+
/auth/login`` → ``access_token`` (a JWT) → used as the bearer. This is the
|
|
13
|
+
"web-tool" login the user referred to, done over the REST API instead of a
|
|
14
|
+
browser (the app exposes the same backend at ``/api/*``).
|
|
15
|
+
|
|
16
|
+
Selection order (override with env ``CONNECTOR_BUILDER_AUTH=apikey|userpass``):
|
|
17
|
+
api-key if stored, else username+password. Base URL defaults to the production
|
|
18
|
+
host and is overridable via env ``CONNECTOR_BUILDER_BASE_URL``.
|
|
19
|
+
|
|
20
|
+
See CONNECTOR-BUILDER-API-NOTES.md for the wire details.
|
|
21
|
+
"""
|
|
22
|
+
from __future__ import annotations
|
|
23
|
+
|
|
24
|
+
import os
|
|
25
|
+
import time
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Any, Optional
|
|
28
|
+
|
|
29
|
+
import requests
|
|
30
|
+
|
|
31
|
+
from errors import ApiError, CredentialError
|
|
32
|
+
|
|
33
|
+
# A build is "done for now" when it pauses for the user or reaches a terminal
|
|
34
|
+
# state. The sync LLM stages (gather/answer/revise-plan) 504 at the proxy but
|
|
35
|
+
# keep running server-side, so --wait polls get-build until one of these holds.
|
|
36
|
+
TERMINAL_STATUSES = {"completed", "failed", "delivered", "succeeded", "cancelled"}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def build_is_settled(build: dict, until: str = "settled") -> bool:
|
|
40
|
+
"""until='terminal' → only completed/failed/... ; 'settled' → also a
|
|
41
|
+
waiting_user pause (a stage finished and is waiting for the next action)."""
|
|
42
|
+
status = (build.get("status") or "").lower()
|
|
43
|
+
step = (build.get("step_status") or "").lower()
|
|
44
|
+
if status in TERMINAL_STATUSES:
|
|
45
|
+
return True
|
|
46
|
+
if until == "settled" and step == "waiting_user":
|
|
47
|
+
return True
|
|
48
|
+
return False
|
|
49
|
+
|
|
50
|
+
TOOL = "connector-builder"
|
|
51
|
+
|
|
52
|
+
# Production: Caddy strips the /api/* prefix and forwards to the backend, so the
|
|
53
|
+
# REST surface documented in documentation/03-API-REFERENCE.md lives under /api.
|
|
54
|
+
DEFAULT_BASE_URL = "https://connector-builder.procesio.app/api"
|
|
55
|
+
|
|
56
|
+
TIMEOUT_CONNECT = 10
|
|
57
|
+
TIMEOUT_READ = 180 # pipeline gather/plan calls can be slow; downloads stream
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def get_base_url() -> str:
|
|
61
|
+
return os.environ.get("CONNECTOR_BUILDER_BASE_URL", DEFAULT_BASE_URL).rstrip("/")
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _cred(name: str) -> Optional[str]:
|
|
65
|
+
# Env override first (handy for CI / tests), then Credential Manager.
|
|
66
|
+
env = os.environ.get(f"CONNECTOR_BUILDER_{name.upper().replace('-', '_')}")
|
|
67
|
+
if env:
|
|
68
|
+
return env
|
|
69
|
+
import sys
|
|
70
|
+
framework_root = Path(__file__).resolve().parents[2]
|
|
71
|
+
if str(framework_root) not in sys.path:
|
|
72
|
+
sys.path.insert(0, str(framework_root))
|
|
73
|
+
from tools._lib import creds
|
|
74
|
+
return creds.get_optional(TOOL, name)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def resolve_token() -> str:
|
|
78
|
+
"""Resolve the bearer token per the configured/derived auth mode."""
|
|
79
|
+
mode = os.environ.get("CONNECTOR_BUILDER_AUTH", "").strip().lower()
|
|
80
|
+
api_key = _cred("api-key")
|
|
81
|
+
username = _cred("username")
|
|
82
|
+
password = _cred("password")
|
|
83
|
+
|
|
84
|
+
if not mode:
|
|
85
|
+
mode = "apikey" if api_key else ("userpass" if username and password else "")
|
|
86
|
+
|
|
87
|
+
if mode == "apikey":
|
|
88
|
+
if not api_key:
|
|
89
|
+
raise CredentialError(
|
|
90
|
+
"auth mode 'apikey' but no api-key stored. Store it with:\n"
|
|
91
|
+
" python scripts/set-credential.py connector-builder api-key")
|
|
92
|
+
return api_key
|
|
93
|
+
if mode == "userpass":
|
|
94
|
+
if not (username and password):
|
|
95
|
+
raise CredentialError(
|
|
96
|
+
"auth mode 'userpass' but username/password not both stored. Set:\n"
|
|
97
|
+
" python scripts/set-credential.py connector-builder username\n"
|
|
98
|
+
" python scripts/set-credential.py connector-builder password")
|
|
99
|
+
return login(username, password)
|
|
100
|
+
raise CredentialError(
|
|
101
|
+
"no connector-builder credential found. Store an API key:\n"
|
|
102
|
+
" python scripts/set-credential.py connector-builder api-key\n"
|
|
103
|
+
"or a username + password:\n"
|
|
104
|
+
" python scripts/set-credential.py connector-builder username\n"
|
|
105
|
+
" python scripts/set-credential.py connector-builder password")
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def login(username: str, password: str, base_url: Optional[str] = None) -> str:
|
|
109
|
+
"""POST /auth/login → access_token (JWT). Used by the userpass auth mode."""
|
|
110
|
+
base = (base_url or get_base_url()).rstrip("/")
|
|
111
|
+
r = requests.post(
|
|
112
|
+
f"{base}/auth/login",
|
|
113
|
+
json={"email": username, "password": password},
|
|
114
|
+
timeout=(TIMEOUT_CONNECT, TIMEOUT_READ),
|
|
115
|
+
)
|
|
116
|
+
if r.status_code >= 400:
|
|
117
|
+
raise ApiError(r.status_code, "/auth/login", _detail(r))
|
|
118
|
+
tok = r.json().get("access_token")
|
|
119
|
+
if not tok:
|
|
120
|
+
raise ApiError(r.status_code, "/auth/login", "login returned no access_token")
|
|
121
|
+
return tok
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _detail(resp: "requests.Response") -> str:
|
|
125
|
+
try:
|
|
126
|
+
body = resp.json()
|
|
127
|
+
if isinstance(body, dict):
|
|
128
|
+
return str(body.get("detail") or body.get("message") or body)
|
|
129
|
+
return str(body)
|
|
130
|
+
except ValueError:
|
|
131
|
+
return (resp.text or "")[:500]
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
class ConnectorBuilderClient:
|
|
135
|
+
"""Thin REST wrapper. One method per HTTP verb, plus multipart + binary
|
|
136
|
+
download. Every response is JSON except the binary download helpers."""
|
|
137
|
+
|
|
138
|
+
def __init__(self, base_url: Optional[str] = None, token: Optional[str] = None,
|
|
139
|
+
session: Any = None):
|
|
140
|
+
self.base_url = (base_url or get_base_url()).rstrip("/")
|
|
141
|
+
self._token = token # lazily resolved on first use if None
|
|
142
|
+
self._s = session or requests.Session()
|
|
143
|
+
|
|
144
|
+
# -- auth ---------------------------------------------------------------
|
|
145
|
+
@property
|
|
146
|
+
def token(self) -> str:
|
|
147
|
+
if self._token is None:
|
|
148
|
+
self._token = resolve_token()
|
|
149
|
+
return self._token
|
|
150
|
+
|
|
151
|
+
def _headers(self, extra: Optional[dict] = None) -> dict:
|
|
152
|
+
h = {
|
|
153
|
+
"Authorization": f"Bearer {self.token}",
|
|
154
|
+
"Accept": "application/json",
|
|
155
|
+
"User-Agent": "agents-and-tools-connector-builder/0.1",
|
|
156
|
+
}
|
|
157
|
+
if extra:
|
|
158
|
+
h.update(extra)
|
|
159
|
+
return h
|
|
160
|
+
|
|
161
|
+
def _url(self, path: str) -> str:
|
|
162
|
+
return f"{self.base_url}/{path.lstrip('/')}"
|
|
163
|
+
|
|
164
|
+
# -- verbs --------------------------------------------------------------
|
|
165
|
+
def request(self, method: str, path: str, *, params: Optional[dict] = None,
|
|
166
|
+
json_body: Any = None) -> Any:
|
|
167
|
+
r = self._s.request(
|
|
168
|
+
method.upper(), self._url(path),
|
|
169
|
+
params=params, json=json_body,
|
|
170
|
+
headers=self._headers(),
|
|
171
|
+
timeout=(TIMEOUT_CONNECT, TIMEOUT_READ),
|
|
172
|
+
)
|
|
173
|
+
if r.status_code >= 400:
|
|
174
|
+
raise ApiError(r.status_code, path, _detail(r))
|
|
175
|
+
if r.status_code == 204 or not (r.content or b"").strip():
|
|
176
|
+
return {}
|
|
177
|
+
try:
|
|
178
|
+
return r.json()
|
|
179
|
+
except ValueError:
|
|
180
|
+
return {"raw": r.text}
|
|
181
|
+
|
|
182
|
+
def get(self, path: str, params: Optional[dict] = None) -> Any:
|
|
183
|
+
return self.request("GET", path, params=params)
|
|
184
|
+
|
|
185
|
+
def post(self, path: str, json_body: Any = None, params: Optional[dict] = None) -> Any:
|
|
186
|
+
return self.request("POST", path, params=params, json_body=json_body)
|
|
187
|
+
|
|
188
|
+
def put(self, path: str, json_body: Any = None) -> Any:
|
|
189
|
+
return self.request("PUT", path, json_body=json_body)
|
|
190
|
+
|
|
191
|
+
def patch(self, path: str, json_body: Any = None) -> Any:
|
|
192
|
+
return self.request("PATCH", path, json_body=json_body)
|
|
193
|
+
|
|
194
|
+
def delete(self, path: str, params: Optional[dict] = None) -> Any:
|
|
195
|
+
return self.request("DELETE", path, params=params)
|
|
196
|
+
|
|
197
|
+
# -- polling ------------------------------------------------------------
|
|
198
|
+
def get_build(self, build_id: str) -> dict:
|
|
199
|
+
return self.get(f"/builds/{build_id}")
|
|
200
|
+
|
|
201
|
+
def wait_for_settled(self, build_id: str, *, timeout: int = 600,
|
|
202
|
+
interval: int = 8, until: str = "settled",
|
|
203
|
+
baseline_updated_at: Optional[str] = None,
|
|
204
|
+
sleep=time.sleep, clock=time.monotonic) -> dict:
|
|
205
|
+
"""Poll get-build until the build is settled (per `until`) AND — when a
|
|
206
|
+
baseline is given — its updated_at has advanced past it (so we never
|
|
207
|
+
return the pre-trigger state on a fast poll). Returns the last build seen
|
|
208
|
+
even if the timeout is hit (caller checks build_is_settled)."""
|
|
209
|
+
deadline = clock() + max(0, timeout)
|
|
210
|
+
build = self.get_build(build_id)
|
|
211
|
+
while True:
|
|
212
|
+
advanced = baseline_updated_at is None or \
|
|
213
|
+
build.get("updated_at") != baseline_updated_at
|
|
214
|
+
if advanced and build_is_settled(build, until):
|
|
215
|
+
return build
|
|
216
|
+
if clock() >= deadline:
|
|
217
|
+
return build
|
|
218
|
+
sleep(interval)
|
|
219
|
+
build = self.get_build(build_id)
|
|
220
|
+
|
|
221
|
+
# -- binary download ----------------------------------------------------
|
|
222
|
+
def download(self, path: str, out_path: str, params: Optional[dict] = None) -> dict:
|
|
223
|
+
"""Stream a binary endpoint (artifact / file download / zip) to disk.
|
|
224
|
+
Returns {out, bytes, filename, content_type}."""
|
|
225
|
+
r = self._s.get(
|
|
226
|
+
self._url(path), params=params, headers=self._headers(),
|
|
227
|
+
timeout=(TIMEOUT_CONNECT, TIMEOUT_READ), stream=True,
|
|
228
|
+
)
|
|
229
|
+
if r.status_code >= 400:
|
|
230
|
+
raise ApiError(r.status_code, path, _detail(r))
|
|
231
|
+
out = Path(out_path)
|
|
232
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
233
|
+
total = 0
|
|
234
|
+
with open(out, "wb") as f:
|
|
235
|
+
for chunk in r.iter_content(chunk_size=65536):
|
|
236
|
+
if chunk:
|
|
237
|
+
f.write(chunk)
|
|
238
|
+
total += len(chunk)
|
|
239
|
+
return {
|
|
240
|
+
"out": str(out),
|
|
241
|
+
"bytes": total,
|
|
242
|
+
"filename": _content_disposition_filename(r) or out.name,
|
|
243
|
+
"content_type": r.headers.get("Content-Type"),
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
def _content_disposition_filename(resp: "requests.Response") -> Optional[str]:
|
|
248
|
+
cd = resp.headers.get("Content-Disposition", "")
|
|
249
|
+
if "filename=" in cd:
|
|
250
|
+
return cd.split("filename=", 1)[1].strip().strip('"').split(";", 1)[0]
|
|
251
|
+
return None
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"""Map exceptions to the framework error envelope: (code, message, details, exit).
|
|
2
|
+
|
|
3
|
+
JSON in / JSON out: every uncaught exception becomes an {"error": {...}} object.
|
|
4
|
+
We classify by exception type so an auth failure, a bad argument, and an HTTP
|
|
5
|
+
4xx/5xx each surface with a distinct, stable code.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class UsageError(Exception):
|
|
13
|
+
"""Bad/invalid arguments. Maps to 'invalid_argument', exit 2."""
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CredentialError(Exception):
|
|
17
|
+
"""No usable credential (neither api-key nor username+password stored).
|
|
18
|
+
Maps to 'auth_required', exit 1."""
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
class ApiError(Exception):
|
|
22
|
+
"""A non-2xx HTTP response from the connector-builder API.
|
|
23
|
+
Maps to 'api_error', exit 1. Carries status + the server's detail."""
|
|
24
|
+
|
|
25
|
+
def __init__(self, status_code: int, path: str, detail: str = "",
|
|
26
|
+
details: dict[str, Any] | None = None):
|
|
27
|
+
self.status_code = status_code
|
|
28
|
+
self.path = path
|
|
29
|
+
self.detail = (detail or "")[:500]
|
|
30
|
+
self.details = details or {}
|
|
31
|
+
self.details.setdefault("status_code", status_code)
|
|
32
|
+
self.details.setdefault("path", path)
|
|
33
|
+
super().__init__(f"{status_code} on {path}: {self.detail}")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def classify(exc: Exception) -> tuple[str, str, dict, int]:
|
|
37
|
+
if isinstance(exc, UsageError):
|
|
38
|
+
return "invalid_argument", str(exc) or "invalid argument", {}, 2
|
|
39
|
+
if isinstance(exc, CredentialError):
|
|
40
|
+
return "auth_required", str(exc), {}, 1
|
|
41
|
+
if isinstance(exc, ApiError):
|
|
42
|
+
code = "auth_failed" if exc.status_code in (401, 403) else "api_error"
|
|
43
|
+
return code, str(exc), exc.details, 1
|
|
44
|
+
return "error", str(exc) or exc.__class__.__name__, {"type": type(exc).__name__}, 1
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""Generate tool.yaml from the live ACTIONS dict (single source of truth).
|
|
2
|
+
|
|
3
|
+
Introspects each action's argparse to emit the manifest's actions/args, so the
|
|
4
|
+
manifest can never drift from the dispatcher (the manifest-sync test enforces the
|
|
5
|
+
same invariant). Run after adding/changing an action:
|
|
6
|
+
|
|
7
|
+
.venv/Scripts/python tools/connector-builder/gen_manifest.py
|
|
8
|
+
|
|
9
|
+
Header metadata (name/description/secrets/routing) is curated here.
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import sys
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import yaml
|
|
18
|
+
|
|
19
|
+
TOOL_ROOT = Path(__file__).resolve().parent
|
|
20
|
+
FRAMEWORK_ROOT = TOOL_ROOT.parents[1]
|
|
21
|
+
for _p in (str(TOOL_ROOT), str(FRAMEWORK_ROOT)):
|
|
22
|
+
if _p not in sys.path:
|
|
23
|
+
sys.path.insert(0, _p)
|
|
24
|
+
|
|
25
|
+
import main # noqa: E402
|
|
26
|
+
|
|
27
|
+
DESCRIPTION = (
|
|
28
|
+
"AI Connector Builder (connector-builder.procesio.app): turn API documentation "
|
|
29
|
+
"into a compiled PROCESIO Custom Action .nupkg connector via an 8-stage LLM "
|
|
30
|
+
"pipeline (gather -> clarify -> plan -> generate -> validate -> compile -> fix "
|
|
31
|
+
"-> deliver). Drive the whole build lifecycle, read/write generated files, "
|
|
32
|
+
"download the .nupkg artifact (to upload to PROCESIO for live testing), inspect "
|
|
33
|
+
"logs/telemetry, and edit the builder's own knowledge base (prompts, spec "
|
|
34
|
+
"modules, examples, validation rules). Two auth modes, both -> Bearer token: an "
|
|
35
|
+
"acb_ API key, or username/password via /auth/login."
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
SECRETS = [
|
|
39
|
+
{"name": "api-key",
|
|
40
|
+
"description": "Connector Builder API key (acb_...). Used verbatim as the bearer token."},
|
|
41
|
+
{"name": "username",
|
|
42
|
+
"description": "Login email for username/password auth mode (e.g. user@example.com)."},
|
|
43
|
+
{"name": "password",
|
|
44
|
+
"description": "Login password for username/password auth mode (-> POST /auth/login -> JWT)."},
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
ROUTING = {
|
|
48
|
+
"triggers": [
|
|
49
|
+
"build a PROCESIO custom action / connector from API docs",
|
|
50
|
+
"generate a .nupkg connector for PROCESIO from documentation",
|
|
51
|
+
"create / run / drive an AI Connector Builder build",
|
|
52
|
+
"approve / revise the plan / regenerate files / download the connector artifact",
|
|
53
|
+
"edit the connector builder's prompts / spec modules / examples (improve generation)",
|
|
54
|
+
],
|
|
55
|
+
"primary_action": "create-build",
|
|
56
|
+
"example": ("connector-builder create-build --api-url <docs-url> --user-requirements '...' "
|
|
57
|
+
"(then gather / answer / approve-plan / approve-generate / download-artifact)"),
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
# Per-action one-line output hints (optional; advisory only).
|
|
61
|
+
OUTPUT_SCHEMAS = {
|
|
62
|
+
"check": '{ "ok": true, "email": "...", "role": "admin", "base_url": "..." }',
|
|
63
|
+
"create-build": '{ "id": "uuid", "status": "pending", ... }',
|
|
64
|
+
"gather": '{ "status": "clarifying", "api_profile": {...}, "clarification_questions": [...] }',
|
|
65
|
+
"answer": '{ "status": "planning", "implementation_plan": {...} }',
|
|
66
|
+
"approve-plan": '{ "status": "generating", "step_status": "waiting_user", "generated_files": {...} }',
|
|
67
|
+
"approve-generate": '{ "status": "approved", "build_id": "uuid" }',
|
|
68
|
+
"download-artifact": '{ "out": "...", "bytes": N, "filename": "..._PROCESIO.API.nupkg" }',
|
|
69
|
+
"list-builds": '{ "builds": [...], "total": N, "page": 1, "per_page": 20 }',
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
# argparse type object -> manifest type string.
|
|
73
|
+
_TYPE_MAP = {int: "integer", float: "number"}
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _arg_type(action: argparse.Action) -> str:
|
|
77
|
+
if isinstance(action, (argparse._StoreTrueAction, argparse._StoreFalseAction)):
|
|
78
|
+
return "boolean"
|
|
79
|
+
t = getattr(action, "type", None)
|
|
80
|
+
if t in _TYPE_MAP:
|
|
81
|
+
return _TYPE_MAP[t]
|
|
82
|
+
# The --success / boolean-lambda flags parse to bool.
|
|
83
|
+
if callable(t) and getattr(t, "__name__", "") == "<lambda>":
|
|
84
|
+
return "boolean"
|
|
85
|
+
return "string"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _args_for(defn) -> list[dict]:
|
|
89
|
+
parser = argparse.ArgumentParser()
|
|
90
|
+
defn.add_args(parser)
|
|
91
|
+
out: list[dict] = []
|
|
92
|
+
for action in parser._actions:
|
|
93
|
+
opts = [o for o in action.option_strings if o.startswith("--") and o != "--help"]
|
|
94
|
+
if not opts:
|
|
95
|
+
continue
|
|
96
|
+
name = opts[0][2:]
|
|
97
|
+
entry: dict = {"name": name, "type": _arg_type(action)}
|
|
98
|
+
if getattr(action, "required", False):
|
|
99
|
+
entry["required"] = True
|
|
100
|
+
if action.help:
|
|
101
|
+
entry["description"] = action.help
|
|
102
|
+
out.append(entry)
|
|
103
|
+
return out
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def build_manifest() -> dict:
|
|
107
|
+
actions = []
|
|
108
|
+
for name in sorted(main.ACTIONS):
|
|
109
|
+
defn = main.ACTIONS[name]
|
|
110
|
+
entry: dict = {"name": name, "description": defn.description}
|
|
111
|
+
args = _args_for(defn)
|
|
112
|
+
if args:
|
|
113
|
+
entry["args"] = args
|
|
114
|
+
if name in OUTPUT_SCHEMAS:
|
|
115
|
+
entry["output_schema"] = OUTPUT_SCHEMAS[name]
|
|
116
|
+
actions.append(entry)
|
|
117
|
+
return {
|
|
118
|
+
"name": "connector-builder",
|
|
119
|
+
"description": DESCRIPTION,
|
|
120
|
+
"version": "0.2.0",
|
|
121
|
+
"runtime": "python",
|
|
122
|
+
"entrypoint": "main.py",
|
|
123
|
+
"secrets": SECRETS,
|
|
124
|
+
"routing": ROUTING,
|
|
125
|
+
"actions": actions,
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def main_gen() -> None:
|
|
130
|
+
manifest = build_manifest()
|
|
131
|
+
text = yaml.safe_dump(manifest, sort_keys=False, allow_unicode=True, width=100)
|
|
132
|
+
out = TOOL_ROOT / "tool.yaml"
|
|
133
|
+
header = ("# GENERATED by gen_manifest.py from the live ACTIONS dict — do not\n"
|
|
134
|
+
"# hand-edit actions/args; edit the handlers + header consts and rerun:\n"
|
|
135
|
+
"# .venv/Scripts/python tools/connector-builder/gen_manifest.py\n")
|
|
136
|
+
out.write_text(header + text, encoding="utf-8")
|
|
137
|
+
print(f"wrote {out} ({len(text)} bytes, {len(manifest['actions'])} actions)",
|
|
138
|
+
file=sys.stderr)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
if __name__ == "__main__":
|
|
142
|
+
main_gen()
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"""connector-builder action handlers (imported by BARE name from main.py)."""
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""Admin actions (admin role): pipeline/provider/compilation config, the
|
|
2
|
+
knowledge base (prompts, spec_modules, examples, validation_rules, clarification),
|
|
3
|
+
the compiler self-test, users, and issue cases.
|
|
4
|
+
|
|
5
|
+
The knowledge actions are how you improve the BUILDER ITSELF — editing the prompt
|
|
6
|
+
templates, connector spec modules, and few-shot examples changes how every future
|
|
7
|
+
build generates code. That is the deepest feedback loop after a PROCESIO test.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
|
|
13
|
+
from actiondef import ActionDef
|
|
14
|
+
from errors import UsageError
|
|
15
|
+
from handlers.common import add_pagination, load_text_or_file, parse_json
|
|
16
|
+
|
|
17
|
+
_CONFIG_KINDS = ("pipeline", "providers", "compilation", "maintenance")
|
|
18
|
+
_MODULE_TYPES = ("prompt", "spec_module", "example", "validation_rule", "clarification")
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
# -- config ------------------------------------------------------------------
|
|
22
|
+
|
|
23
|
+
def get_config(client, args) -> dict:
|
|
24
|
+
if args.which not in _CONFIG_KINDS:
|
|
25
|
+
raise UsageError(f"--which must be one of {', '.join(_CONFIG_KINDS)}")
|
|
26
|
+
suffix = "/config/maintenance" if args.which == "maintenance" else f"/config/{args.which}"
|
|
27
|
+
return client.get(f"/admin{suffix}")
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def update_config(client, args) -> dict:
|
|
31
|
+
if args.which not in _CONFIG_KINDS:
|
|
32
|
+
raise UsageError(f"--which must be one of {', '.join(_CONFIG_KINDS)}")
|
|
33
|
+
raw = load_text_or_file(args.data, args.data_file, what="data")
|
|
34
|
+
if raw is None:
|
|
35
|
+
raise UsageError("provide --data (JSON) or --data-file")
|
|
36
|
+
body = parse_json(raw, what="data", expect=dict)
|
|
37
|
+
suffix = "/config/maintenance" if args.which == "maintenance" else f"/config/{args.which}"
|
|
38
|
+
return client.put(f"/admin{suffix}", body)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def reload_config(client, args) -> dict:
|
|
42
|
+
return client.post("/admin/config/reload")
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# -- knowledge ---------------------------------------------------------------
|
|
46
|
+
|
|
47
|
+
def knowledge_list(client, args) -> dict:
|
|
48
|
+
_check_module_type(args.module_type)
|
|
49
|
+
return {"module_type": args.module_type,
|
|
50
|
+
"modules": client.get(f"/admin/knowledge/{args.module_type}")}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def knowledge_get(client, args) -> dict:
|
|
54
|
+
_check_module_type(args.module_type)
|
|
55
|
+
return client.get(f"/admin/knowledge/{args.module_type}/{args.name}")
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
def knowledge_create(client, args) -> dict:
|
|
59
|
+
_check_module_type(args.module_type)
|
|
60
|
+
content = load_text_or_file(args.content, args.content_file, what="content")
|
|
61
|
+
if content is None:
|
|
62
|
+
raise UsageError("provide --content or --content-file")
|
|
63
|
+
return client.post(f"/admin/knowledge/{args.module_type}",
|
|
64
|
+
{"name": args.name, "content": content})
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def knowledge_update(client, args) -> dict:
|
|
68
|
+
_check_module_type(args.module_type)
|
|
69
|
+
content = load_text_or_file(args.content, args.content_file, what="content")
|
|
70
|
+
if content is None:
|
|
71
|
+
raise UsageError("provide --content or --content-file")
|
|
72
|
+
return client.put(f"/admin/knowledge/{args.module_type}/{args.name}",
|
|
73
|
+
{"content": content})
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def knowledge_delete(client, args) -> dict:
|
|
77
|
+
_check_module_type(args.module_type)
|
|
78
|
+
return client.delete(f"/admin/knowledge/{args.module_type}/{args.name}")
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def _check_module_type(mt: str) -> None:
|
|
82
|
+
if mt not in _MODULE_TYPES:
|
|
83
|
+
raise UsageError(f"--module-type must be one of {', '.join(_MODULE_TYPES)}")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
# -- selftest / users / issues ----------------------------------------------
|
|
87
|
+
|
|
88
|
+
def build_selftest(client, args) -> dict:
|
|
89
|
+
"""POST /admin/build-selftest — end-to-end compiler health (trivial 2-file C#)."""
|
|
90
|
+
return client.post("/admin/build-selftest")
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def list_users(client, args) -> dict:
|
|
94
|
+
return {"users": client.get("/admin/users")}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def list_issues(client, args) -> dict:
|
|
98
|
+
params = {"page": args.page, "per_page": args.per_page}
|
|
99
|
+
for f in ("stage", "severity", "status", "build_id", "error_category", "search"):
|
|
100
|
+
v = getattr(args, f)
|
|
101
|
+
if v:
|
|
102
|
+
params[f] = v
|
|
103
|
+
return client.get("/admin/issues", params)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def get_issue(client, args) -> dict:
|
|
107
|
+
return client.get(f"/admin/issues/{args.id}")
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# -- argparse ----------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
def _get_config_args(p: argparse.ArgumentParser) -> None:
|
|
113
|
+
p.add_argument("--which", required=True,
|
|
114
|
+
help="pipeline | providers | compilation | maintenance")
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _update_config_args(p: argparse.ArgumentParser) -> None:
|
|
118
|
+
p.add_argument("--which", required=True,
|
|
119
|
+
help="pipeline | providers | compilation | maintenance")
|
|
120
|
+
p.add_argument("--data", help="Config payload as JSON (inline)")
|
|
121
|
+
p.add_argument("--data-file", dest="data_file", help="Read JSON payload from path")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _knowledge_list_args(p: argparse.ArgumentParser) -> None:
|
|
125
|
+
p.add_argument("--module-type", dest="module_type", required=True,
|
|
126
|
+
help=f"one of {', '.join(_MODULE_TYPES)}")
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def _knowledge_get_args(p: argparse.ArgumentParser) -> None:
|
|
130
|
+
p.add_argument("--module-type", dest="module_type", required=True,
|
|
131
|
+
help=f"one of {', '.join(_MODULE_TYPES)}")
|
|
132
|
+
p.add_argument("--name", required=True, help="Module name, e.g. clarify.md")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _knowledge_write_args(p: argparse.ArgumentParser) -> None:
|
|
136
|
+
p.add_argument("--module-type", dest="module_type", required=True,
|
|
137
|
+
help=f"one of {', '.join(_MODULE_TYPES)}")
|
|
138
|
+
p.add_argument("--name", required=True, help="Module name, e.g. clarify.md")
|
|
139
|
+
p.add_argument("--content", help="Module content (inline)")
|
|
140
|
+
p.add_argument("--content-file", dest="content_file",
|
|
141
|
+
help="Read module content from path")
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _list_issues_args(p: argparse.ArgumentParser) -> None:
|
|
145
|
+
add_pagination(p)
|
|
146
|
+
p.add_argument("--stage", help="Pipeline stage filter")
|
|
147
|
+
p.add_argument("--severity", help="Severity filter")
|
|
148
|
+
p.add_argument("--status", help="Status filter")
|
|
149
|
+
p.add_argument("--build-id", dest="build_id", help="Filter by build")
|
|
150
|
+
p.add_argument("--error-category", dest="error_category", help="Error category filter")
|
|
151
|
+
p.add_argument("--search", help="Free-text search")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
def _get_issue_args(p: argparse.ArgumentParser) -> None:
|
|
155
|
+
p.add_argument("--id", required=True, help="Issue case id")
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
ACTIONS: dict[str, ActionDef] = {
|
|
159
|
+
"get-config": ActionDef(get_config, _get_config_args,
|
|
160
|
+
description="Read a config block (pipeline/providers/...)."),
|
|
161
|
+
"update-config": ActionDef(update_config, _update_config_args,
|
|
162
|
+
description="Update a config block from JSON."),
|
|
163
|
+
"reload-config": ActionDef(reload_config,
|
|
164
|
+
description="Reload all YAML config + knowledge cache."),
|
|
165
|
+
"knowledge-list": ActionDef(knowledge_list, _knowledge_list_args,
|
|
166
|
+
description="List knowledge modules of a type."),
|
|
167
|
+
"knowledge-get": ActionDef(knowledge_get, _knowledge_get_args,
|
|
168
|
+
description="Get one knowledge module's content."),
|
|
169
|
+
"knowledge-create": ActionDef(knowledge_create, _knowledge_write_args,
|
|
170
|
+
description="Create a new knowledge module."),
|
|
171
|
+
"knowledge-update": ActionDef(knowledge_update, _knowledge_write_args,
|
|
172
|
+
description="Update an existing knowledge module."),
|
|
173
|
+
"knowledge-delete": ActionDef(knowledge_delete, _knowledge_get_args,
|
|
174
|
+
description="Delete a knowledge module."),
|
|
175
|
+
"build-selftest": ActionDef(build_selftest,
|
|
176
|
+
description="Compiler health self-test (trivial C#)."),
|
|
177
|
+
"list-users": ActionDef(list_users, description="List all users (admin)."),
|
|
178
|
+
"list-issues": ActionDef(list_issues, _list_issues_args,
|
|
179
|
+
description="List issue cases (failures), filterable."),
|
|
180
|
+
"get-issue": ActionDef(get_issue, _get_issue_args,
|
|
181
|
+
description="Full issue-case detail incl. snapshots."),
|
|
182
|
+
}
|