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,279 @@
|
|
|
1
|
+
# PROCESIO — Node `Code` interpolation safety, and the credential-free run-history actions
|
|
2
|
+
|
|
3
|
+
Two hard-won build facts, generalized. Keep the specifics (datatype ids, action names,
|
|
4
|
+
param shapes) — they are the knowledge, not incidental to one case.
|
|
5
|
+
|
|
6
|
+
## 1. `<%N%>` substitution into a Node's `Code` is TEXT substitution, and only an OBJECT value is safe
|
|
7
|
+
|
|
8
|
+
A Node `Code` parameter binds variables to `<%0%>`, `<%1%>`, … in a `variable` list
|
|
9
|
+
(`[{id:N, variableId:…}]`); at run time each `<%N%>` is replaced **in the source text
|
|
10
|
+
before parsing**. What the replacement text is depends on the variable's **datatype**, and
|
|
11
|
+
the four contexts behave differently (measured, one hostile string `` IN${(6*7)}"q\Z `` in
|
|
12
|
+
each):
|
|
13
|
+
|
|
14
|
+
| how the value is written in the Code | a hostile STRING value | verdict |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| bare `const v = <%0%>;` | raw text → syntax error (the node fails) | unusable for strings |
|
|
17
|
+
| double-quote `const v = "<%0%>";` | a `"` in the value closes the string → syntax error | UNSAFE |
|
|
18
|
+
| **backtick `` const v = `<%0%>`; ``** | **`${…}` EXECUTES** (`${(6*7)}`→42); a backtick breaks the script | **UNSAFE — code injection** |
|
|
19
|
+
| **Object/Json datatype, bare `const o = <%0%>;` then read `o.field`** | JSON-encoded by the platform → the value is a proper JS literal, everything escaped | **SAFE** |
|
|
20
|
+
|
|
21
|
+
**So: a `"type":"string"` input spliced into a Code template is the injection signature.**
|
|
22
|
+
`${…}` only fires inside backtick template literals, so backticks are the dangerous case,
|
|
23
|
+
but double-quote and bare are not safe either (a quote/backslash/newline still breaks
|
|
24
|
+
them). The **only** injection-safe transport is an **Object/Json** variable
|
|
25
|
+
(datatype `0317bfee-b2f5-4bde-bfe8-121212121220`): the platform JSON-serialises it on
|
|
26
|
+
substitution.
|
|
27
|
+
|
|
28
|
+
**The fix ("structure transport"):** route scalar inputs through ONE Object input rather
|
|
29
|
+
than N String inputs. Declare one Object variable (e.g. `sifParams`), have the form/caller
|
|
30
|
+
populate its keys, and read `params.field` inside the node via bare Object injection. When
|
|
31
|
+
converting an existing process, rewrite the consuming nodes to read from the Object,
|
|
32
|
+
rebind their `Code` `variable` list to it, renumber the output placeholders, and **remove
|
|
33
|
+
the old String inputs** (a leftover `isRequired:true` String input makes publish reject a
|
|
34
|
+
run that omits it: `373 "Missing required input for variables: …"`). The values are
|
|
35
|
+
unchanged, so a deterministic output stays byte-identical.
|
|
36
|
+
|
|
37
|
+
⚠ **A null-valued injection is itself a defect.** When a bound variable is **null** at run
|
|
38
|
+
time, `<%N%>` substitutes **empty text**: `const v = <%N%> || x;` becomes `const v = || x;`
|
|
39
|
+
→ SyntaxError, which the platform **captures** (the instance still finishes status 50) and
|
|
40
|
+
the node's output is null — a silent failure. Any `<%N%>` whose variable can be null
|
|
41
|
+
(an optional output var, a file descriptor set on only one branch) must be written
|
|
42
|
+
**`[<%N%>][0]`** — `[][0]` = `undefined` on a null injection, `[value][0]` = value
|
|
43
|
+
otherwise. Read a node's error variable to catch this (`"Unexpected token '||'"` /
|
|
44
|
+
`"Unexpected token ';'"`).
|
|
45
|
+
|
|
46
|
+
## 2. A process can read its own workspace's run history in-flow, with NO credential
|
|
47
|
+
|
|
48
|
+
Three `isProcesioAction` built-ins carry **zero credential parameters** (the Call API v1/v2/v3
|
|
49
|
+
path needs a bound REST credential, which does not travel with a pack — avoid it):
|
|
50
|
+
|
|
51
|
+
- **Get Recent Instances** (`actionId cf514e01-…`) — inputs `Page Number` + `Page Item Count`
|
|
52
|
+
(required Integers; 0 = all), optional `Select Process` (flow-list) / `Process Template Id`
|
|
53
|
+
/ `Status type`; outputs `Result` and `Total Count`. ⚠ `Result` comes back as a **LIST of
|
|
54
|
+
run rows** (`{Id, Status, UpdatedOn}`, PascalCase), **carrying NO variable values** — the
|
|
55
|
+
outcome is per-instance. Read `Total Count`, not the row count (a short page reads like a
|
|
56
|
+
stable total).
|
|
57
|
+
- **Count Recent Instances** — outputs `Process Instances Count` (Integer); optional process-id
|
|
58
|
+
list (empty = whole workspace) + `Status type`.
|
|
59
|
+
- **Get Instance Outputs** (`actionId 98ab31ca-…`) — the per-run outcome. Needs `Select Process`
|
|
60
|
+
(flow-list = the target process id), **`InstanceId` (Guid datatype, NOT String — a String
|
|
61
|
+
var is rejected on save)**, and an `Output Variables` **process-outputs** mapping (the
|
|
62
|
+
selected process's output var → a local var). It wraps `GET /api/Projects/instances/{id}/output`.
|
|
63
|
+
|
|
64
|
+
**Build recipe (compact builder):** the count outputs need `"type":"integer"` (`"number"`
|
|
65
|
+
= Double, rejected `142 "Data type mismatch"`). `Get Recent Instances.Result` is one object
|
|
66
|
+
var. Express `Get Instance Outputs` with a `subprocess` key:
|
|
67
|
+
`{"action":"Get Instance Outputs","params":{"InstanceId":{"var":"topId"}},
|
|
68
|
+
"subprocess":{"target":<pid>,"outputs":{"localVar":<subOutputVarId>}}}`, and type the
|
|
69
|
+
`InstanceId` var as the Guid datatype via the builder's `"model":"0317bfee-b2f5-4bde-bfe8-121212121222"`
|
|
70
|
+
escape hatch. This lets a form → process → native-actions topology list runs, count them,
|
|
71
|
+
and show each run's summary with **no store, no credential, no foreign binding** — the
|
|
72
|
+
property a distributable pack needs. The card's side of the contract is one deliberate
|
|
73
|
+
OUTPUT-oriented variable (orientation 30) carrying the summary; `/status?getVariables`
|
|
74
|
+
returns its value in `defaultValue` and `/output` at `result.instance.variable[<name>]`
|
|
75
|
+
(NOT gated by `isArchived`). Proven end-to-end at UC7 E-164.
|
|
76
|
+
|
|
77
|
+
## 3. Editing a live Node's `Code` in place: fix BOTH copies (runtime param AND designer customData)
|
|
78
|
+
|
|
79
|
+
⚠ **A Node action carries the `Code` TWICE in the persisted flow**, and an in-place edit that touches
|
|
80
|
+
only one ships a stale card. The two copies (confirmed on a live store-write card, 2026-09-02):
|
|
81
|
+
|
|
82
|
+
- **`Flows[i].Actions[j].Parameters[k].Value`** — the RUNTIME copy. This is what the engine executes.
|
|
83
|
+
- **`Flows[i].Actions[j].CustomData.configuration[*].settings[*].value`** — the DESIGNER-layer copy
|
|
84
|
+
(the "Code" setting the designer shows and re-materialises from).
|
|
85
|
+
|
|
86
|
+
**Why it bites.** A binding-driven / spliced `put-projects` that rewrites only the runtime parameter
|
|
87
|
+
(e.g. to push a corrected engine body) leaves the customData copy STALE. Consequences: (1) the standing
|
|
88
|
+
card RUNS correctly (runtime wins at execution), so a happy-path run looks fine and hides the drift;
|
|
89
|
+
(2) **`export` serialises the customData copy**, so the exported pack carries the OLD body — a handover
|
|
90
|
+
pack that imports a stale card even though the source card ran the new one; (3) any designer re-save can
|
|
91
|
+
re-materialise the runtime FROM the stale customData, silently reverting your fix.
|
|
92
|
+
|
|
93
|
+
**The discipline.** When you edit a Node's `Code` on a live flow, replace it in **both** places, then
|
|
94
|
+
read the flow back and assert BOTH carry the new body (grep a marker that only the new body has, and a
|
|
95
|
+
marker only the old one had, on the runtime `Value` AND every `customData…settings…value`). Only then is
|
|
96
|
+
the card — and its export — actually on the new code. This is the specific, mechanical form of the
|
|
97
|
+
"read back, don't trust the write" rule (a `put:true` / HTTP 200 is not evidence the body changed, and it
|
|
98
|
+
is certainly not evidence that BOTH copies changed). A full rebuild through `process-create` regenerates
|
|
99
|
+
customData from the config and so avoids the split, but changes the flow id; editing in place (to keep a
|
|
100
|
+
standing card's id) is exactly when you must fix both copies.
|
|
101
|
+
|
|
102
|
+
## 4. A Node's `Code` can contain literal control characters, which `argv`-based editing cannot carry
|
|
103
|
+
|
|
104
|
+
A Node body is stored as a plain string field, so it can hold **literal control characters** — in
|
|
105
|
+
practice `\x00`, used as a composite-key separator because it cannot collide with real data:
|
|
106
|
+
|
|
107
|
+
```js
|
|
108
|
+
var key = r.SupplierID + "<0x00>" + r.CNCode; // renders as a space in every terminal and diff
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
Nothing marks such a line as unusual: a terminal, the designer and most diff views all render `\x00`
|
|
112
|
+
as a space. Two consequences for anyone editing a live body:
|
|
113
|
+
|
|
114
|
+
- **`node-replace-text` (and any tool that shells out) fails if `--find` or `--replace` contains one.**
|
|
115
|
+
Python's `subprocess` raises `ValueError: embedded null character` and rejects the *whole* command,
|
|
116
|
+
so the error names no argument and points nowhere near the line responsible. `grep` likewise reports
|
|
117
|
+
`Binary file … matches` and prints nothing — pass `-a` to search a captured body.
|
|
118
|
+
- **Never retype such a line.** Copying it by hand substitutes a space, and the code still runs: keys
|
|
119
|
+
simply stop matching, with no error at any layer.
|
|
120
|
+
|
|
121
|
+
Editing around it, in order of preference:
|
|
122
|
+
|
|
123
|
+
1. **Anchor on a NUL-free line.** Pick the nearest unique neighbouring line and insert before or after
|
|
124
|
+
it, instead of rewriting the line that carries the separator.
|
|
125
|
+
2. **Write the separator as a source-level escape** — `"\u0000"` — so the argument you pass is entirely
|
|
126
|
+
printable while the running code still builds the byte-identical key.
|
|
127
|
+
3. **Locate them before choosing an anchor**: capture the body (`node-params`), then print every line
|
|
128
|
+
where `'\x00' in line`. Do this first; it costs one read and removes the whole failure mode.
|
|
129
|
+
|
|
130
|
+
Corollary for the code itself: keep per-record state **on the record object** (`obj._budget = …`)
|
|
131
|
+
rather than in a side map keyed by the composite key — then no key has to be constructed, or typed,
|
|
132
|
+
at all.
|
|
133
|
+
|
|
134
|
+
As always, the edit must land on BOTH copies (§3): a NUL-free anchor is what makes `--expect 2`
|
|
135
|
+
usable here.
|
|
136
|
+
|
|
137
|
+
## 5. A `<%N%>` in your `--find` matches the RUNTIME layer only — expect 1, not 2
|
|
138
|
+
|
|
139
|
+
§3 says an in-place `Code` edit must reach both copies. That is still true, but the expected hit
|
|
140
|
+
count is **not always two**, and getting it wrong looks like a successful edit that never happened.
|
|
141
|
+
|
|
142
|
+
The two layers store placeholders differently:
|
|
143
|
+
|
|
144
|
+
| layer | path | how a bound variable appears |
|
|
145
|
+
|---|---|---|
|
|
146
|
+
| runtime | `parameters[…].value` | `var f = <%6%>;` — positional placeholder |
|
|
147
|
+
| designer | `customData.configuration[…].settings[…].value` | `var f = 6161830e-…;` — the variable's **GUID** |
|
|
148
|
+
|
|
149
|
+
So a `--find` that contains `<%N%>` can only ever match the runtime layer: `--expect 2` fails the
|
|
150
|
+
assertion and — correctly — **writes nothing**. A find whose text has no placeholder matches both
|
|
151
|
+
and gives the familiar `replacements=2 leaves=2`.
|
|
152
|
+
|
|
153
|
+
- Placeholder in the find → `--expect 1` (plus `--allow-binding-change`, which the tool demands
|
|
154
|
+
for any find/replace touching a placeholder even when the placeholder multiset is unchanged).
|
|
155
|
+
- No placeholder in the find → `--expect 2`.
|
|
156
|
+
|
|
157
|
+
After a runtime-layer hit the tool **regenerates the designer layer from runtime**, translating each
|
|
158
|
+
`<%N%>` back to its variable GUID, so both copies end up consistent from the single edit. Read back
|
|
159
|
+
and confirm that rather than assuming it — the check costs one call and is the whole of §3.
|
|
160
|
+
|
|
161
|
+
**A mismatched `--expect` reports the hit count it found, not an error.** Print the `put` field, not
|
|
162
|
+
just `replacements`: `put: false` is the difference between "edited" and "declined to edit".
|
|
163
|
+
|
|
164
|
+
**Never spell `<%N%>` out in prose inside the body.** Substitution is textual and does not respect
|
|
165
|
+
comments, so a placeholder written in a `/* … */` explanation is injected like any other occurrence —
|
|
166
|
+
it changes the binding footprint and can drop a value into the middle of your comment.
|
|
167
|
+
|
|
168
|
+
## 6. Clearing `isRequired` does not make a File input optional — a native File action rejects null
|
|
169
|
+
|
|
170
|
+
Making a File input genuinely optional takes **two** changes, and the flag is the lesser one.
|
|
171
|
+
|
|
172
|
+
1. **The Code node** must survive the absent value. A bare raw placeholder on the right of an
|
|
173
|
+
assignment (`var f = <%6%>;`) becomes `var f = ;` — a SyntaxError that kills the node before any
|
|
174
|
+
of its own diagnostics can run. Guard it as `[<%6%>][0]`, which yields `undefined` when absent and
|
|
175
|
+
the object when present. (Quoted placeholders — `"<%1%>"` — are already safe: they collapse to `""`.)
|
|
176
|
+
2. **Every upstream native action that consumes the file** must be branched around. A native
|
|
177
|
+
`File To Base64` fails the whole run with `Input file can't be null.` (status 40) — it has no
|
|
178
|
+
tolerant mode and no parameter that changes this. Clearing `isRequired` on its own therefore
|
|
179
|
+
converts a form that *blocks* the user into a run that *crashes* on them, which is strictly worse.
|
|
180
|
+
|
|
181
|
+
So the structural fix is a branch — a Decisional on "is the file null", with the encode on one leg
|
|
182
|
+
and an empty-string assignment to the base64 variable on the other — added via `process-edit`'s
|
|
183
|
+
desired-state config (there is no `node-add`). Until that branch exists, **leave the flag required**:
|
|
184
|
+
a required input is an honest constraint, an optional one that hard-fails is a defect.
|
|
185
|
+
|
|
186
|
+
Generalises to any native action that takes a File: test the absent case before you advertise the
|
|
187
|
+
input as optional.
|
|
188
|
+
|
|
189
|
+
## 7. `validate` does NOT parse the Node body — syntax-check it yourself
|
|
190
|
+
|
|
191
|
+
`node-replace-text` validates and flow-lints before it PUTs, and it will report `isValid: true` for a
|
|
192
|
+
body containing a **syntax error**. The platform validator checks the flow graph and parameter
|
|
193
|
+
shapes; it never parses the JavaScript. So a missing brace sails through validate, through the PUT,
|
|
194
|
+
and through publish.
|
|
195
|
+
|
|
196
|
+
At run time the node does not throw a catchable error — the body fails to compile, so the node's own
|
|
197
|
+
top-level `try { OUT = run(); } catch` never executes and the node returns **null**. What you see is
|
|
198
|
+
a downstream failure with a misleading message:
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
node: Write Workbook | type: Base64 To File
|
|
202
|
+
msg: Base64 string can't be null.
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
The named node is fine. The producer three steps upstream is the one that failed, silently. Read the
|
|
206
|
+
producer's output variable: `recon: null` with every text pane also `null` is the signature.
|
|
207
|
+
|
|
208
|
+
**Always syntax-check after editing a body**, with the placeholders neutralised so a real parser can
|
|
209
|
+
read it:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
python scripts/run-tool.py procesio node-params --id <flow> --node <node> > nc.json
|
|
213
|
+
# extract the body, then: src = re.sub(r'<%\d+%>', '0', body)
|
|
214
|
+
# wrap it in a function so `return` at top level is legal, and:
|
|
215
|
+
node --check nc.js
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
`node --check` reports the line. Do this before the run, not after: a run costs minutes and points
|
|
219
|
+
at the wrong node.
|
|
220
|
+
|
|
221
|
+
### The specific way this happens: a line-range FIND swallows an enclosing brace
|
|
222
|
+
|
|
223
|
+
Extracting `--find` as a slice of lines (`L[start:end]`) is convenient and dangerous. If the slice's
|
|
224
|
+
last line is a `}` that closes an **enclosing** block rather than one opened inside the slice, the
|
|
225
|
+
replacement must re-emit it. It is invisible in review because both the FIND and the REPLACE look
|
|
226
|
+
internally balanced:
|
|
227
|
+
|
|
228
|
+
```js
|
|
229
|
+
if (outer) { // opened BEFORE the slice
|
|
230
|
+
var x = f(); // <-- slice starts here
|
|
231
|
+
if (inner) { ... }
|
|
232
|
+
} // <-- slice ends here: this closes OUTER, not inner
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
Prefer a FIND anchored on syntactically complete text. When a line range is unavoidable, count braces
|
|
236
|
+
across the FIND and the REPLACE and require the deltas to match before writing.
|
|
237
|
+
|
|
238
|
+
## 8. Inserting an action into a live flow: two edits, and a casing trap
|
|
239
|
+
|
|
240
|
+
`node-insert` exists now. Two things make a hand-rolled version go wrong, and both fail *silently*
|
|
241
|
+
— the flow still validates.
|
|
242
|
+
|
|
243
|
+
**Ports live on the SOURCE action.** An edge is `{sourceId, destinationId}` stored on the node it
|
|
244
|
+
leaves. So inserting X between A and B is two edits, not one: give X a port to B, then repoint A's
|
|
245
|
+
port at X. Do only the first and X is unreachable; do only the second and everything after A is
|
|
246
|
+
orphaned. Neither is a validation error.
|
|
247
|
+
|
|
248
|
+
**The DTO builder emits PascalCase; a live flow is camelCase.** `_action_node()` returns
|
|
249
|
+
`{Id, FlowId, Ports, Parameters, CustomData}` — the CREATE shape — while `GET /api/Projects/{id}`
|
|
250
|
+
returns `{id, flowId, ports, parameters, customData}`. The API accepts both, so splicing one into
|
|
251
|
+
the other is accepted and then renders inconsistently in the designer. Convert with
|
|
252
|
+
`nodeparam.to_live_action()`, which also lowercases each `parameters` row
|
|
253
|
+
(`TabPropertyId` → `tabPropertyId`).
|
|
254
|
+
|
|
255
|
+
Refused rather than guessed: an anchor with more than one outgoing port. Which branch the new node
|
|
256
|
+
belongs on is a design decision.
|
|
257
|
+
|
|
258
|
+
**Related, and the reason this tool had to exist:** `process-edit` is a desired-state rebuild, so
|
|
259
|
+
adding one action to a 22-node flow through it means re-expressing the whole flow — including a
|
|
260
|
+
70 KB Node body — as config. `read-flow-graph` is an offline reader and does not produce that
|
|
261
|
+
config, so there is no round-trip.
|
|
262
|
+
|
|
263
|
+
## A `<%N%>` placeholder is injected RAW - quote it yourself for a string
|
|
264
|
+
|
|
265
|
+
The scripting actions substitute the value into the source text before it is parsed, so the
|
|
266
|
+
template has to supply the quotes for anything that is not already valid JavaScript on its own.
|
|
267
|
+
A list or object arrives as JSON and needs none; a **string does**:
|
|
268
|
+
|
|
269
|
+
```js
|
|
270
|
+
const isoDate = String('<%0%>' || ''); // right
|
|
271
|
+
const isoDate = String(<%0%> || ''); // wrong
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Unquoted, `2026-09-24` is parsed as arithmetic and silently becomes `1993`, and a date-shaped
|
|
275
|
+
string is the common case. There is no error: the script runs, the value is quietly wrong, and
|
|
276
|
+
the step returns an empty result. Cost an hour on a slot generator that answered "no times
|
|
277
|
+
available" for every day. The same applies to any free text - a name with an apostrophe in it
|
|
278
|
+
will end the string early, so a value that can contain quotes belongs in a JSON-serialised
|
|
279
|
+
object placeholder rather than an interpolated string.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
# PROCESIO `Node` (NodeJS) sandbox — module whitelist & I/O mechanics
|
|
2
|
+
|
|
3
|
+
What the platform's **`Node`** action (`e0fc20c3-e333-554c-a062-f64894db51dd`) can and
|
|
4
|
+
cannot `require`, how data enters and leaves it, and the consequences for building file
|
|
5
|
+
outputs. Probed live against a NodeJS `Node` action (`Timeout` 60–300; top-level `return`
|
|
6
|
+
sets the result). Reuse these facts before designing any Node-heavy flow (grouping,
|
|
7
|
+
dedupe, report/file generation) — they decide the whole architecture.
|
|
8
|
+
|
|
9
|
+
## Module availability — the sandbox is heavily locked down
|
|
10
|
+
|
|
11
|
+
Probed `require()` for each; **every external npm module failed** with
|
|
12
|
+
`Cannot find module '<name>'`:
|
|
13
|
+
|
|
14
|
+
| Probed | Result |
|
|
15
|
+
|---|---|
|
|
16
|
+
| `xlsx`, `exceljs`, `xlsx-populate`, `write-excel-file`, `node-xlsx` | ❌ not installed |
|
|
17
|
+
| `fast-xml-parser`, `xmlbuilder2` | ❌ not installed |
|
|
18
|
+
| `jszip`, `pako` | ❌ not installed |
|
|
19
|
+
|
|
20
|
+
Builtins are almost all blocked. Two are present:
|
|
21
|
+
|
|
22
|
+
| Builtin | `fs` | `zlib` | `buffer` | `child_process` | `os` | `path` | `crypto` | `https` |
|
|
23
|
+
|---|---|---|---|---|---|---|---|---|
|
|
24
|
+
| Available | ❌ | ❌ | ❌ | ❌ | ❌ | ❌ | ✅ | ✅ |
|
|
25
|
+
|
|
26
|
+
`process` is also restricted — reading `process.version` throws
|
|
27
|
+
`Cannot read properties of null (reading 'version')`. **Rule: assume a Node action has the
|
|
28
|
+
JS language plus `crypto` and `https`, and nothing else until probed.** No filesystem, no
|
|
29
|
+
`Buffer`, no compression, no shelling out, no npm. Guard any `process`/global reference in a
|
|
30
|
+
`try/catch` or it aborts the whole action.
|
|
31
|
+
|
|
32
|
+
> **CORRECTED 31/08/2026.** This file previously read *"only `crypto` is present"* and
|
|
33
|
+
> *"assume a Node action has the JS language + `crypto` only"*, while
|
|
34
|
+
> [PROCESIO-API-NOTES.md](PROCESIO-API-NOTES.md) recorded, from its own live probe, that
|
|
35
|
+
> **`require('https')` also works** and that an async `return new Promise(...)` resolves.
|
|
36
|
+
> Both were live-probe records, neither cited the other, and the narrower falsified rule sat
|
|
37
|
+
> in the file a reader opens to look module availability up. **The lesson generalises: a
|
|
38
|
+
> probe result states what was probed, not what exists.** `https` was never in this file's
|
|
39
|
+
> probe set, so its absence from the table was an untested gap being read as a negative
|
|
40
|
+
> result. When a note says "only X is present", record the probe set beside it.
|
|
41
|
+
|
|
42
|
+
## Consequence for Excel: build the .xlsx in pure JS (no library)
|
|
43
|
+
|
|
44
|
+
Because there is **no `Buffer`/`zlib`/xlsx lib**, and because the catalogue's `XLS To XLSX`
|
|
45
|
+
converter **rejects** SpreadsheetML 2003 (verbatim: *"The supplied data appears to be a raw
|
|
46
|
+
XML file. Formats such as Office 2003 XML are not supported"*), the only way to emit a
|
|
47
|
+
genuine **single-file, multi-sheet** `.xlsx` is to author the OOXML package by hand inside
|
|
48
|
+
the Node action:
|
|
49
|
+
|
|
50
|
+
- Build each part's XML as a string (`[Content_Types].xml`, `_rels/.rels`,
|
|
51
|
+
`xl/workbook.xml`, `xl/_rels/workbook.xml.rels`, `xl/worksheets/sheetN.xml`), using
|
|
52
|
+
`t="inlineStr"` cells so no `sharedStrings`/`styles` parts are needed.
|
|
53
|
+
- Pack them into a **ZIP with STORED (method 0, uncompressed) entries** — a stored ZIP
|
|
54
|
+
needs only CRC-32 (implementable as a pure-JS table) and correct local-header /
|
|
55
|
+
central-directory / EOCD byte layout; **no compression, so `zlib` is not required**.
|
|
56
|
+
- UTF-8-encode strings by hand (no `Buffer`), CRC-32 by hand, base64-encode the byte array
|
|
57
|
+
by hand, then feed that base64 to the catalogue action **`Base64 To File`**
|
|
58
|
+
(`6fad5599-…`) → a real `.xlsx` File (MIME
|
|
59
|
+
`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`).
|
|
60
|
+
|
|
61
|
+
This was verified end to end (openpyxl re-opened the result: correct sheet names, string
|
|
62
|
+
headers, numeric cells typed as numbers). It is the **preferred multi-sheet path** — one
|
|
63
|
+
file, real sheets, only two actions (`Node` + `Base64 To File`) — and beats the fallbacks:
|
|
64
|
+
`Export To XLSX` writes **one sheet from a list**; `Create Workbook`/`Insert Sheet` create
|
|
65
|
+
only **empty** sheets (no catalogue action writes data into an existing sheet). A reusable
|
|
66
|
+
pure-JS writer (`AAT_XLSX.build(sheets)`) lives with the VAT-reconciliation build assets.
|
|
67
|
+
|
|
68
|
+
## How data ENTERS a Node — `<%N%>` injection, materialised
|
|
69
|
+
|
|
70
|
+
A Node reads flow variables only through **`<%N%>` placeholders in the `Code`** (bind the
|
|
71
|
+
`Code` param with `{template, vars:[...]}`; index is global across the action's params):
|
|
72
|
+
|
|
73
|
+
- A **list/object** variable injects as its **actual JSON value** — `var rows = <%0%>;`
|
|
74
|
+
yields the real array/object (verified: a parsed CSV list arrived as a JS array of
|
|
75
|
+
objects). So one Node can consume several upstream datasets at once.
|
|
76
|
+
- A **string** variable injects as a **bare, unquoted token** — you must quote it yourself:
|
|
77
|
+
`var p = "<%1%>";`. Consequently a caller-controlled string is injected into source
|
|
78
|
+
before your code runs; treat it as untrusted (a stray `"` breaks the script). Prefer
|
|
79
|
+
passing untrusted text inside a JSON list/object channel (JSON-escaped) rather than as a
|
|
80
|
+
raw quoted scalar.
|
|
81
|
+
- An **optional number** with no value injects as **nothing** (`var t = <%5%>;` →
|
|
82
|
+
syntax error). Give optional numeric inputs a default, or don't inject them.
|
|
83
|
+
|
|
84
|
+
## How data LEAVES a Node, and why you often need extractor Nodes
|
|
85
|
+
|
|
86
|
+
A Node has exactly three output props: **`Single Result`** (scalar/object, raw — no
|
|
87
|
+
wrapper), **`List Result`** (list), **`Error`** (string; note scripting errors are also
|
|
88
|
+
reported here, they do **not** take the error port). `Javascript` instead wraps as
|
|
89
|
+
`{result: v}` — prefer **`Node`** for clean typed output.
|
|
90
|
+
|
|
91
|
+
**Attribute-path binding does NOT work on a generic Json/Object variable.** Binding a
|
|
92
|
+
downstream param to `{var:"bundle", path:["reportHtml"]}` fails BE validation with
|
|
93
|
+
`Error converting value "reportHtml" to type 'System.Guid'` — the platform expects the
|
|
94
|
+
attribute to be a **DataModel attribute GUID**, which a schemaless Json object doesn't
|
|
95
|
+
have. So you cannot fan a single Node's object result out to several consumers by sub-path.
|
|
96
|
+
Two ways around it:
|
|
97
|
+
|
|
98
|
+
1. **Extractor Nodes** (used here): the producing Node returns the whole bundle to a
|
|
99
|
+
process var; a tiny Node per consumer injects the bundle and `return`s the one field it
|
|
100
|
+
needs as a clean `Single Result`, which binds directly. Cheap and reliable; keep large
|
|
101
|
+
strings (HTML, base64) out of the re-injected bundle so they aren't serialised N times.
|
|
102
|
+
2. Define a **DataModel** (`datatype-create`) for the bundle so its attributes have GUIDs,
|
|
103
|
+
then `{var,path}` binding resolves.
|
|
104
|
+
|
|
105
|
+
## CSV reading — `Read Range from CSV`, not `File To JSON`
|
|
106
|
+
|
|
107
|
+
`File To JSON` (`fd9d7d38-…`) **rejects non-JSON**: `File extension should be '.json',
|
|
108
|
+
found => .csv`. Use **`Read Range from CSV`** (`9c9cc774-…`): params `CSV file` (file),
|
|
109
|
+
`Range` (e.g. `A1:Z1000` — clips to actual data, no empty padding), `Values` (output). It
|
|
110
|
+
returns a **list of row objects keyed by column letter** (`{A,B,C,D,…}`), **row 0 is the
|
|
111
|
+
header row**, and numeric-looking cells arrive as **JS numbers**. Read the header row to map
|
|
112
|
+
column-name → letter so the flow is robust to column reordering and can detect optional
|
|
113
|
+
columns.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
# PROCESIO `Python` scripting action — libraries, I/O, and the model problem
|
|
2
|
+
|
|
3
|
+
What the platform documents about the **Python** scripting action, and the traps that
|
|
4
|
+
follow from it. Everything here is **vendor-documented** unless a line says otherwise;
|
|
5
|
+
none of it has been executed against a live instance from this framework. Companion notes:
|
|
6
|
+
[`PROCESIO-NODE-MODULE-WHITELIST.md`](PROCESIO-NODE-MODULE-WHITELIST.md) (probed live) and
|
|
7
|
+
[`PROCESIO-CUSTOM-ACTION-NOTES.md`](PROCESIO-CUSTOM-ACTION-NOTES.md).
|
|
8
|
+
|
|
9
|
+
> ## ⚠ A scripting action that returns an ARRAY must bind "List Result"
|
|
10
|
+
>
|
|
11
|
+
> Verified live on a `Node` action, 31/08/2026; the property pair is the same
|
|
12
|
+
> shape on the scripting actions generally.
|
|
13
|
+
>
|
|
14
|
+
> A scripting action exposes **two** result properties, and they are not
|
|
15
|
+
> interchangeable:
|
|
16
|
+
>
|
|
17
|
+
> | property | binds |
|
|
18
|
+
> |---|---|
|
|
19
|
+
> | `Single Result` | a scalar or an object |
|
|
20
|
+
> | `List Result` | an **array** |
|
|
21
|
+
>
|
|
22
|
+
> Returning an array while bound to `Single Result` stores **null**. There is no
|
|
23
|
+
> error on the action, no error variable is set, and the instance still reaches
|
|
24
|
+
> status 50 — the run looks completely healthy while the payload is gone. A
|
|
25
|
+
> sibling action publishing a COUNT from the same object succeeds, which makes it
|
|
26
|
+
> worse: the run reports "3 entities" beside a null entity list.
|
|
27
|
+
>
|
|
28
|
+
> The receiving variable must ALSO be declared `isList: true`. Both halves are
|
|
29
|
+
> required and each fails the same silent way on its own.
|
|
30
|
+
>
|
|
31
|
+
> **Diagnosing it from downstream.** When a later action reports a JavaScript
|
|
32
|
+
> parse error such as `Unexpected token ';'`, that is a NULL upstream variable,
|
|
33
|
+
> not a syntax problem. `<%N%>` is a TEXTUAL substitution into the script source,
|
|
34
|
+
> so a null variable interpolates to nothing and what the engine compiles is
|
|
35
|
+
> `var o = ;`. Read that error as "the variable upstream is empty" and look at
|
|
36
|
+
> what wrote it. By the same mechanism a raw string interpolates UNQUOTED and
|
|
37
|
+
> yields `Unexpected identifier` — which is why a string input has to ride inside
|
|
38
|
+
> an object wrapper (`{"v": "..."}`) and be unwrapped in the script.
|
|
39
|
+
|
|
40
|
+
## Preinstalled libraries
|
|
41
|
+
|
|
42
|
+
`matplotlib 3.7.0`, `beautifulsoup4 4.12.0`, `scipy 1.10.1`, `PyPDF2 3.0.1`,
|
|
43
|
+
`pandas 2.0.3`, `pdfplumber 0.11.4`, `spacy 3.8.4`, `staticmap 0.5.7`, `pillow 12.1.1`.
|
|
44
|
+
|
|
45
|
+
**The same documentation page contradicts this list.** An earlier callout on it says the
|
|
46
|
+
Python action "has a list of available libraries to be used: JSON, Base64". Treat the
|
|
47
|
+
nine-package table as the current statement and the callout as stale, and **verify by
|
|
48
|
+
importing before designing against any of them** — the two readings differ by everything.
|
|
49
|
+
|
|
50
|
+
**No route to add a library is documented**, and `pip install` appears nowhere in the
|
|
51
|
+
documentation corpus. Assume the set is closed.
|
|
52
|
+
|
|
53
|
+
## What is NOT documented — check before relying on any of it
|
|
54
|
+
|
|
55
|
+
- **The Python version.** Stated nowhere. This matters more than it looks: library and
|
|
56
|
+
model wheels pin interpreter and framework ranges, so an unknown interpreter cannot be
|
|
57
|
+
reconciled with a pinned dependency on paper.
|
|
58
|
+
- **Network access.** Never mentioned, and no HTTP client is on the list (no `requests`,
|
|
59
|
+
no `httpx`). Do not assume a script can reach out.
|
|
60
|
+
- **A writable path.** The docs say plainly that files cannot be added in a Python script.
|
|
61
|
+
Nothing describes a temp directory, a working directory, or a cache.
|
|
62
|
+
- **Persistence between invocations.** Nothing survives, as far as the documentation says
|
|
63
|
+
anything at all.
|
|
64
|
+
- **Timeout, memory ceiling, payload size.** None documented. The Node action documents a
|
|
65
|
+
timeout; the Python action documents none.
|
|
66
|
+
|
|
67
|
+
## I/O mechanics — two traps
|
|
68
|
+
|
|
69
|
+
**Output is whatever the script PRINTS**, wrapped as `{"result": ...}`. To get at the
|
|
70
|
+
value, follow the action with a **JSON Mapper** using query `$.result`. Design for that
|
|
71
|
+
extra hop rather than binding the Python output directly.
|
|
72
|
+
|
|
73
|
+
**⚠ Input is textual substitution into the source before execution.** The documentation is
|
|
74
|
+
explicit: PROCESIO "replaces the variable with the value of the variable and then utilizes
|
|
75
|
+
it within the code". So `x = <%myvar%>` pastes the raw value into the script.
|
|
76
|
+
|
|
77
|
+
The consequence is the same one recorded for the Node action, and it bites hardest exactly
|
|
78
|
+
where scripting looks most attractive: **any script whose input is untrusted, multi-line,
|
|
79
|
+
or quote-bearing text is unsafe through a raw scalar substitution.** A stray quote breaks
|
|
80
|
+
the script; a crafted string executes. **Pass untrusted text through a JSON or object
|
|
81
|
+
channel** so it arrives escaped, and treat even that as unverified until measured.
|
|
82
|
+
|
|
83
|
+
## Working with files — the base64 bridge
|
|
84
|
+
|
|
85
|
+
A Python script cannot open a file. The documented mechanism is a bridge through process
|
|
86
|
+
variables:
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
File variable → [File to BASE64] → string → <%var%> → Python script
|
|
90
|
+
Python string result → [Base64 to File] → File variable
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
That is the platform's intended file channel for **every** scripting action, not just
|
|
94
|
+
Python. It is not a file system, and it makes the file content transit the script's source
|
|
95
|
+
text, so the substitution trap above applies to it directly.
|
|
96
|
+
|
|
97
|
+
## ⚠ `spacy` is on the list; a spacy MODEL is not
|
|
98
|
+
|
|
99
|
+
This is the trap worth writing down, because "the NLP library is available" reads as a
|
|
100
|
+
capability and is not one.
|
|
101
|
+
|
|
102
|
+
- **`spacy` ships no model.** `import spacy` succeeds and `spacy.blank("en")` gives a
|
|
103
|
+
tokeniser whose `.ents` is empty forever. **A library without a model does no NER.**
|
|
104
|
+
- **Models are separate packages** and none is documented as preinstalled. Loading one at
|
|
105
|
+
runtime would need **network** (undocumented) and **a writable cache** (documented
|
|
106
|
+
absent), then would need to survive between invocations (undocumented). `spacy.load`
|
|
107
|
+
takes a directory path, so bytes arriving over the base64 bridge still need somewhere to
|
|
108
|
+
land.
|
|
109
|
+
- Sizes are real: `en_core_web_sm` 3.8.0 is **12.8 MB**, `xx_ent_wiki_sm` 3.8.0 is
|
|
110
|
+
**11.1 MB** (measured from the wheels). A model re-fetched per invocation is a cost line,
|
|
111
|
+
not a detector.
|
|
112
|
+
|
|
113
|
+
**Before promising NER on this route, execute exactly one thing: `spacy.load` on a
|
|
114
|
+
plausible model name.** Everything else is downstream of that answer.
|
|
115
|
+
|
|
116
|
+
### Model facts worth having to hand, all read from the wheels' own metadata
|
|
117
|
+
|
|
118
|
+
| Model | Licence | Languages | NER labels |
|
|
119
|
+
|---|---|---|---|
|
|
120
|
+
| `en_core_web_sm` 3.8.0 | **MIT** (weights) | **English only** | 18: CARDINAL, DATE, EVENT, FAC, GPE, LANGUAGE, LAW, LOC, MONEY, NORP, ORDINAL, ORG, PERCENT, PERSON, PRODUCT, QUANTITY, TIME, WORK_OF_ART |
|
|
121
|
+
| `xx_ent_wiki_sm` 3.8.0 | **MIT** (weights) | multilingual, **WikiNER languages — European, no Arabic** | **4**: LOC, MISC, ORG, PER |
|
|
122
|
+
|
|
123
|
+
**Package licence and training provenance are different questions, and a compliance review
|
|
124
|
+
will ask about both.** `en_core_web_sm` ships MIT weights and a `LICENSES_SOURCES` file
|
|
125
|
+
recording that its training corpus, OntoNotes 5, is **"commercial (licensed by
|
|
126
|
+
Explosion)"**. `xx_ent_wiki_sm` is trained on WikiNER under **CC BY 4.0**. Read the shipped
|
|
127
|
+
licence files, not the package licence alone.
|
|
128
|
+
|
|
129
|
+
**Other NER stacks are absent**: no `transformers`, no `torch`, no `gliner`, no `stanza`,
|
|
130
|
+
no `flair`. Any design that assumed a transformer-based or zero-shot detector inside the
|
|
131
|
+
Python action needs a different home for it.
|
|
132
|
+
|
|
133
|
+
## Where the compute runs, and why it matters for sizing
|
|
134
|
+
|
|
135
|
+
A Python action executes **inside the Execution Environment**. An external detector behind
|
|
136
|
+
a Call API is I/O wait, which at least raises the question of releasing the EE while it
|
|
137
|
+
waits. **In-action inference never raises that question: the EE is held for the whole
|
|
138
|
+
computation.** So moving model work into a Python action trades an integration for
|
|
139
|
+
occupancy, and the fleet sizing has to be recomputed rather than inherited.
|
|
140
|
+
|
|
141
|
+
> ## ⚠ An object-typed input reports its shape as `{}` — and a bare string reaches the API as an empty body
|
|
142
|
+
>
|
|
143
|
+
> Verified live on a `Node`-based flow driven through `run-process`.
|
|
144
|
+
>
|
|
145
|
+
> `get-process-payload` is the authority on what a process expects, and it
|
|
146
|
+
> distinguishes the two cases: a string-typed input renders as `""`, an
|
|
147
|
+
> object-typed one as `{}`. An input showing `{}` is **not** a string variable,
|
|
148
|
+
> whatever its name suggests, and the scripts downstream will unwrap it (the
|
|
149
|
+
> convention here is `{"v": "<the string>"}` unwrapped as `text.v`). Passing the
|
|
150
|
+
> bare string instead interpolates unquoted into the `<%N%>` textual
|
|
151
|
+
> substitution and the node throws.
|
|
152
|
+
>
|
|
153
|
+
> **Why this is worth a note rather than a shrug: the failure arrives as a
|
|
154
|
+
> plausible success.** Every node in the chain throws, so the variable feeding
|
|
155
|
+
> the `Call API` body is null, so the platform posts an **empty body** — and the
|
|
156
|
+
> remote service answers **200**. The instance reaches status 50. Read from the
|
|
157
|
+
> status alone, the run is indistinguishable from a document in which the
|
|
158
|
+
> detector correctly found nothing. The tell is in the response body, where a
|
|
159
|
+
> well-built service says so (`warnings: ["empty input"]`, zero chunks). Read
|
|
160
|
+
> the body, not the status, and check an early-stage variable — a null where a
|
|
161
|
+
> local computation should have produced a value means the input never bound.
|
|
162
|
+
>
|
|
163
|
+
> The same trap applies to any required object input: a script that validates
|
|
164
|
+
> its config (`if (!cfg || !cfg.recognisers) throw`) takes the whole chain down
|
|
165
|
+
> when the caller omits it, and the run still reports as completed.
|