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,193 @@
|
|
|
1
|
+
"""Request-reliability primitives for the PROCESIO client.
|
|
2
|
+
|
|
3
|
+
Encodes, in one place, the empirical rules learned driving the live Web API (see
|
|
4
|
+
PROCESIO-API-NOTES.md "Empirical reliability profile" and the `procesio` agent's
|
|
5
|
+
`guidance --topic reliability`):
|
|
6
|
+
|
|
7
|
+
* **The client had no TOTAL deadline.** `requests`' scalar timeout is a *per-read
|
|
8
|
+
inactivity* guard, not a wall-clock ceiling: a connection that is accepted and
|
|
9
|
+
then dribbles bytes (or where the server holds it open) never trips it, so a
|
|
10
|
+
stalled call runs until the process is killed. `run_with_deadline` adds a real
|
|
11
|
+
total deadline on a daemon thread so a stall SURFACES as a structured error.
|
|
12
|
+
* **Retries are safe for GET only.** Re-POSTing an execution double-runs a
|
|
13
|
+
process with real side effects; a timed-out PUT may already have applied. So the
|
|
14
|
+
retry policy is GET-only, on transient statuses + network errors.
|
|
15
|
+
|
|
16
|
+
Everything here is stdlib-only (no new dependency) and provider-neutral.
|
|
17
|
+
"""
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import os
|
|
21
|
+
import random
|
|
22
|
+
import threading
|
|
23
|
+
|
|
24
|
+
# -- knobs ------------------------------------------------------------------
|
|
25
|
+
|
|
26
|
+
# Per-read (inactivity) timeout handed to `requests` — a socket that sends no
|
|
27
|
+
# bytes for this long trips requests' own timeout. Kept as defense-in-depth
|
|
28
|
+
# UNDER the total deadline below.
|
|
29
|
+
READ_TIMEOUT = 60
|
|
30
|
+
|
|
31
|
+
# Total wall-clock deadlines, by endpoint class. A definition read (~120-420KB
|
|
32
|
+
# GET) should never legitimately take this long; a definition write (PUT) is
|
|
33
|
+
# given more headroom. run-process is EXEMPT (deadline=None) — a synchronous run
|
|
34
|
+
# of a many-action process legitimately takes minutes.
|
|
35
|
+
READ_DEADLINE = 90.0
|
|
36
|
+
WRITE_DEADLINE = 180.0
|
|
37
|
+
|
|
38
|
+
# GET-only retry policy. 500 is deliberately EXCLUDED (may be a deterministic
|
|
39
|
+
# server error, not transient). 429 is honoured via Retry-After when present.
|
|
40
|
+
RETRYABLE_STATUSES = frozenset({429, 502, 503, 504})
|
|
41
|
+
MAX_RETRIES = 2
|
|
42
|
+
BACKOFF_BASE = 0.5 # seconds
|
|
43
|
+
BACKOFF_CAP = 8.0 # seconds
|
|
44
|
+
|
|
45
|
+
ENV_NO_DEADLINE = "AAT_PROCESIO_NO_DEADLINE"
|
|
46
|
+
ENV_NO_RETRY = "AAT_PROCESIO_NO_RETRY"
|
|
47
|
+
|
|
48
|
+
# Sentinel: "no explicit value passed — pick the class default". Distinct from
|
|
49
|
+
# None, which for a deadline means "exempt" and for a read timeout means "wait
|
|
50
|
+
# indefinitely" (used by synchronous run-process).
|
|
51
|
+
DEFAULT = object()
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
class DeadlineHit(Exception):
|
|
55
|
+
"""Raised by run_with_deadline when the total wall-clock deadline elapses.
|
|
56
|
+
The client translates it into errors.DeadlineExceeded with full context."""
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
# -- env opt-outs -----------------------------------------------------------
|
|
60
|
+
|
|
61
|
+
def _truthy(val: str | None) -> bool:
|
|
62
|
+
return bool(val) and val.strip().lower() not in ("", "0", "false", "no", "off")
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def deadline_disabled() -> bool:
|
|
66
|
+
return _truthy(os.environ.get(ENV_NO_DEADLINE))
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def retry_disabled() -> bool:
|
|
70
|
+
return _truthy(os.environ.get(ENV_NO_RETRY))
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# -- deadline resolution ----------------------------------------------------
|
|
74
|
+
|
|
75
|
+
def endpoint_class(method_upper: str) -> str:
|
|
76
|
+
"""The deadline class of a verb: reads are cheap-and-bounded, writes get
|
|
77
|
+
more headroom."""
|
|
78
|
+
return "read" if method_upper == "GET" else "write"
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def resolve_deadline(method_upper: str, deadline) -> float | None:
|
|
82
|
+
"""Turn the caller's `deadline` argument into a concrete seconds value or
|
|
83
|
+
None (exempt). `DEFAULT` -> the class default; None -> exempt; a number ->
|
|
84
|
+
that many seconds. The env opt-out forces exempt."""
|
|
85
|
+
if deadline is None:
|
|
86
|
+
return None
|
|
87
|
+
if deadline_disabled():
|
|
88
|
+
return None
|
|
89
|
+
if deadline is DEFAULT:
|
|
90
|
+
return READ_DEADLINE if method_upper == "GET" else WRITE_DEADLINE
|
|
91
|
+
return float(deadline)
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
# -- retry policy -----------------------------------------------------------
|
|
95
|
+
|
|
96
|
+
def is_retryable(method_upper: str, status: int, attempt: int) -> bool:
|
|
97
|
+
"""A response is retryable only for GET, only on a transient status, and only
|
|
98
|
+
while retries remain. This is the SINGLE gate — a POST/PUT can never satisfy
|
|
99
|
+
it, so an execution is structurally un-retryable."""
|
|
100
|
+
if retry_disabled():
|
|
101
|
+
return False
|
|
102
|
+
return (
|
|
103
|
+
method_upper == "GET"
|
|
104
|
+
and status in RETRYABLE_STATUSES
|
|
105
|
+
and attempt < MAX_RETRIES
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
def network_error_retryable(method_upper: str, attempt: int) -> bool:
|
|
110
|
+
"""Connection/read errors are retryable for GET only (we cannot know whether
|
|
111
|
+
a POST/PUT reached the server)."""
|
|
112
|
+
if retry_disabled():
|
|
113
|
+
return False
|
|
114
|
+
return method_upper == "GET" and attempt < MAX_RETRIES
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def full_jitter(attempt: int, rng: random.Random | None = None) -> float:
|
|
118
|
+
"""AWS-style full jitter: uniform(0, min(cap, base * 2**attempt)). `attempt`
|
|
119
|
+
is 1-based (the delay before the Nth retry)."""
|
|
120
|
+
ceiling = min(BACKOFF_CAP, BACKOFF_BASE * (2 ** attempt))
|
|
121
|
+
r = rng or random
|
|
122
|
+
return r.uniform(0.0, ceiling)
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def parse_retry_after(headers: dict | None) -> float | None:
|
|
126
|
+
"""Retry-After in delta-seconds form (the only form PROCESIO/Kong emit).
|
|
127
|
+
Ignores HTTP-date form. Returns a capped seconds value or None."""
|
|
128
|
+
if not headers:
|
|
129
|
+
return None
|
|
130
|
+
# Header lookup is case-insensitive on real responses; be lenient.
|
|
131
|
+
raw = None
|
|
132
|
+
for k, v in headers.items():
|
|
133
|
+
if k.lower() == "retry-after":
|
|
134
|
+
raw = v
|
|
135
|
+
break
|
|
136
|
+
if raw is None:
|
|
137
|
+
return None
|
|
138
|
+
try:
|
|
139
|
+
secs = float(str(raw).strip())
|
|
140
|
+
except (TypeError, ValueError):
|
|
141
|
+
return None
|
|
142
|
+
if secs < 0:
|
|
143
|
+
return None
|
|
144
|
+
return min(secs, BACKOFF_CAP)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
# -- total deadline ---------------------------------------------------------
|
|
148
|
+
|
|
149
|
+
def run_with_deadline(fn, timeout: float | None):
|
|
150
|
+
"""Run `fn()` under a TOTAL wall-clock deadline.
|
|
151
|
+
|
|
152
|
+
`timeout` None -> run inline (no deadline). Otherwise run `fn` on a DAEMON
|
|
153
|
+
thread and wait at most `timeout` seconds. On expiry raise `DeadlineHit`; the
|
|
154
|
+
worker is abandoned (daemon => the interpreter never joins it, and the OS
|
|
155
|
+
reclaims the leaked socket when this short-lived CLI process exits). Any
|
|
156
|
+
exception raised by `fn` is re-raised in the caller.
|
|
157
|
+
|
|
158
|
+
Why a raw daemon thread and not `ThreadPoolExecutor`: the executor's worker
|
|
159
|
+
threads are joined by an interpreter atexit hook, which would HANG process
|
|
160
|
+
exit on a stuck HTTP read — exactly the failure we are eliminating.
|
|
161
|
+
|
|
162
|
+
CAVEAT — long-lived hosts (AAT_RUNNER worker pool). "The OS reclaims the
|
|
163
|
+
socket on process exit" holds for the normal short-lived CLI, but NOT under
|
|
164
|
+
the persistent tool-runner pool (`AAT_RUNNER=1`, tools/_lib/toolrunner),
|
|
165
|
+
whose worker process outlives the call. There an abandoned worker stays
|
|
166
|
+
parked on the stuck read, leaking one thread + one socket per deadline-hit
|
|
167
|
+
for the pool's lifetime. Deadline-hits are rare (a true stall), so this is a
|
|
168
|
+
slow leak, not a hot path — but a flapping endpoint under the pool will
|
|
169
|
+
accumulate. If that ever bites, bound it (recycle the pool worker after N
|
|
170
|
+
deadline-hits, or move the read onto a cancellable transport).
|
|
171
|
+
"""
|
|
172
|
+
if timeout is None:
|
|
173
|
+
return fn()
|
|
174
|
+
if timeout <= 0:
|
|
175
|
+
raise DeadlineHit()
|
|
176
|
+
box: dict = {}
|
|
177
|
+
done = threading.Event()
|
|
178
|
+
|
|
179
|
+
def _worker():
|
|
180
|
+
try:
|
|
181
|
+
box["result"] = fn()
|
|
182
|
+
except BaseException as exc: # noqa: BLE001 - re-raised below
|
|
183
|
+
box["exc"] = exc
|
|
184
|
+
finally:
|
|
185
|
+
done.set()
|
|
186
|
+
|
|
187
|
+
t = threading.Thread(target=_worker, name="procesio-http", daemon=True)
|
|
188
|
+
t.start()
|
|
189
|
+
if not done.wait(timeout):
|
|
190
|
+
raise DeadlineHit()
|
|
191
|
+
if "exc" in box:
|
|
192
|
+
raise box["exc"]
|
|
193
|
+
return box["result"]
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"""Lay a SQL statement out over several lines so a person can read it in the designer.
|
|
2
|
+
|
|
3
|
+
WHY THIS EXISTS. A statement authored by concatenating strings arrives as ONE line. It runs
|
|
4
|
+
perfectly and it is unreadable: the designer shows a single row that scrolls off the screen, and
|
|
5
|
+
a reviewer cannot see a WHERE clause, a JOIN or a CASE without dragging sideways through three
|
|
6
|
+
thousand characters. Readability is not a nicety here, because the SQL IS the logic: a Query
|
|
7
|
+
Store node's SQL (one statement, or since PROCESIO v3.0.0 a `;`-separated script) is the whole
|
|
8
|
+
node.
|
|
9
|
+
|
|
10
|
+
WHAT IT GUARANTEES. Only whitespace OUTSIDE string literals ever changes:
|
|
11
|
+
|
|
12
|
+
* text inside `'...'` is copied verbatim, quotes, keywords, doubled quotes and all;
|
|
13
|
+
* `<%0%>` placeholders and `{{ds:Store}}` / `{{col:Store.Column}}` tokens are opaque words;
|
|
14
|
+
* the result is checked against the input before it is returned - same tokens in the same order,
|
|
15
|
+
or the input is handed back unchanged. A formatter that can alter a statement is worse than no
|
|
16
|
+
formatter, so this one refuses to guess.
|
|
17
|
+
|
|
18
|
+
It also leaves alone any statement that ALREADY contains a newline: an author who laid their own
|
|
19
|
+
SQL out has made a decision, and reflowing it would overwrite that.
|
|
20
|
+
"""
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import re
|
|
24
|
+
|
|
25
|
+
__all__ = ["format_sql", "is_unreadable", "SINGLE_LINE_LIMIT"]
|
|
26
|
+
|
|
27
|
+
# Beyond this, a single-line statement is long enough that a reader has to scroll.
|
|
28
|
+
SINGLE_LINE_LIMIT = 160
|
|
29
|
+
|
|
30
|
+
# Clause heads, longest first so "GROUP BY" wins over "GROUP" and "LEFT JOIN" over "JOIN".
|
|
31
|
+
_BREAK_BEFORE = [
|
|
32
|
+
"WITH", "SELECT", "FROM", "WHERE", "GROUP BY", "HAVING", "ORDER BY", "LIMIT", "OFFSET",
|
|
33
|
+
"UNION ALL", "UNION", "INSERT INTO", "VALUES", "UPDATE", "SET", "DELETE FROM",
|
|
34
|
+
"INNER JOIN", "LEFT OUTER JOIN", "RIGHT OUTER JOIN", "LEFT JOIN", "RIGHT JOIN",
|
|
35
|
+
"CROSS JOIN", "STRAIGHT_JOIN", "JOIN", "ON DUPLICATE KEY UPDATE",
|
|
36
|
+
]
|
|
37
|
+
# Broken only near the top level, or a nested function's arguments turn into a staircase.
|
|
38
|
+
_BREAK_SHALLOW = ["AND", "OR"]
|
|
39
|
+
|
|
40
|
+
_INDENT = " "
|
|
41
|
+
_WORD = re.compile(r"[A-Za-z_][A-Za-z_0-9]*")
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _split(sql: str):
|
|
45
|
+
"""Yield (kind, text) where kind is 'str' for a literal and 'sql' for everything else."""
|
|
46
|
+
i, n, start = 0, len(sql), 0
|
|
47
|
+
while i < n:
|
|
48
|
+
c = sql[i]
|
|
49
|
+
if c in "'\"":
|
|
50
|
+
if start != i:
|
|
51
|
+
yield "sql", sql[start:i]
|
|
52
|
+
quote, j = c, i + 1
|
|
53
|
+
while j < n:
|
|
54
|
+
if sql[j] == "\\":
|
|
55
|
+
j += 2
|
|
56
|
+
continue
|
|
57
|
+
if sql[j] == quote:
|
|
58
|
+
if j + 1 < n and sql[j + 1] == quote: # '' inside a literal
|
|
59
|
+
j += 2
|
|
60
|
+
continue
|
|
61
|
+
j += 1
|
|
62
|
+
break
|
|
63
|
+
j += 1
|
|
64
|
+
yield "str", sql[i:j]
|
|
65
|
+
i = start = j
|
|
66
|
+
continue
|
|
67
|
+
i += 1
|
|
68
|
+
if start < n:
|
|
69
|
+
yield "sql", sql[start:]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _tokens(sql: str):
|
|
73
|
+
"""A comparable token stream: literals whole, everything else word/symbol by word/symbol."""
|
|
74
|
+
out = []
|
|
75
|
+
for kind, text in _split(sql):
|
|
76
|
+
if kind == "str":
|
|
77
|
+
out.append(text)
|
|
78
|
+
else:
|
|
79
|
+
out.extend(re.findall(r"[A-Za-z_][A-Za-z_0-9]*|[0-9]+|\S", text))
|
|
80
|
+
return out
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def _match_keyword(upper: str, pos: int, words):
|
|
84
|
+
"""The longest keyword starting at pos, on word boundaries, or None."""
|
|
85
|
+
for kw in words:
|
|
86
|
+
end = pos + len(kw)
|
|
87
|
+
if not upper.startswith(kw, pos):
|
|
88
|
+
continue
|
|
89
|
+
before_ok = pos == 0 or not (upper[pos - 1].isalnum() or upper[pos - 1] == "_")
|
|
90
|
+
after_ok = end >= len(upper) or not (upper[end].isalnum() or upper[end] == "_")
|
|
91
|
+
if before_ok and after_ok:
|
|
92
|
+
return kw
|
|
93
|
+
return None
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def format_sql(sql: str, indent: str = _INDENT) -> str:
|
|
97
|
+
"""Return `sql` laid out over lines, or `sql` unchanged when that cannot be done safely."""
|
|
98
|
+
if not isinstance(sql, str) or not sql.strip():
|
|
99
|
+
return sql
|
|
100
|
+
if "\n" in sql.strip():
|
|
101
|
+
return sql # the author already laid it out
|
|
102
|
+
|
|
103
|
+
pieces, depth, line_start = [], 0, True
|
|
104
|
+
|
|
105
|
+
def push(text):
|
|
106
|
+
nonlocal line_start
|
|
107
|
+
if text:
|
|
108
|
+
pieces.append(text)
|
|
109
|
+
line_start = text.endswith("\n")
|
|
110
|
+
|
|
111
|
+
def newline(extra=0):
|
|
112
|
+
while pieces and pieces[-1].endswith(" "):
|
|
113
|
+
pieces[-1] = pieces[-1][:-1]
|
|
114
|
+
if not pieces:
|
|
115
|
+
return
|
|
116
|
+
push("\n" + indent * max(0, depth + extra))
|
|
117
|
+
|
|
118
|
+
for kind, text in _split(sql):
|
|
119
|
+
if kind == "str":
|
|
120
|
+
push(text)
|
|
121
|
+
continue
|
|
122
|
+
upper, i, n = text.upper(), 0, len(text)
|
|
123
|
+
while i < n:
|
|
124
|
+
ch = text[i]
|
|
125
|
+
if ch == "(":
|
|
126
|
+
depth += 1
|
|
127
|
+
push(ch)
|
|
128
|
+
i += 1
|
|
129
|
+
continue
|
|
130
|
+
if ch == ")":
|
|
131
|
+
depth = max(0, depth - 1)
|
|
132
|
+
push(ch)
|
|
133
|
+
i += 1
|
|
134
|
+
continue
|
|
135
|
+
if ch.isspace():
|
|
136
|
+
if not line_start:
|
|
137
|
+
push(" ")
|
|
138
|
+
while i < n and text[i].isspace():
|
|
139
|
+
i += 1
|
|
140
|
+
continue
|
|
141
|
+
kw = _match_keyword(upper, i, _BREAK_BEFORE)
|
|
142
|
+
if kw is None and depth <= 1:
|
|
143
|
+
kw = _match_keyword(upper, i, _BREAK_SHALLOW)
|
|
144
|
+
if kw:
|
|
145
|
+
newline()
|
|
146
|
+
push(text[i:i + len(kw)])
|
|
147
|
+
i += len(kw)
|
|
148
|
+
continue
|
|
149
|
+
m = _WORD.match(text, i)
|
|
150
|
+
if m:
|
|
151
|
+
push(m.group(0))
|
|
152
|
+
i = m.end()
|
|
153
|
+
continue
|
|
154
|
+
push(ch)
|
|
155
|
+
i += 1
|
|
156
|
+
|
|
157
|
+
out = "".join(pieces).strip()
|
|
158
|
+
# The safety gate: same tokens in the same order, or give the caller their input back.
|
|
159
|
+
if _tokens(out) != _tokens(sql):
|
|
160
|
+
return sql
|
|
161
|
+
return out
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def is_unreadable(sql: str, limit: int = SINGLE_LINE_LIMIT) -> bool:
|
|
165
|
+
"""True when a statement is one long line, which is the shape worth complaining about."""
|
|
166
|
+
return (isinstance(sql, str) and "\n" not in sql.strip()
|
|
167
|
+
and len(sql.strip()) > limit)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Read the bundled PROCESIO endpoint index (data/endpoints.json).
|
|
2
|
+
|
|
3
|
+
The index is generated from the live Web-API Swagger (v1.19) at build time and
|
|
4
|
+
shipped with the tool so `list-endpoints` works offline and deterministically.
|
|
5
|
+
Each entry: {method, path, tag, summary, params, body}.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import functools
|
|
10
|
+
import json
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
|
|
13
|
+
_DATA = Path(__file__).resolve().parent / "data" / "endpoints.json"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@functools.lru_cache(maxsize=1)
|
|
17
|
+
def _load() -> dict:
|
|
18
|
+
return json.loads(_DATA.read_text(encoding="utf-8"))
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def all_endpoints() -> list[dict]:
|
|
22
|
+
return list(_load().get("endpoints", []))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def meta() -> dict:
|
|
26
|
+
d = _load()
|
|
27
|
+
return {k: d[k] for k in ("source", "openapi", "version", "count") if k in d}
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def tags() -> list[str]:
|
|
31
|
+
return sorted({e["tag"] for e in all_endpoints()})
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def find(filter_text: str | None = None, tag: str | None = None,
|
|
35
|
+
method: str | None = None) -> list[dict]:
|
|
36
|
+
out = all_endpoints()
|
|
37
|
+
if tag:
|
|
38
|
+
tl = tag.lower()
|
|
39
|
+
out = [e for e in out if e["tag"].lower() == tl]
|
|
40
|
+
if method:
|
|
41
|
+
ml = method.upper()
|
|
42
|
+
out = [e for e in out if e["method"] == ml]
|
|
43
|
+
if filter_text:
|
|
44
|
+
ft = filter_text.lower()
|
|
45
|
+
out = [
|
|
46
|
+
e for e in out
|
|
47
|
+
if ft in e["path"].lower()
|
|
48
|
+
or ft in e["tag"].lower()
|
|
49
|
+
or ft in (e.get("summary") or "").lower()
|
|
50
|
+
]
|
|
51
|
+
return out
|
|
File without changes
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""Shared fakes for the procesio test suite - zero live HTTP, zero real keyring.
|
|
2
|
+
|
|
3
|
+
* FakeCreds - in-memory stand-in for Windows Credential Manager.
|
|
4
|
+
* FakeResp - minimal response (status_code/.json()/.text).
|
|
5
|
+
* FakeSession - records every .request(...) and returns canned/queued responses.
|
|
6
|
+
"""
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import pytest
|
|
10
|
+
|
|
11
|
+
from tools.procesio import profiles
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class FakeCreds:
|
|
15
|
+
def __init__(self):
|
|
16
|
+
self.store: dict[str, str] = {}
|
|
17
|
+
|
|
18
|
+
@staticmethod
|
|
19
|
+
def _k(tool: str, name: str) -> str:
|
|
20
|
+
return f"{tool}:{name}"
|
|
21
|
+
|
|
22
|
+
def get_optional(self, tool, name):
|
|
23
|
+
return self.store.get(self._k(tool, name))
|
|
24
|
+
|
|
25
|
+
def get(self, tool, name):
|
|
26
|
+
v = self.get_optional(tool, name)
|
|
27
|
+
if v is None:
|
|
28
|
+
raise KeyError(name)
|
|
29
|
+
return v
|
|
30
|
+
|
|
31
|
+
def has_for_report(self, tool, name):
|
|
32
|
+
"""The reporting probe. Real one never raises; here presence is the same
|
|
33
|
+
answer, so the stub stays honest about the contract rather than the
|
|
34
|
+
implementation."""
|
|
35
|
+
return self.get_optional(tool, name) is not None
|
|
36
|
+
|
|
37
|
+
def has(self, tool, name):
|
|
38
|
+
return self.get_optional(tool, name) is not None
|
|
39
|
+
|
|
40
|
+
def set_secret(self, tool, name, value):
|
|
41
|
+
self.store[self._k(tool, name)] = value
|
|
42
|
+
|
|
43
|
+
def delete(self, tool, name):
|
|
44
|
+
self.store.pop(self._k(tool, name), None)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class FakeResp:
|
|
48
|
+
def __init__(self, status: int, body=None, text: str = "", cookies=None,
|
|
49
|
+
headers=None, content: bytes = b""):
|
|
50
|
+
self.status_code = status
|
|
51
|
+
self._body = body
|
|
52
|
+
self.text = text
|
|
53
|
+
self.cookies = dict(cookies or {}) # name -> value (Set-Cookie)
|
|
54
|
+
self.headers = dict(headers or {}) # response headers
|
|
55
|
+
self.content = content # raw bytes (for request_bytes)
|
|
56
|
+
|
|
57
|
+
def json(self):
|
|
58
|
+
if self._body is None:
|
|
59
|
+
raise ValueError("no json body")
|
|
60
|
+
return self._body
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class FakeSession:
|
|
64
|
+
"""responder(method, url, kwargs) -> FakeResp, OR a queue of FakeResp
|
|
65
|
+
consumed in order, OR a default 200 {}. Records every call (incl. form
|
|
66
|
+
`data` and `json` bodies)."""
|
|
67
|
+
|
|
68
|
+
def __init__(self, responder=None, queue=None):
|
|
69
|
+
self.calls: list[dict] = []
|
|
70
|
+
self.responder = responder
|
|
71
|
+
self.queue = list(queue or [])
|
|
72
|
+
|
|
73
|
+
def request(self, method, url, params=None, json=None, data=None,
|
|
74
|
+
headers=None, timeout=None, files=None):
|
|
75
|
+
self.calls.append({"method": method, "url": url, "params": params,
|
|
76
|
+
"json": json, "data": data, "headers": headers,
|
|
77
|
+
"timeout": timeout, "files": files})
|
|
78
|
+
if self.responder:
|
|
79
|
+
return self.responder(method, url, {"params": params, "json": json,
|
|
80
|
+
"data": data, "headers": headers,
|
|
81
|
+
"files": files})
|
|
82
|
+
if self.queue:
|
|
83
|
+
return self.queue.pop(0)
|
|
84
|
+
return FakeResp(200, {})
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
@pytest.fixture(autouse=True)
|
|
88
|
+
def _isolate_userdata(tmp_path, monkeypatch):
|
|
89
|
+
"""Pin the user-data root to a per-test temp dir so the environments registry
|
|
90
|
+
(config/procesio/environments.json) is empty by default — every test resolves
|
|
91
|
+
the default environment to Internal-PROD (the historical production URLs) and no
|
|
92
|
+
test ever reads or writes the developer's real registry."""
|
|
93
|
+
monkeypatch.setenv("AAT_USERDATA_DIR", str(tmp_path / "userdata"))
|
|
94
|
+
yield
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
@pytest.fixture(autouse=True)
|
|
98
|
+
def _clear_cookie_mem_cache():
|
|
99
|
+
"""The userpass in-process cookie cache is module-global — clear it around
|
|
100
|
+
every test so sessions don't leak between tests."""
|
|
101
|
+
from tools.procesio import auth
|
|
102
|
+
auth._MEM_COOKIES.clear()
|
|
103
|
+
yield
|
|
104
|
+
auth._MEM_COOKIES.clear()
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
@pytest.fixture
|
|
108
|
+
def store(monkeypatch):
|
|
109
|
+
"""In-memory credential store wired into the profiles module."""
|
|
110
|
+
fake = FakeCreds()
|
|
111
|
+
monkeypatch.setattr(profiles, "creds", fake)
|
|
112
|
+
return fake
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
@pytest.fixture
|
|
116
|
+
def apikey_profile(store):
|
|
117
|
+
profiles.save_profile("k1", {
|
|
118
|
+
"type": "apikey", "key": "NAME1", "value": "SECRET1",
|
|
119
|
+
"workspace_id": "ws-guid-1", "workspace": "personal",
|
|
120
|
+
})
|
|
121
|
+
return "k1"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@pytest.fixture
|
|
125
|
+
def userpass_profile(store):
|
|
126
|
+
profiles.save_profile("u1", {
|
|
127
|
+
"type": "userpass", "username": "u@example.com", "password": "pw",
|
|
128
|
+
})
|
|
129
|
+
return "u1"
|