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,277 @@
|
|
|
1
|
+
# WEB — automation notes
|
|
2
|
+
|
|
3
|
+
Durable learnings for the `web` tool and everything built on it
|
|
4
|
+
(`whatsapp-personal`, `fgo-web`, `mirro` web actions). Hard rule 6.
|
|
5
|
+
|
|
6
|
+
## Headless stealth (why WhatsApp Web works headless)
|
|
7
|
+
|
|
8
|
+
Default headless Chromium advertises a `HeadlessChrome` User-Agent and
|
|
9
|
+
`navigator.webdriver = true`. WhatsApp Web's browser-support gate rejects this:
|
|
10
|
+
it renders "WhatsApp works with Google Chrome 85+ / update Chrome" and never
|
|
11
|
+
loads the app, so `whatsapp-personal send-message` used to time out waiting for
|
|
12
|
+
the composer (`#main footer div[contenteditable='true']...`).
|
|
13
|
+
|
|
14
|
+
`PlaywrightDriver.start()` now calls `_apply_stealth()` on **every** launch
|
|
15
|
+
(`driver.py`):
|
|
16
|
+
|
|
17
|
+
- adds `--disable-blink-features=AutomationControlled` to the launch args;
|
|
18
|
+
- shadows `navigator.webdriver` via an init script;
|
|
19
|
+
- if the live UA contains "Headless", rewrites it to plain "Chrome" through CDP
|
|
20
|
+
`Network.setUserAgentOverride` (read from `navigator.userAgent`, so it tracks
|
|
21
|
+
the installed Chromium version — nothing hard-coded).
|
|
22
|
+
|
|
23
|
+
This is best-effort and fully guarded (a stealth failure never breaks a launch),
|
|
24
|
+
and harmless when already headed (no "Headless" in the UA → UA override skipped).
|
|
25
|
+
Confirmed: headless `send-message` + `read-messages` against the saved
|
|
26
|
+
`whatsapp` persistent profile now succeed from a headless run, no visible window.
|
|
27
|
+
|
|
28
|
+
## Playwright browser install
|
|
29
|
+
|
|
30
|
+
- `python -m playwright install chromium` can print nothing and **not** actually
|
|
31
|
+
download (leaving a partial `chrome.exe` that exists on disk but Playwright
|
|
32
|
+
rejects as "Executable doesn't exist"). Use `--force` and watch for the
|
|
33
|
+
~182 MB download log.
|
|
34
|
+
- Headed launches (`save-session` for QR login) need the FULL build
|
|
35
|
+
`chromium-<rev>/chrome-win64/chrome.exe`; headless can use
|
|
36
|
+
`chromium_headless_shell-<rev>`.
|
|
37
|
+
- Always invoke via the venv: `.\.venv\Scripts\python.exe -m playwright install chromium`.
|
|
38
|
+
|
|
39
|
+
## WhatsApp session capture
|
|
40
|
+
|
|
41
|
+
`web save-session --name whatsapp --url https://web.whatsapp.com --persistent`
|
|
42
|
+
opens a HEADED window for the QR scan and stores a **persistent profile** at
|
|
43
|
+
`tools/web/sessions/whatsapp.profile` (IndexedDB-backed auth — a storageState
|
|
44
|
+
snapshot is not enough). The login persists across runs; the headless stealth
|
|
45
|
+
above is what lets later automated sends reuse it.
|
|
46
|
+
|
|
47
|
+
## `save-session` CANNOT be driven from an agent tool call (stdin EOF)
|
|
48
|
+
|
|
49
|
+
`save_session` blocks on `_block_on_enter()` -> `sys.stdin.readline()`. Inside a
|
|
50
|
+
Claude Code Bash/PowerShell tool call, stdin reports `isatty() == True` but
|
|
51
|
+
`readline()` returns `''` (immediate EOF). The wait therefore returns in
|
|
52
|
+
milliseconds, the headed browser is closed ~2s after launch, and a
|
|
53
|
+
HALF-AUTHENTICATED profile is written to disk.
|
|
54
|
+
|
|
55
|
+
Symptom (observed 2026-07-18, google session): three consecutive
|
|
56
|
+
`save-session --persistent --channel chrome` runs each returned
|
|
57
|
+
`cookies_saved: 54` — an identical, deterministic count, because 54 is simply
|
|
58
|
+
what Google sets on the pre-auth sign-in page. Every later
|
|
59
|
+
`web get-text --session google` then hit "Verify it's you". The profile dir
|
|
60
|
+
mtime updated each run, so the save *looked* successful.
|
|
61
|
+
|
|
62
|
+
**Rule:** an interactive `save-session` MUST be run by the human in their own
|
|
63
|
+
terminal. An agent can prepare/verify around it, but must not attempt to run it
|
|
64
|
+
and must not read `cookies_saved` as proof of a completed login.
|
|
65
|
+
|
|
66
|
+
**Verify a Google session correctly:** use a real target surface
|
|
67
|
+
(`https://drive.google.com/drive/my-drive`) and pass the SAME
|
|
68
|
+
`--channel chrome` the profile was saved with — bundled Chromium against a
|
|
69
|
+
real-Chrome profile is a fingerprint mismatch that triggers its own challenge.
|
|
70
|
+
`myaccount.google.com` always re-challenges and is a false negative.
|
|
71
|
+
|
|
72
|
+
### Fix (2026-07-18): `--wait-seconds` makes save-session agent-drivable
|
|
73
|
+
|
|
74
|
+
`save-session` now takes `--wait-seconds N` (+ optional
|
|
75
|
+
`--wait-until-url-excludes <host>`), which holds the headed browser open for up
|
|
76
|
+
to N seconds instead of touching stdin. An agent CAN now run the flow; the human
|
|
77
|
+
just logs in and it saves itself. Without `--wait-seconds` the legacy ENTER wait
|
|
78
|
+
still applies and is still unusable from a tool call.
|
|
79
|
+
|
|
80
|
+
Proven live restoring the `google` session after a password reset.
|
|
81
|
+
|
|
82
|
+
**`login_detected` is ADVISORY, not proof.** The URL poller returned
|
|
83
|
+
`login_detected: false` on the very run that produced a fully working session
|
|
84
|
+
(it reads one page's address bar; a login that completes in another tab, or
|
|
85
|
+
late, reads as a timeout). It is safe in the useful direction — a false negative
|
|
86
|
+
only costs waiting the full timeout. **The authoritative check is always a
|
|
87
|
+
post-save probe of the real target surface**, with the same `--channel` the
|
|
88
|
+
profile was saved with:
|
|
89
|
+
|
|
90
|
+
web get-text --session google --channel chrome --url https://drive.google.com/drive/my-drive
|
|
91
|
+
|
|
92
|
+
**FIXED (2026-07-18):** `delete-session` used to only unlink the storageState
|
|
93
|
+
`<name>.json`, leaving `<name>.profile/` and `<name>.cookies.json` behind and
|
|
94
|
+
returning `{"deleted": false}` for a persistent session - a stale, possibly
|
|
95
|
+
half-authenticated profile that `open_session` then silently reused (it
|
|
96
|
+
auto-detects `<name>.profile`).
|
|
97
|
+
|
|
98
|
+
It now removes all THREE artifacts and reports them:
|
|
99
|
+
`{"deleted": true, "removed": ["state","profile","cookies"]}`.
|
|
100
|
+
|
|
101
|
+
**It previews by default.** Deleting a session destroys a login only a human at
|
|
102
|
+
a browser can re-establish, so nothing is removed without `--confirm`; the
|
|
103
|
+
unconfirmed call returns `would_remove` + `confirmation_required` and is the dry
|
|
104
|
+
run. An artifact that cannot be removed (Windows lock: a browser or serializing
|
|
105
|
+
broker still holds the profile) is reported under `failed` and does NOT count as
|
|
106
|
+
`deleted: true`. A preview never stops the owning broker - only a confirmed
|
|
107
|
+
delete does.
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
## Agent fills the form, human submits it (`run --hold-seconds`)
|
|
111
|
+
|
|
112
|
+
The agent stages the work, the human clicks the irreversible control. This is
|
|
113
|
+
what the permission rules require for anything outward-facing (Submit, Confirm,
|
|
114
|
+
Send), and `run` supports it directly:
|
|
115
|
+
|
|
116
|
+
web run --session <s> --headed --hold-seconds 900 \
|
|
117
|
+
--hold-until-selector "text=Thank" --actions-file steps.json
|
|
118
|
+
|
|
119
|
+
After the last step the headed browser stays open up to `--hold-seconds`, so the
|
|
120
|
+
human can review what was filled and act. `--hold-until-selector` (or
|
|
121
|
+
`--hold-until-url-excludes <host>`) ends the hold the moment they do. The result
|
|
122
|
+
gains:
|
|
123
|
+
|
|
124
|
+
"hold": {"held_seconds": 412.0, "completed": true, "reason": "selector"}
|
|
125
|
+
|
|
126
|
+
`reason` is `selector` | `url` | `timeout`.
|
|
127
|
+
|
|
128
|
+
**An expired hold is SUCCESS, not failure.** The steps ran; the human is allowed
|
|
129
|
+
to walk away. A timeout returns exit 0 with `completed: false`, so the caller can
|
|
130
|
+
still tell "the fill broke" from "nobody was at the desk". `--hold-seconds`
|
|
131
|
+
without `--headed` is a usage error (exit 2) - holding a headless browser open
|
|
132
|
+
helps nobody.
|
|
133
|
+
|
|
134
|
+
**`completed` is ADVISORY, not proof** - same caveat as `save-session`'s
|
|
135
|
+
`login_detected`. **Confirm from `final_url`, not from a screenshot.** A
|
|
136
|
+
screenshot proves only that the fields were populated: it is captured before the
|
|
137
|
+
human acts and looks identical whether or not anything was submitted. The
|
|
138
|
+
evidence is `final_url` landing on the site's submit/post-submit host. Check
|
|
139
|
+
`diagnostics` too - empty `page_errors` / `bad_responses` means the page was
|
|
140
|
+
actually healthy, which a screenshot also cannot show.
|
|
141
|
+
|
|
142
|
+
Before `--hold-seconds` existed the workaround was a long trailing
|
|
143
|
+
`wait_for` step. It worked, but a human who did not act in time made the whole
|
|
144
|
+
run raise `browser_error` - a successful fill reported as a failure. Don't
|
|
145
|
+
reintroduce it.
|
|
146
|
+
|
|
147
|
+
## Discover selectors from the HTML, before starting a browser
|
|
148
|
+
|
|
149
|
+
Fetch the page server-side (`urllib`/`requests`) and scan the
|
|
150
|
+
`<input|textarea|select>` tags: one call yields every `id` and `name` on the
|
|
151
|
+
form. Cheaper and far more reliable than round-tripping a live page for
|
|
152
|
+
structure, and it surfaces fields the rendered view hides - which is exactly
|
|
153
|
+
where the next two traps live.
|
|
154
|
+
|
|
155
|
+
## Form traps that cost a run
|
|
156
|
+
|
|
157
|
+
**Hidden sub-inputs behind a "lite mode" field.** Date widgets commonly render
|
|
158
|
+
`day_<qid>` / `month_<qid>` / `year_<qid>` inside a `<div style="display:none">`
|
|
159
|
+
and expose ONE visible text input, `lite_mode_<qid>`. Filling the sub-inputs
|
|
160
|
+
times out - Playwright will not type into a hidden element. Fill the lite-mode
|
|
161
|
+
input, using the format the element itself declares
|
|
162
|
+
(`data-format="ddmmyyyy"` + `data-seperator="-"` -> `01-04-2026`), then
|
|
163
|
+
`press Tab` on it so the widget propagates the value into the hidden fields.
|
|
164
|
+
Generally: when a fill times out on a field that plainly exists in the HTML,
|
|
165
|
+
check whether an ancestor is `display:none` and look for the visible proxy.
|
|
166
|
+
|
|
167
|
+
**Honeypot fields.** A form may carry an input with a plausible name and NO
|
|
168
|
+
`id` (seen: `name="website"`). It is an anti-spam trap - a filled value marks
|
|
169
|
+
the submission as a bot. Always fill by explicit id; never iterate "every input
|
|
170
|
+
on the page".
|
|
171
|
+
|
|
172
|
+
**A DNS failure inside the browser can be transient.** `net::ERR_NAME_NOT_RESOLVED`
|
|
173
|
+
on `goto` while the same URL fetches fine from Python is not proof of a blocked
|
|
174
|
+
host or a broken session. Retry once before diagnosing.
|
|
175
|
+
|
|
176
|
+
## Archiving a published document as evidence (`archive-document`)
|
|
177
|
+
|
|
178
|
+
Added 16/09/2026. Captures a web page or PDF as three artefacts in one folder: the response bytes
|
|
179
|
+
untouched, a stylesheet-inlined copy that renders offline, and a text extraction. Every readable file
|
|
180
|
+
carries a provenance header with the sha256 of the original, so a later capture of the same URL can be
|
|
181
|
+
diffed against it to prove whether the publisher edited the document.
|
|
182
|
+
|
|
183
|
+
**Fetch is plain HTTP with a browser User-Agent, no Playwright.** A CDN edge will serve a challenge
|
|
184
|
+
page to a default urllib/requests agent and the document itself to a browser agent, so the agent
|
|
185
|
+
string is load-bearing, not cosmetic. Server-rendered pages (Next.js and similar) come back complete;
|
|
186
|
+
verify by grepping the extraction for a string only the rendered page would carry before trusting it.
|
|
187
|
+
A client-rendered page needs `web run` / `get-text` with a session instead.
|
|
188
|
+
|
|
189
|
+
**Why three files and not a markdown conversion.** Clause numbering, layout and pagination are part of
|
|
190
|
+
what a reader of a legal or contractual document relies on, and a markdown conversion destroys all
|
|
191
|
+
three. The original is kept byte for byte and is the only artefact treated as evidence; the other two
|
|
192
|
+
are derived conveniences.
|
|
193
|
+
|
|
194
|
+
**Date candidates are reported, never reconciled.** The extractor reports date-like strings that sit
|
|
195
|
+
near version wording ("last updated", "effective", "revised"). Two of them on one document is a finding
|
|
196
|
+
about the document. Expect false positives where a document quotes a date for another reason: a policy
|
|
197
|
+
citing a court judgment will surface the judgment's date as a candidate, so read the context line
|
|
198
|
+
before treating a candidate as the document's own date.
|
|
199
|
+
|
|
200
|
+
**A bucket that returns 403 for an unknown key cannot be used to prove absence.** Object stores
|
|
201
|
+
configured to deny listing commonly answer 403 rather than 404 for a key that does not exist, which
|
|
202
|
+
makes "absent" and "present but private" indistinguishable from outside. Probing for sibling filenames
|
|
203
|
+
is therefore evidence of nothing in either direction; enumerate from the pages that link the objects
|
|
204
|
+
instead, and say so when reporting coverage.
|
|
205
|
+
|
|
206
|
+
**A published estate can be split across surfaces that do not link to each other.** The documents an
|
|
207
|
+
application presents at sign-up and sign-in can live on a different host from the ones a marketing site
|
|
208
|
+
links in its footer, with no path between them. Crawling the website alone will miss the operative
|
|
209
|
+
contract. Read the sign-up and sign-in screens as first-class sources, and record whether acceptance is
|
|
210
|
+
a ticked box or acceptance by conduct, because the absence of a checkbox is itself a finding.
|
|
211
|
+
|
|
212
|
+
## Reading a link-in-bio page without a browser (`page-contacts`)
|
|
213
|
+
|
|
214
|
+
- **Next.js link-in-bio services render no anchors server-side.** On Linktree
|
|
215
|
+
(verified live, 2026-10) the HTML a plain GET receives has zero `<a href>`
|
|
216
|
+
elements: the creator's buttons are in the `<script id="__NEXT_DATA__">` JSON at
|
|
217
|
+
`props.pageProps.links[].url`, the social icons at `props.pageProps.socialLinks[].url`
|
|
218
|
+
(`pinnedLinks` too), the bio at `props.pageProps.description`. An email button is a
|
|
219
|
+
`mailto:` URL in the same `links` array. `tools/_lib/contacts.next_data_links` reads
|
|
220
|
+
exactly those keys.
|
|
221
|
+
- **The same JSON carries the platform's own noise.** Sponsored offers (affiliate
|
|
222
|
+
network links such as CJ and Impact hosts) and dozens of asset URLs on the
|
|
223
|
+
platform's own subdomains. Scanning the whole source for URLs therefore reports
|
|
224
|
+
affiliate links the creator never placed. Rule: take destinations, sites and
|
|
225
|
+
affiliate links only from anchors, visible text and the creator-chosen keys;
|
|
226
|
+
take nothing but profile URLs (LinkedIn, X, Instagram, ...) from raw source; drop
|
|
227
|
+
links back to the page's own site and anything that looks like a static file.
|
|
228
|
+
- An affiliate link is never the person's website: it is reported under
|
|
229
|
+
`affiliate_links` and filed as `other`, so nothing follows it as if it were their
|
|
230
|
+
site.
|
|
231
|
+
|
|
232
|
+
## Third-party "Sign in with Google" blank in a captured session: log in with plain Chrome, reuse the profile
|
|
233
|
+
|
|
234
|
+
**Symptom.** In a `save-session --persistent --channel chrome` window, a site's own
|
|
235
|
+
"Sign in with Google" button opens a Google page that stays blank white and never
|
|
236
|
+
completes. Retrying `save-session` does not help: Google will not serve its sign-in to a
|
|
237
|
+
browser it detects as automation-controlled, and the stealth launch flags are not enough
|
|
238
|
+
for that page.
|
|
239
|
+
|
|
240
|
+
**Fix (proven live).** Let the human log in through an ordinary, non-automated Chrome that
|
|
241
|
+
writes into the session's profile directory, then let Playwright reuse that directory:
|
|
242
|
+
|
|
243
|
+
1. Find the sessions dir (`web list-sessions` returns it as `dir`) and launch Chrome
|
|
244
|
+
directly, not through Playwright:
|
|
245
|
+
`chrome.exe --user-data-dir="<sessions dir>/<name>.profile" --no-first-run --no-default-browser-check --new-window <login url>`
|
|
246
|
+
A separate `--user-data-dir` starts its own Chrome instance, even while the user's
|
|
247
|
+
everyday Chrome is running.
|
|
248
|
+
2. The human logs in. Then close that window **gracefully** (`CloseMainWindow()`, not a
|
|
249
|
+
kill) so the cookie store is flushed, and wait until no `chrome.exe` process has that
|
|
250
|
+
`--user-data-dir` on its command line. Playwright cannot open a profile Chrome still
|
|
251
|
+
holds.
|
|
252
|
+
3. Drive it with `web run --session <name> --channel chrome ...`. `open_session`
|
|
253
|
+
auto-detects `<name>.profile`. Pass `--channel chrome`: it is the binary that wrote the
|
|
254
|
+
profile, and Chrome's cookie encryption is tied to it. Bundled Chromium cannot read the
|
|
255
|
+
cookies.
|
|
256
|
+
|
|
257
|
+
A supervised (child) Google account may ask for parent approval in the new browser. Once
|
|
258
|
+
the login works, the profile holds a live login for the site **and** for the Google
|
|
259
|
+
account, so delete it (`web delete-session --name <name> --confirm`) when the job is done.
|
|
260
|
+
|
|
261
|
+
## Capturing a logged-in page as evidence
|
|
262
|
+
|
|
263
|
+
`archive-document` fetches anonymously, so it cannot see a page behind a login. Until it
|
|
264
|
+
takes a session, capture with `web run` against the logged-in session:
|
|
265
|
+
|
|
266
|
+
- `screenshot` steps, both `full_page: true` and the viewport;
|
|
267
|
+
- an `eval` returning `document.documentElement.outerHTML` (the DOM as rendered);
|
|
268
|
+
- an `eval` with `async () => (await fetch(location.href, {credentials: 'include'})).text()`
|
|
269
|
+
(the HTML the server sent, the closest to the original bytes).
|
|
270
|
+
|
|
271
|
+
Then write the strings to files and record a sha256 for each. Two traps:
|
|
272
|
+
|
|
273
|
+
- **Decode the `web run` output as UTF-8.** On Windows a Python reader that takes it from
|
|
274
|
+
stdin defaults to cp1252 and turns diacritics into mojibake (`ă` becomes `Ä`) without
|
|
275
|
+
raising. Set `PYTHONIOENCODING=utf-8`, or read the bytes and decode them yourself.
|
|
276
|
+
- **A login check by page text is unreliable.** Many account pages do not print the user's
|
|
277
|
+
name. Check for an element only a logged-in user gets, or look at the screenshot.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""web tool - drive web apps that have no API via Playwright with saved sessions.
|
|
2
|
+
|
|
3
|
+
Public Python API for other tools/agents is re-exported here for convenience:
|
|
4
|
+
|
|
5
|
+
from tools.web import open_session, run_steps, get_text, screenshot, BrowserDriver
|
|
6
|
+
|
|
7
|
+
See tools/web/api.py for the full surface and README.md for examples.
|
|
8
|
+
"""
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from tools.web.api import ( # noqa: F401
|
|
12
|
+
delete_session,
|
|
13
|
+
get_text,
|
|
14
|
+
list_sessions,
|
|
15
|
+
open_session,
|
|
16
|
+
run_steps,
|
|
17
|
+
save_session,
|
|
18
|
+
screenshot,
|
|
19
|
+
session_path,
|
|
20
|
+
)
|
|
21
|
+
from tools.web.driver import BrowserDriver, PlaywrightDriver # noqa: F401
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"""ActionDef - dispatchable action unit for the web tool.
|
|
2
|
+
|
|
3
|
+
Unlike the HTTP tools (which inject an API client), web actions receive a
|
|
4
|
+
``BrowserDriver``. ``needs_driver`` decides whether the dispatcher builds and
|
|
5
|
+
injects one. Interactive / session-management actions (save-session,
|
|
6
|
+
list-sessions, delete-session) manage their own resources and set it False.
|
|
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_driver: bool = True # True -> dispatcher builds a BrowserDriver, passes it first
|
|
24
|
+
description: str = ""
|