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,210 @@
|
|
|
1
|
+
"""The declarative step interpreter: each step type dispatches to the right
|
|
2
|
+
driver call with the right args, and bad steps fail fast as UsageError."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
|
|
7
|
+
from tools.web.errors import UsageError
|
|
8
|
+
from tools.web.steps import KNOWN_STEPS, run_steps, validate_steps
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def test_goto_click_fill_press_wait_dispatch(fake_driver):
|
|
12
|
+
steps = [
|
|
13
|
+
{"do": "goto", "url": "https://x.test"},
|
|
14
|
+
{"do": "wait_for", "selector": "#ready"},
|
|
15
|
+
{"do": "fill", "selector": "#q", "text": "hello"},
|
|
16
|
+
{"do": "click", "selector": "#go"},
|
|
17
|
+
{"do": "press", "key": "Enter"},
|
|
18
|
+
]
|
|
19
|
+
run_steps(fake_driver, steps)
|
|
20
|
+
assert fake_driver.methods() == [
|
|
21
|
+
"goto", "wait_for", "fill", "click", "press", "current_url",
|
|
22
|
+
]
|
|
23
|
+
# args carried through correctly
|
|
24
|
+
calls = {m: kw for m, kw in fake_driver.calls}
|
|
25
|
+
assert calls["goto"]["url"] == "https://x.test"
|
|
26
|
+
assert calls["fill"]["selector"] == "#q"
|
|
27
|
+
assert calls["fill"]["text"] == "hello"
|
|
28
|
+
assert calls["press"]["key"] == "Enter"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_press_with_selector(fake_driver):
|
|
32
|
+
run_steps(fake_driver, [{"do": "press", "key": "Tab", "selector": "#name"}])
|
|
33
|
+
press = [kw for m, kw in fake_driver.calls if m == "press"][0]
|
|
34
|
+
assert press == {"key": "Tab", "selector": "#name"}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def test_type_step_dispatches_keyboard(fake_driver):
|
|
38
|
+
# No selector -> types into whatever is focused (e.g. a canvas grid cell).
|
|
39
|
+
# With selector -> the element is focused first, then typed into.
|
|
40
|
+
run_steps(fake_driver, [
|
|
41
|
+
{"do": "type", "text": "hello world"},
|
|
42
|
+
{"do": "type", "text": "x", "selector": "#t-name-box", "timeout": 3000},
|
|
43
|
+
])
|
|
44
|
+
types = [kw for m, kw in fake_driver.calls if m == "type_text"]
|
|
45
|
+
assert types[0] == {"text": "hello world", "selector": None, "timeout": None}
|
|
46
|
+
assert types[1] == {"text": "x", "selector": "#t-name-box", "timeout": 3000}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def test_wait_step_dispatches_fixed_delay(fake_driver):
|
|
50
|
+
run_steps(fake_driver, [{"do": "wait", "ms": 1500}])
|
|
51
|
+
waits = [kw for m, kw in fake_driver.calls if m == "wait"]
|
|
52
|
+
assert waits == [{"ms": 1500}]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_type_requires_text():
|
|
56
|
+
with pytest.raises(UsageError) as e:
|
|
57
|
+
validate_steps([{"do": "type", "selector": "#x"}])
|
|
58
|
+
assert "missing required key" in str(e.value)
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def test_wait_requires_ms():
|
|
62
|
+
with pytest.raises(UsageError) as e:
|
|
63
|
+
validate_steps([{"do": "wait"}])
|
|
64
|
+
assert "missing required key" in str(e.value)
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_extract_text_named_and_default_name(fake_driver):
|
|
68
|
+
fake_driver.texts = {"h1": "Big Title", None: "whole body"}
|
|
69
|
+
out = run_steps(fake_driver, [
|
|
70
|
+
{"do": "extract_text", "selector": "h1", "name": "headline"},
|
|
71
|
+
{"do": "extract_text"}, # no selector -> reads body; name falls back to "text"
|
|
72
|
+
])
|
|
73
|
+
assert out["results"]["headline"] == "Big Title"
|
|
74
|
+
assert out["results"]["text"] == "whole body"
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def test_extract_attr_named_and_fallback_name(fake_driver):
|
|
78
|
+
fake_driver.attrs = {("a.cta", "href"): "https://dest"}
|
|
79
|
+
out = run_steps(fake_driver, [
|
|
80
|
+
{"do": "extract_attr", "selector": "a.cta", "attr": "href", "name": "link"},
|
|
81
|
+
{"do": "extract_attr", "selector": "img", "attr": "src"},
|
|
82
|
+
])
|
|
83
|
+
assert out["results"]["link"] == "https://dest"
|
|
84
|
+
# fallback name is "<selector>@<attr>"
|
|
85
|
+
assert out["results"]["img@src"] == "attr:img:src"
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def test_screenshot_collected(fake_driver):
|
|
89
|
+
out = run_steps(fake_driver, [
|
|
90
|
+
{"do": "screenshot", "path": "a.png"},
|
|
91
|
+
{"do": "screenshot", "path": "b.png", "full_page": False},
|
|
92
|
+
])
|
|
93
|
+
assert out["screenshots"] == ["a.png", "b.png"]
|
|
94
|
+
shots = [kw for m, kw in fake_driver.calls if m == "screenshot"]
|
|
95
|
+
assert shots[1]["full_page"] is False
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_timeout_passed_through(fake_driver):
|
|
99
|
+
run_steps(fake_driver, [{"do": "wait_for", "selector": "#x", "timeout": 5000}])
|
|
100
|
+
wait = [kw for m, kw in fake_driver.calls if m == "wait_for"][0]
|
|
101
|
+
assert wait["timeout"] == 5000
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def test_final_url_included(fake_driver):
|
|
105
|
+
fake_driver.url = "https://x.test/final"
|
|
106
|
+
out = run_steps(fake_driver, [{"do": "goto", "url": "https://x.test"}])
|
|
107
|
+
assert out["final_url"] == "https://x.test/final"
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# --- validation / error cases (no driver interaction needed) --------------
|
|
111
|
+
|
|
112
|
+
def test_steps_must_be_list():
|
|
113
|
+
with pytest.raises(UsageError):
|
|
114
|
+
validate_steps({"do": "goto", "url": "x"})
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def test_unknown_step_rejected():
|
|
118
|
+
with pytest.raises(UsageError) as e:
|
|
119
|
+
validate_steps([{"do": "teleport", "url": "x"}])
|
|
120
|
+
assert "unknown action" in str(e.value)
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_missing_required_key_rejected():
|
|
124
|
+
with pytest.raises(UsageError) as e:
|
|
125
|
+
validate_steps([{"do": "fill", "selector": "#q"}]) # missing text
|
|
126
|
+
assert "missing required key" in str(e.value)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def test_unknown_key_rejected():
|
|
130
|
+
with pytest.raises(UsageError) as e:
|
|
131
|
+
validate_steps([{"do": "goto", "url": "x", "bogus": 1}])
|
|
132
|
+
assert "unknown key" in str(e.value)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def test_missing_do_rejected():
|
|
136
|
+
with pytest.raises(UsageError):
|
|
137
|
+
validate_steps([{"url": "x"}])
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def test_non_object_step_rejected():
|
|
141
|
+
with pytest.raises(UsageError):
|
|
142
|
+
validate_steps(["just a string"])
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def test_validation_happens_before_any_driver_call(fake_driver):
|
|
146
|
+
# A later bad step must abort the whole run before the good first step runs.
|
|
147
|
+
with pytest.raises(UsageError):
|
|
148
|
+
run_steps(fake_driver, [
|
|
149
|
+
{"do": "goto", "url": "https://x.test"},
|
|
150
|
+
{"do": "nope"},
|
|
151
|
+
])
|
|
152
|
+
assert fake_driver.calls == [] # nothing executed
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def test_known_steps_constant_matches_schema():
|
|
156
|
+
assert KNOWN_STEPS == {
|
|
157
|
+
"goto", "click", "fill", "press", "type", "wait", "wait_for",
|
|
158
|
+
"extract_text", "extract_attr", "eval", "viewport", "screenshot",
|
|
159
|
+
"upload", "upload_via_chooser",
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def test_upload_dispatches_set_input_files(fake_driver):
|
|
164
|
+
run_steps(fake_driver, [
|
|
165
|
+
{"do": "upload", "selector": "#avatar", "path": "C:/pics/me.jpg"},
|
|
166
|
+
{"do": "upload", "selector": "#docs", "path": ["a.pdf", "b.pdf"], "timeout": 9000},
|
|
167
|
+
])
|
|
168
|
+
calls = [kw for m, kw in fake_driver.calls if m == "set_input_files"]
|
|
169
|
+
assert calls[0] == {"selector": "#avatar", "files": "C:/pics/me.jpg", "timeout": None}
|
|
170
|
+
assert calls[1] == {"selector": "#docs", "files": ["a.pdf", "b.pdf"], "timeout": 9000}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def test_upload_via_chooser_dispatches(fake_driver):
|
|
174
|
+
run_steps(fake_driver, [
|
|
175
|
+
{"do": "upload_via_chooser", "selector": "button.attach", "path": "note.png"},
|
|
176
|
+
])
|
|
177
|
+
call = [kw for m, kw in fake_driver.calls if m == "set_files_via_chooser"][0]
|
|
178
|
+
assert call == {"selector": "button.attach", "files": "note.png", "timeout": None}
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def test_upload_requires_selector_and_path():
|
|
182
|
+
with pytest.raises(UsageError) as e:
|
|
183
|
+
validate_steps([{"do": "upload", "selector": "#f"}]) # missing path
|
|
184
|
+
assert "missing required key" in str(e.value)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def test_click_defaults_to_the_actionability_check(fake_driver):
|
|
188
|
+
run_steps(fake_driver, [{"do": "click", "selector": "button.save"}])
|
|
189
|
+
assert ("click", {"selector": "button.save", "timeout": None,
|
|
190
|
+
"force": False}) in fake_driver.calls
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
def test_click_can_be_forced_through_an_overlay(fake_driver):
|
|
194
|
+
"""Some frameworks paint a container over their own controls; without this
|
|
195
|
+
the click is refused even though a person can press the control."""
|
|
196
|
+
run_steps(fake_driver, [{"do": "click", "selector": "button.save", "force": True}])
|
|
197
|
+
assert ("click", {"selector": "button.save", "timeout": None,
|
|
198
|
+
"force": True}) in fake_driver.calls
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def test_viewport_step_dispatches_resize(fake_driver):
|
|
202
|
+
run_steps(fake_driver, [{"do": "viewport", "width": 1920, "height": 1080}])
|
|
203
|
+
sizes = [kw for m, kw in fake_driver.calls if m == "set_viewport"]
|
|
204
|
+
assert sizes == [{"width": 1920, "height": 1080}]
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
def test_viewport_requires_width_and_height():
|
|
208
|
+
with pytest.raises(UsageError) as e:
|
|
209
|
+
validate_steps([{"do": "viewport", "width": 1920}])
|
|
210
|
+
assert "missing required key" in str(e.value)
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
name: web
|
|
2
|
+
description: >
|
|
3
|
+
Drive web apps that have NO API via Playwright, reusing SAVED login sessions
|
|
4
|
+
so we authenticate once and reuse. Sessions are Playwright storageState
|
|
5
|
+
(cookies + localStorage) per named site, stored gitignored under
|
|
6
|
+
tools/web/sessions/<name>.json - they hold live auth and are SENSITIVE
|
|
7
|
+
(never committed, never printed). Other tools and the outreach agent call
|
|
8
|
+
this whenever they need to connect to a site or do deeper web research.
|
|
9
|
+
Action-dispatched. No HTTP API; a BrowserDriver abstraction wraps Playwright
|
|
10
|
+
(imported lazily) so the tool loads even before browsers are installed.
|
|
11
|
+
BROKER-OWNED SESSIONS: run/get-text/screenshot against a session owned by a
|
|
12
|
+
serializing broker (whatsapp/ryver/fgo/mirro - tools/_lib/webserialize) are
|
|
13
|
+
executed INSIDE that broker, serialized with the owning tool's commands, so
|
|
14
|
+
ad-hoc web commands can't race the profile. --direct bypasses (backup).
|
|
15
|
+
save-session/delete-session auto-stop the owning broker first.
|
|
16
|
+
version: 0.2.0
|
|
17
|
+
runtime: python
|
|
18
|
+
entrypoint: main.py
|
|
19
|
+
|
|
20
|
+
# No credentials in Credential Manager: auth lives in saved session files
|
|
21
|
+
# (storageState) under tools/web/sessions/, which are gitignored.
|
|
22
|
+
secrets: []
|
|
23
|
+
|
|
24
|
+
routing:
|
|
25
|
+
triggers:
|
|
26
|
+
- "drive/scrape a website that has no API, using a saved login session; deeper web research"
|
|
27
|
+
primary_action: run
|
|
28
|
+
example: "web run --session <name> ... (read text: web get-text; one-time login: web save-session)"
|
|
29
|
+
|
|
30
|
+
actions:
|
|
31
|
+
- name: save-session
|
|
32
|
+
description: >
|
|
33
|
+
Interactively capture a login session. Launches a HEADED browser at --url,
|
|
34
|
+
lets the human log in, then captures storageState to
|
|
35
|
+
tools/web/sessions/<name>.json. Run once per site. By default it BLOCKS
|
|
36
|
+
until ENTER is pressed on stdin; an AGENT must instead pass --wait-seconds,
|
|
37
|
+
because agent stdin is EOF and the ENTER wait would return instantly and
|
|
38
|
+
save a half-authenticated profile.
|
|
39
|
+
args:
|
|
40
|
+
- {name: name, type: string, required: true, description: "Session name (letters/digits/._-); how you reference it later"}
|
|
41
|
+
- {name: url, type: string, required: true, description: Login URL to open in the headed browser}
|
|
42
|
+
- {name: channel, type: string, description: "Optional Chromium channel: 'chrome' or 'msedge' (use a real installed browser)"}
|
|
43
|
+
- {name: persistent, type: boolean, description: "Save a PERSISTENT browser profile (user-data-dir) instead of a storageState snapshot; required for IndexedDB-auth sites like WhatsApp Web"}
|
|
44
|
+
- {name: wait-seconds, type: integer, description: "Wait this long for the login instead of blocking on ENTER; required when an agent launches the flow"}
|
|
45
|
+
- {name: wait-until-url-excludes, type: string, description: "With --wait-seconds, finish as soon as the address bar leaves this host (e.g. accounts.google.com)"}
|
|
46
|
+
output_schema: '{ "session": "...", "path": "tools/web/sessions/<name>.json", "url": "...", "waited_for": "enter|timer|url", "login_detected": true }'
|
|
47
|
+
|
|
48
|
+
- name: list-sessions
|
|
49
|
+
description: List saved sessions (names + metadata only, never contents).
|
|
50
|
+
output_schema: '{ "sessions": [ {name, bytes, modified, persistent} ], "count": 0, "dir": "..." }'
|
|
51
|
+
|
|
52
|
+
- name: delete-session
|
|
53
|
+
description: >
|
|
54
|
+
Delete ALL of a saved session's artifacts - the storageState file, the
|
|
55
|
+
persistent <name>.profile/ directory, and the <name>.cookies.json sidecar.
|
|
56
|
+
Deleting a session destroys a login that only a human at a browser can
|
|
57
|
+
re-establish, so this PREVIEWS by default and removes nothing unless
|
|
58
|
+
--confirm is passed (the unconfirmed call is the dry run).
|
|
59
|
+
args:
|
|
60
|
+
- {name: name, type: string, required: true, description: Session name to delete}
|
|
61
|
+
- {name: confirm, type: boolean, description: "Actually delete; without it the call only previews would_remove"}
|
|
62
|
+
output_schema: '{ "session": "...", "deleted": true, "existed": true, "removed": ["state","profile","cookies"], "would_remove": ["..."], "confirmation_required": true, "failed": {}, "broker_stopped": "..." }'
|
|
63
|
+
|
|
64
|
+
- name: run
|
|
65
|
+
description: >
|
|
66
|
+
Load a saved session, optionally navigate to --url, then execute a
|
|
67
|
+
declarative step list (--actions JSON array or --actions-file). Returns
|
|
68
|
+
collected outputs. Step schema (each step has a "do"):
|
|
69
|
+
goto{url,timeout?} | click{selector,timeout?,force?} | fill{selector,text,timeout?} |
|
|
70
|
+
press{key,selector?} | type{text,selector?,timeout?} | wait{ms} |
|
|
71
|
+
wait_for{selector,timeout?} | extract_text{selector?,name,timeout?} |
|
|
72
|
+
extract_attr{selector,attr,name,timeout?} | viewport{width,height} |
|
|
73
|
+
screenshot{path,full_page?}.
|
|
74
|
+
'type' drives real keyboard events (canvas grids like Google Sheets where
|
|
75
|
+
cells aren't DOM); 'wait' is a fixed ms delay (autosave settle).
|
|
76
|
+
Headless by default; --headed to watch. --hold-seconds keeps a headed
|
|
77
|
+
browser open after the steps so a HUMAN can review what was staged and
|
|
78
|
+
click the irreversible control (Submit/Confirm/Send) themselves; an
|
|
79
|
+
expired hold is still a successful run.
|
|
80
|
+
args:
|
|
81
|
+
- {name: session, type: string, required: true, description: Saved session name to load}
|
|
82
|
+
- {name: url, type: string, description: Optional URL to visit before running the steps}
|
|
83
|
+
- {name: actions, type: string, description: "Inline JSON array of steps"}
|
|
84
|
+
- {name: actions-file, type: string, description: "Path to a JSON file containing the steps array"}
|
|
85
|
+
- {name: headed, type: boolean, default: false, description: "Show the browser window (default headless)"}
|
|
86
|
+
- {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
|
|
87
|
+
- {name: hold-seconds, type: integer, description: "After the last step keep the headed browser open up to N seconds for a human to finish the action; requires headed"}
|
|
88
|
+
- {name: hold-until-selector, type: string, description: "End the hold early once this selector appears; requires hold-seconds"}
|
|
89
|
+
- {name: hold-until-url-excludes, type: string, description: "End the hold early once the address bar leaves this host; requires hold-seconds"}
|
|
90
|
+
- {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
|
|
91
|
+
output_schema: '{ "session": "...", "results": {"name": "value"}, "screenshots": ["..."], "final_url": "...", "hold": {"held_seconds": 0, "completed": false, "reason": "selector|url|timeout"} }'
|
|
92
|
+
|
|
93
|
+
- name: get-text
|
|
94
|
+
description: "Convenience: load a session, open --url, return visible text (whole page or --selector). For lead/topic research."
|
|
95
|
+
args:
|
|
96
|
+
- {name: session, type: string, required: true, description: Saved session name to load}
|
|
97
|
+
- {name: url, type: string, required: true, description: URL to navigate to}
|
|
98
|
+
- {name: selector, type: string, description: Optional CSS selector; default reads the whole page body}
|
|
99
|
+
- {name: wait, type: string, description: Optional selector to await before reading (for SPAs)}
|
|
100
|
+
- {name: headed, type: boolean, default: false, description: Show the browser window}
|
|
101
|
+
- {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
|
|
102
|
+
- {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
|
|
103
|
+
output_schema: '{ "session": "...", "url": "...", "selector": null, "text": "...", "final_url": "..." }'
|
|
104
|
+
|
|
105
|
+
- name: screenshot
|
|
106
|
+
description: "Load a session, open --url, save a screenshot to --out."
|
|
107
|
+
args:
|
|
108
|
+
- {name: session, type: string, required: true, description: Saved session name to load}
|
|
109
|
+
- {name: url, type: string, required: true, description: URL to capture}
|
|
110
|
+
- {name: out, type: string, required: true, description: "Output image path (.png)"}
|
|
111
|
+
- {name: viewport-only, type: boolean, default: false, description: "Capture only the viewport (default: full page)"}
|
|
112
|
+
- {name: wait, type: string, description: Optional selector to await first}
|
|
113
|
+
- {name: headed, type: boolean, default: false, description: Show the browser window}
|
|
114
|
+
- {name: channel, type: string, description: "Chromium channel: 'chrome' or 'msedge'"}
|
|
115
|
+
- {name: direct, type: boolean, default: false, description: "Bypass the owning tool serializing broker and drive the browser in-process (backup; only safe when that broker is stopped)"}
|
|
116
|
+
output_schema: '{ "session": "...", "url": "...", "path": "...", "final_url": "..." }'
|
|
117
|
+
|
|
118
|
+
- name: archive-document
|
|
119
|
+
description: >
|
|
120
|
+
Capture a published document (web page or PDF) as a reviewable evidence set:
|
|
121
|
+
the ORIGINAL response bytes untouched, a self-contained HTML rendering with
|
|
122
|
+
stylesheets inlined so it opens offline with its layout, and a text
|
|
123
|
+
extraction for searching and quoting. Every readable artefact carries a
|
|
124
|
+
provenance header (title, the date the document states about itself, source
|
|
125
|
+
URL, fetch timestamp, sha256 of the original) so a later capture can be
|
|
126
|
+
compared against it. Unauthenticated fetch only - a login-gated document is
|
|
127
|
+
recorded as unreachable, never substituted with a summary.
|
|
128
|
+
args:
|
|
129
|
+
- {name: url, type: string, description: "URL of the document to capture (exactly one of --url/--file)"}
|
|
130
|
+
- {name: file, type: string, description: "Local file to archive instead of fetching (an already-downloaded original)"}
|
|
131
|
+
- {name: source-url, type: string, description: "With --file: the URL the file came from, recorded in the header"}
|
|
132
|
+
- {name: out-dir, type: string, required: true, description: "Base directory; a subfolder named --name is created inside it"}
|
|
133
|
+
- {name: name, type: string, required: true, description: "Folder and file basename for the document (a slug, not a URL)"}
|
|
134
|
+
- {name: title, type: string, description: "Published title override; default reads <title>/<h1>"}
|
|
135
|
+
- {name: timeout, type: integer, default: 60, description: "Per-request timeout in seconds"}
|
|
136
|
+
- {name: no-self-contained, type: boolean, default: false, description: "Skip the stylesheet-inlined copy (original + extraction only)"}
|
|
137
|
+
output_schema: '{ "name": "...", "dir": "...", "url": "...", "final_url": "...", "status": 200, "kind": "html|pdf", "title": "...", "fetched_at": "...", "bytes": 0, "stylesheets_inlined": 0, "chars_extracted": 0, "document_date_candidates": [{"date": "...", "context": "..."}], "files": {"original": "...", "self_contained": "...", "extraction": "..."}, "sha256": {"original": "...", "self_contained": "...", "extraction": "..."} }'
|
|
138
|
+
|
|
139
|
+
- name: page-contacts
|
|
140
|
+
description: >
|
|
141
|
+
The contact details a PUBLIC page publishes, read with one plain HTTP GET (no
|
|
142
|
+
browser, no session, nothing clicked): emails from mailto links and visible
|
|
143
|
+
text (including "name [at] domain [dot] com"), profile links grouped by
|
|
144
|
+
platform (linkedin, x, youtube, instagram, ...), link-in-bio pages, and
|
|
145
|
+
affiliate-shaped links. Meant for link-in-bio pages and personal sites. A
|
|
146
|
+
4xx/5xx page returns reachable=false instead of an error.
|
|
147
|
+
args:
|
|
148
|
+
- {name: url, type: string, required: true, description: "Public page to read (link-in-bio, personal site)"}
|
|
149
|
+
- {name: timeout, type: integer, default: 20, description: "Request timeout in seconds"}
|
|
150
|
+
output_schema: '{ "url": "...", "final_url": "...", "status": 200, "content_type": "...", "reachable": true, "title": "...", "emails": ["..."], "links": {"linkedin": [], "x": [], "website": [], "link_in_bio": [], "...": []}, "affiliate_links": [ {url, host, network, program, param} ] }'
|
|
151
|
+
|
|
152
|
+
- name: render-pdf
|
|
153
|
+
description: "Render an HTML string/file to a PDF (session-less, headless Chromium page.pdf)."
|
|
154
|
+
args:
|
|
155
|
+
- {name: html, type: string, description: "Inline HTML string to render (exactly one of --html / --html-file)"}
|
|
156
|
+
- {name: html-file, type: string, description: "Path to an HTML file to render"}
|
|
157
|
+
- {name: out, type: string, required: true, description: "Output PDF path (.pdf)"}
|
|
158
|
+
- {name: format, type: string, default: A4, description: "Paper size: A4 (default) / Letter / Legal"}
|
|
159
|
+
- {name: width, type: string, description: "Custom page width as a CSS length, e.g. 1000mm (needs --height; overrides --format) - large-format print such as a roll-up or poster"}
|
|
160
|
+
- {name: height, type: string, description: "Custom page height as a CSS length, e.g. 2000mm (needs --width)"}
|
|
161
|
+
- {name: margin, type: string, description: "One CSS length for all four margins; 0 for full-bleed artwork. Default keeps the document margins (12/14/12/12 mm)"}
|
|
162
|
+
output_schema: '{ "out": "...", "bytes": 12345 }'
|
|
163
|
+
|
|
164
|
+
examples:
|
|
165
|
+
- cmd: python scripts/run-tool.py web save-session --name linkedin --url https://www.linkedin.com/login
|
|
166
|
+
output: '{"session": "linkedin", "path": ".../tools/web/sessions/linkedin.json", "url": "https://www.linkedin.com/login"}'
|
|
167
|
+
- cmd: 'python scripts/run-tool.py web archive-document --url https://example.com/terms --out-dir documentation/legal/existing --name terms'
|
|
168
|
+
output: '{"name": "terms", "dir": "...", "kind": "html", "title": "Terms", "sha256": {"original": "..."}, "files": {"original": "...", "self_contained": "...", "extraction": "..."}}'
|
|
169
|
+
- cmd: python scripts/run-tool.py web list-sessions
|
|
170
|
+
output: '{"sessions": [{"name": "linkedin", "bytes": 4096, "modified": "2026-06-22T09:00:00"}], "count": 1, "dir": "..."}'
|
|
171
|
+
- cmd: 'python scripts/run-tool.py web get-text --session linkedin --url https://www.linkedin.com/in/someone --selector main'
|
|
172
|
+
output: '{"session": "linkedin", "url": "...", "selector": "main", "text": "...", "final_url": "..."}'
|
|
173
|
+
- cmd: 'python scripts/run-tool.py web run --session linkedin --actions "[{\"do\":\"goto\",\"url\":\"https://www.linkedin.com/feed\"},{\"do\":\"extract_text\",\"selector\":\"h1\",\"name\":\"headline\"}]"'
|
|
174
|
+
output: '{"session": "linkedin", "results": {"headline": "..."}, "screenshots": [], "final_url": "..."}'
|
|
175
|
+
|
|
176
|
+
requires:
|
|
177
|
+
- name: playwright-chromium
|
|
178
|
+
kind: browser
|
|
179
|
+
why: >
|
|
180
|
+
every action that opens a browser. `uv sync` installs the Playwright PACKAGE,
|
|
181
|
+
not the browser binary - and Playwright is imported lazily, so the tool loads
|
|
182
|
+
and the tests pass while the first real action fails with browser_error.
|
|
183
|
+
check: '{python} -c "from playwright.sync_api import sync_playwright; p=sync_playwright().start(); p.chromium.executable_path; p.stop()"'
|
|
184
|
+
install: uv run playwright install chromium
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# xlsx
|
|
2
|
+
|
|
3
|
+
Read local Excel (`.xlsx` / `.xlsm`) workbooks. No credentials — operates on
|
|
4
|
+
local files. Built from a one-off script per the "scripts become tools"
|
|
5
|
+
directive, so reading Excel files is now a reusable, registered capability.
|
|
6
|
+
|
|
7
|
+
Native Google Sheets are read with the **google-sheets** tool; this tool is for
|
|
8
|
+
`.xlsx` blobs (e.g. files downloaded from Drive with `google-drive download-file`).
|
|
9
|
+
|
|
10
|
+
## Actions
|
|
11
|
+
|
|
12
|
+
```powershell
|
|
13
|
+
# List sheets + dimensions
|
|
14
|
+
python scripts/run-tool.py xlsx list-sheets --path "C:\path\book.xlsx"
|
|
15
|
+
|
|
16
|
+
# Read one sheet as a JSON 2D array (empty rows skipped, trailing blanks trimmed)
|
|
17
|
+
python scripts/run-tool.py xlsx read-sheet --path "C:\path\book.xlsx" --sheet "Data" --max-results 100
|
|
18
|
+
|
|
19
|
+
# Dump the whole workbook to readable text
|
|
20
|
+
python scripts/run-tool.py xlsx dump --path "C:\path\book.xlsx" --save out.txt
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Typical pipeline (Drive .xlsx -> read)
|
|
24
|
+
|
|
25
|
+
```powershell
|
|
26
|
+
python scripts/run-tool.py google-drive download-file --file-id <ID> --save book.xlsx
|
|
27
|
+
python scripts/run-tool.py xlsx dump --path book.xlsx --save book.txt
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Notes
|
|
31
|
+
- Cell values are JSON-safe; dates/times come back as ISO strings.
|
|
32
|
+
- UTF-8 throughout (Romanian diacritics etc. are preserved).
|
|
33
|
+
- `read-sheet` returns `{sheet, rows, truncated}`; `truncated` is true when
|
|
34
|
+
`--max-results` capped the output.
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: xlsx
|
|
3
|
+
description: Read local Excel (.xlsx/.xlsm) workbooks - list sheets, read a sheet as JSON, or dump the whole file to text. No credentials.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# xlsx
|
|
7
|
+
|
|
8
|
+
Read local Excel (.xlsx/.xlsm) workbooks - list sheets, read a sheet as JSON, or dump the whole file to text. No credentials.
|
|
9
|
+
|
|
10
|
+
## How to call it
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
python scripts/run-tool.py xlsx <action> [--args]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
One JSON object on stdout for success; `{"error": {"code", "message", "details"}}` and a non-zero exit on failure. Progress and logs go to stderr only.
|
|
17
|
+
|
|
18
|
+
## Actions
|
|
19
|
+
|
|
20
|
+
| action | required args | what it does |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| `dump` | `--path` | Dump the whole workbook to readable pipe-delimited text. |
|
|
23
|
+
| `list-sheets` | `--path` | List a workbook's sheets with row/column counts. |
|
|
24
|
+
| `read-sheet` | `--path` | Read one sheet's rows as a JSON 2D array (trailing-empty cells trimmed, empty rows skipped). |
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
Generated from `tools/xlsx/tool.yaml` by `scripts/build-tool-skill.py`. Do not edit by hand — change the manifest and regenerate.
|
|
File without changes
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""xlsx tool entrypoint - read local Excel (.xlsx/.xlsm) files. Action-dispatched.
|
|
2
|
+
|
|
3
|
+
No credentials (local files only). Built from the original ad-hoc dump_xlsx.py,
|
|
4
|
+
per the "scripts become tools" directive.
|
|
5
|
+
|
|
6
|
+
Actions:
|
|
7
|
+
list-sheets --path <f>
|
|
8
|
+
read-sheet --path <f> [--sheet NAME] [--max-rows N] [--raw]
|
|
9
|
+
dump --path <f> [--save OUT.txt] [--max-rows N]
|
|
10
|
+
"""
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import argparse
|
|
14
|
+
import sys
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from pathlib import Path
|
|
17
|
+
from typing import Callable
|
|
18
|
+
|
|
19
|
+
TOOL_ROOT = Path(__file__).resolve().parent
|
|
20
|
+
FRAMEWORK_ROOT = TOOL_ROOT.parents[1]
|
|
21
|
+
_VENV_PY = FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe"
|
|
22
|
+
if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
|
|
23
|
+
import subprocess
|
|
24
|
+
sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
|
|
25
|
+
|
|
26
|
+
if str(FRAMEWORK_ROOT) not in sys.path:
|
|
27
|
+
sys.path.insert(0, str(FRAMEWORK_ROOT))
|
|
28
|
+
|
|
29
|
+
from tools._lib.io import emit, fail # noqa: E402
|
|
30
|
+
from tools.xlsx import reader # noqa: E402
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class UsageError(Exception):
|
|
34
|
+
"""Bad/invalid arguments -> invalid_argument, exit 2."""
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
class _Parser(argparse.ArgumentParser):
|
|
38
|
+
def error(self, message: str):
|
|
39
|
+
raise UsageError(message)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class ActionDef:
|
|
44
|
+
func: Callable
|
|
45
|
+
add_args: Callable[[argparse.ArgumentParser], None]
|
|
46
|
+
description: str = ""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _list_sheets(args) -> dict:
|
|
50
|
+
return {"path": args.path, "sheets": reader.list_sheets(args.path)}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def _read_sheet(args) -> dict:
|
|
54
|
+
return reader.read_sheet(args.path, args.sheet, max_rows=args.max_results)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _dump(args) -> dict:
|
|
58
|
+
text = reader.dump_text(args.path, max_rows=args.max_results)
|
|
59
|
+
if args.save:
|
|
60
|
+
out = Path(args.save).resolve()
|
|
61
|
+
out.parent.mkdir(parents=True, exist_ok=True)
|
|
62
|
+
out.write_text(text, encoding="utf-8")
|
|
63
|
+
return {"savedTo": str(out), "characters": len(text)}
|
|
64
|
+
return {"text": text, "characters": len(text)}
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def _path_arg(p):
|
|
68
|
+
p.add_argument("--path", required=True, help="Local .xlsx/.xlsm file")
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _read_args(p):
|
|
72
|
+
_path_arg(p)
|
|
73
|
+
p.add_argument("--sheet", help="Sheet name (default: first/active)")
|
|
74
|
+
p.add_argument("--max-results", type=int, help="Cap rows returned")
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _dump_args(p):
|
|
78
|
+
_path_arg(p)
|
|
79
|
+
p.add_argument("--save", help="Write text dump here instead of inline")
|
|
80
|
+
p.add_argument("--max-results", type=int, help="Cap rows per sheet")
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
ACTIONS = {
|
|
84
|
+
"list-sheets": ActionDef(_list_sheets, _path_arg,
|
|
85
|
+
"List a workbook's sheets with row/column counts."),
|
|
86
|
+
"read-sheet": ActionDef(_read_sheet, _read_args,
|
|
87
|
+
"Read one sheet's rows as a JSON 2D array."),
|
|
88
|
+
"dump": ActionDef(_dump, _dump_args,
|
|
89
|
+
"Dump the whole workbook to readable text (--save or inline)."),
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def dispatch(action: str, argv: list[str]) -> dict:
|
|
94
|
+
if action not in ACTIONS:
|
|
95
|
+
raise UsageError(f"unknown action: {action}. Known: {', '.join(sorted(ACTIONS))}")
|
|
96
|
+
defn = ACTIONS[action]
|
|
97
|
+
parser = _Parser(prog=f"xlsx {action}", description=defn.description)
|
|
98
|
+
defn.add_args(parser)
|
|
99
|
+
return defn.func(parser.parse_args(argv))
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _classify(exc: Exception):
|
|
103
|
+
if isinstance(exc, UsageError):
|
|
104
|
+
return "invalid_argument", str(exc), 2
|
|
105
|
+
if isinstance(exc, FileNotFoundError):
|
|
106
|
+
return "not_found", str(exc), 1
|
|
107
|
+
if isinstance(exc, ValueError):
|
|
108
|
+
return "invalid_argument", str(exc), 2
|
|
109
|
+
return "error", str(exc) or exc.__class__.__name__, 1
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def main(argv=None) -> None:
|
|
113
|
+
argv = list(sys.argv[1:] if argv is None else argv)
|
|
114
|
+
if not argv or argv[0] in ("-h", "--help"):
|
|
115
|
+
print("Actions:", file=sys.stderr)
|
|
116
|
+
for name in sorted(ACTIONS):
|
|
117
|
+
print(f" {name:<14} {ACTIONS[name].description}", file=sys.stderr)
|
|
118
|
+
sys.exit(0)
|
|
119
|
+
action, rest = argv[0], argv[1:]
|
|
120
|
+
try:
|
|
121
|
+
result = dispatch(action, rest)
|
|
122
|
+
except Exception as exc: # noqa: BLE001
|
|
123
|
+
code, message, exit_code = _classify(exc)
|
|
124
|
+
fail(code, message, {}, exit_code)
|
|
125
|
+
emit(result)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
if __name__ == "__main__":
|
|
129
|
+
main()
|