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.
Files changed (647) hide show
  1. procesio_cli/__init__.py +18 -0
  2. procesio_cli/_cli.py +71 -0
  3. procesio_cli/agents/__init__.py +0 -0
  4. procesio_cli/agents/_lib/__init__.py +0 -0
  5. procesio_cli/agents/_lib/actiondef.py +24 -0
  6. procesio_cli/agents/_lib/errors.py +40 -0
  7. procesio_cli/agents/_lib/reversibility.py +236 -0
  8. procesio_cli/agents/_lib/toolrunner.py +141 -0
  9. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PLAYBOOK.md +62 -0
  10. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-PROCESIO-INTEROP.md +76 -0
  11. procesio_cli/agents/connector-builder/CONNECTOR-BUILDER-TROUBLESHOOTING.md +60 -0
  12. procesio_cli/agents/connector-builder/README.md +51 -0
  13. procesio_cli/agents/connector-builder/agent.yaml +61 -0
  14. procesio_cli/agents/connector-builder/context.py +19 -0
  15. procesio_cli/agents/connector-builder/handlers/__init__.py +1 -0
  16. procesio_cli/agents/connector-builder/handlers/checklist.py +71 -0
  17. procesio_cli/agents/connector-builder/handlers/guidance.py +37 -0
  18. procesio_cli/agents/connector-builder/handlers/nextstep.py +221 -0
  19. procesio_cli/agents/connector-builder/handlers/status.py +35 -0
  20. procesio_cli/agents/connector-builder/knowledge.py +47 -0
  21. procesio_cli/agents/connector-builder/main.py +93 -0
  22. procesio_cli/agents/connector-builder/tests/conftest.py +95 -0
  23. procesio_cli/agents/connector-builder/tests/test_cba_agent.py +148 -0
  24. procesio_cli/agents/orchestrator/__init__.py +0 -0
  25. procesio_cli/agents/orchestrator/bootstraplib.py +166 -0
  26. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/00-INDEX.md +60 -0
  27. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/01-PROCESSES.md +230 -0
  28. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/02-FORMS.md +287 -0
  29. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/03-INTEGRATIONS.md +384 -0
  30. procesio_cli/agents/procesio/IMPLEMENTATION-PATTERNS/04-DATABASE.md +293 -0
  31. procesio_cli/agents/procesio/PROCESIO-API-RELIABILITY-DOCTRINE.md +113 -0
  32. procesio_cli/agents/procesio/PROCESIO-BEST-PRACTICES.md +316 -0
  33. procesio_cli/agents/procesio/PROCESIO-BUILD-AND-TEST-PLAYBOOK.md +217 -0
  34. procesio_cli/agents/procesio/PROCESIO-DATASTORE.md +72 -0
  35. procesio_cli/agents/procesio/PROCESIO-ENVIRONMENTS.md +62 -0
  36. procesio_cli/agents/procesio/PROCESIO-SCHEDULING.md +47 -0
  37. procesio_cli/agents/procesio/PROCESIO-VISUAL-ORGANIZATION.md +175 -0
  38. procesio_cli/agents/procesio/README.md +97 -0
  39. procesio_cli/agents/procesio/__init__.py +0 -0
  40. procesio_cli/agents/procesio/agent.yaml +73 -0
  41. procesio_cli/agents/procesio/audit.py +226 -0
  42. procesio_cli/agents/procesio/checklist.py +135 -0
  43. procesio_cli/agents/procesio/context.py +19 -0
  44. procesio_cli/agents/procesio/handlers/__init__.py +0 -0
  45. procesio_cli/agents/procesio/handlers/audit.py +39 -0
  46. procesio_cli/agents/procesio/handlers/checklist.py +34 -0
  47. procesio_cli/agents/procesio/handlers/guidance.py +36 -0
  48. procesio_cli/agents/procesio/handlers/status.py +33 -0
  49. procesio_cli/agents/procesio/handlers/verify.py +39 -0
  50. procesio_cli/agents/procesio/knowledge.py +115 -0
  51. procesio_cli/agents/procesio/main.py +89 -0
  52. procesio_cli/agents/procesio/tests/__init__.py +0 -0
  53. procesio_cli/agents/procesio/tests/conftest.py +62 -0
  54. procesio_cli/agents/procesio/tests/test_audit.py +91 -0
  55. procesio_cli/agents/procesio/tests/test_checklist.py +28 -0
  56. procesio_cli/agents/procesio/tests/test_guidance.py +78 -0
  57. procesio_cli/agents/procesio/tests/test_manifest_sync.py +48 -0
  58. procesio_cli/agents/procesio/tests/test_verify.py +134 -0
  59. procesio_cli/agents/procesio/tests/test_workspace_scope.py +97 -0
  60. procesio_cli/agents/procesio/verifylib.py +222 -0
  61. procesio_cli/dashboard/README.md +117 -0
  62. procesio_cli/dashboard/__init__.py +18 -0
  63. procesio_cli/dashboard/serve.py +98 -0
  64. procesio_cli/dashboard/server/__init__.py +1 -0
  65. procesio_cli/dashboard/server/config_schemas.py +92 -0
  66. procesio_cli/dashboard/server/google.py +103 -0
  67. procesio_cli/dashboard/server/handler.py +160 -0
  68. procesio_cli/dashboard/server/inventory.py +213 -0
  69. procesio_cli/dashboard/server/jobs.py +118 -0
  70. procesio_cli/dashboard/server/llmtest.py +181 -0
  71. procesio_cli/dashboard/server/procesio_env.py +94 -0
  72. procesio_cli/dashboard/server/routes.py +74 -0
  73. procesio_cli/dashboard/server/runner.py +150 -0
  74. procesio_cli/dashboard/server/security.py +29 -0
  75. procesio_cli/dashboard/server/setup.py +211 -0
  76. procesio_cli/dashboard/server/validate.py +152 -0
  77. procesio_cli/dashboard/tests/conftest.py +16 -0
  78. procesio_cli/dashboard/tests/test_dashboard.py +225 -0
  79. procesio_cli/dashboard/tests/test_procesio_env.py +159 -0
  80. procesio_cli/dashboard/web/actions.js +274 -0
  81. procesio_cli/dashboard/web/api.js +79 -0
  82. procesio_cli/dashboard/web/app.js +385 -0
  83. procesio_cli/dashboard/web/copilot.js +72 -0
  84. procesio_cli/dashboard/web/google.js +121 -0
  85. procesio_cli/dashboard/web/index.html +67 -0
  86. procesio_cli/dashboard/web/procesio_env.js +187 -0
  87. procesio_cli/dashboard/web/styles.css +207 -0
  88. procesio_cli/registry.py +370 -0
  89. procesio_cli/scripts/build-router.py +249 -0
  90. procesio_cli/scripts/build-tool-skill.py +202 -0
  91. procesio_cli/scripts/check-requirements.py +131 -0
  92. procesio_cli/scripts/check-skill-governance.py +174 -0
  93. procesio_cli/scripts/evaluate-skill-routing.py +217 -0
  94. procesio_cli/scripts/evaluate-skills.py +316 -0
  95. procesio_cli/scripts/get-skill.py +122 -0
  96. procesio_cli/scripts/list-skills.py +68 -0
  97. procesio_cli/scripts/list-tools.py +73 -0
  98. procesio_cli/scripts/run-agent.py +59 -0
  99. procesio_cli/scripts/run-tool.py +123 -0
  100. procesio_cli/scripts/secret_scan.py +584 -0
  101. procesio_cli/scripts/set-credential.py +126 -0
  102. procesio_cli/scripts/validate-skills.py +530 -0
  103. procesio_cli/skills/PORTFOLIO.md +134 -0
  104. procesio_cli/skills/__init__.py +6 -0
  105. procesio_cli/skills/agent-skill-engineer/SKILL.md +226 -0
  106. procesio_cli/skills/agent-skill-engineer/evals/evals.json +422 -0
  107. procesio_cli/skills/agent-skill-engineer/references/authoring-standard.md +178 -0
  108. procesio_cli/skills/agent-skill-engineer/references/decision-framework.md +107 -0
  109. procesio_cli/skills/agent-skill-engineer/references/domain-evidence-protocol.md +248 -0
  110. procesio_cli/skills/agent-skill-engineer/references/evaluation-standard.md +191 -0
  111. procesio_cli/skills/agent-skill-engineer/references/expert-lenses.md +167 -0
  112. procesio_cli/skills/agent-skill-engineer/references/field-gate-standard.md +231 -0
  113. procesio_cli/skills/agent-skill-engineer/references/optimization-protocol.md +233 -0
  114. procesio_cli/skills/agent-skill-engineer/references/optimizer-contract.md +268 -0
  115. procesio_cli/skills/agent-skill-engineer/references/portability-standard.md +99 -0
  116. procesio_cli/skills/agent-skill-engineer/references/research-basis.md +128 -0
  117. procesio_cli/skills/agent-skill-engineer/references/review-standard.md +143 -0
  118. procesio_cli/skills/agent-skill-engineer/scripts/audit_skill.py +959 -0
  119. procesio_cli/skills/agent-skill-engineer/scripts/optimize_skill.py +891 -0
  120. procesio_cli/skills/agent-skill-engineer/scripts/scaffold_skill.py +397 -0
  121. procesio_cli/skills/evals/baseline-catalog.json +14 -0
  122. procesio_cli/skills/evals/baseline-routing-v2.json +38 -0
  123. procesio_cli/skills/evals/baseline.json +37 -0
  124. procesio_cli/skills/evals/behavioral.json +367 -0
  125. procesio_cli/skills/evals/field-boundary-development-v1.json +126 -0
  126. procesio_cli/skills/evals/field-closeout-correction-development-v1.json +23 -0
  127. procesio_cli/skills/evals/field-closeout-development-v1.json +89 -0
  128. procesio_cli/skills/evals/portfolio-pressure-training-v1.json +83 -0
  129. procesio_cli/skills/evals/routing.json +363 -0
  130. procesio_cli/skills/evals/validation-baseline.json +4 -0
  131. procesio_cli/skills/procesio-cli/SKILL.md +134 -0
  132. procesio_cli/skills/procesio-cli/evals/evals.json +111 -0
  133. procesio_cli/skills/procesio-cli/evals/workflows.json +16 -0
  134. procesio_cli/skills/procesio-cli/references/connector-lifecycle.md +47 -0
  135. procesio_cli/skills/procesio-cli/references/credentials-admin.md +113 -0
  136. procesio_cli/skills/procesio-cli/references/data-verification.md +71 -0
  137. procesio_cli/skills/procesio-cli/references/documents-files.md +44 -0
  138. procesio_cli/skills/procesio-cli/references/form-e2e.md +57 -0
  139. procesio_cli/skills/procesio-cli/references/operation-contract.md +138 -0
  140. procesio_cli/skills/procesio-cli/references/process-debugging.md +65 -0
  141. procesio_cli/skills/procesio-cli/references/process-lifecycle.md +88 -0
  142. procesio_cli/skills/procesio-cli/references/schedules-webhooks.md +58 -0
  143. procesio_cli/skills/procesio-cli/references/transport-environments.md +53 -0
  144. procesio_cli/skills/procesio-cli-maintainer/SKILL.md +84 -0
  145. procesio_cli/skills/procesio-cli-maintainer/evals/evals.json +116 -0
  146. procesio_cli/skills/procesio-cli-maintainer/references/change-contract.md +34 -0
  147. procesio_cli/skills/procesio-cli-maintainer/references/mcp-compatibility.md +13 -0
  148. procesio_cli/skills/procesio-cli-maintainer/references/skill-authoring.md +51 -0
  149. procesio_cli/skills/procesio-platform-advisor/SKILL.md +82 -0
  150. procesio_cli/skills/procesio-platform-advisor/evals/evals.json +116 -0
  151. procesio_cli/skills/procesio-platform-advisor/references/capability-map.md +22 -0
  152. procesio_cli/skills/procesio-platform-advisor/references/fit-framework.md +35 -0
  153. procesio_cli/skills/procesio-platform-advisor/references/freshness-policy.md +25 -0
  154. procesio_cli/skills/procesio-platform-advisor/references/sizing-method.md +70 -0
  155. procesio_cli/skills/procesio-platform-advisor/scripts/estimate_capacity.py +99 -0
  156. procesio_cli/skills/procesio-setup/SKILL.md +180 -0
  157. procesio_cli/skills/sql-server-optimizer/SKILL.md +86 -0
  158. procesio_cli/skills/sql-server-optimizer/evals/evals.json +116 -0
  159. procesio_cli/skills/sql-server-optimizer/references/db-context.md +44 -0
  160. procesio_cli/skills/sql-server-optimizer/references/generic-mode.md +32 -0
  161. procesio_cli/skills/sql-server-optimizer/references/procesio-mode.md +40 -0
  162. procesio_cli/skills/sql-server-optimizer/references/sql-rules.md +43 -0
  163. procesio_cli/skills/sql-server-optimizer/scripts/export-indexes.sql +178 -0
  164. procesio_cli/skills/sql-server-optimizer/scripts/export-procs-and-functions.sql +118 -0
  165. procesio_cli/skills/sql-server-optimizer/scripts/export-tables.sql +367 -0
  166. procesio_cli/skills/tests/__init__.py +0 -0
  167. procesio_cli/skills/tests/test_agent_skill_engineer.py +240 -0
  168. procesio_cli/skills/tests/test_auth_failure_stop.py +25 -0
  169. procesio_cli/skills/tests/test_capacity_estimator.py +85 -0
  170. procesio_cli/skills/tests/test_field_boundary_learning.py +100 -0
  171. procesio_cli/skills/tests/test_field_closeout_learning.py +123 -0
  172. procesio_cli/skills/tests/test_field_gate_standard.py +76 -0
  173. procesio_cli/skills/tests/test_operational_playbooks.py +51 -0
  174. procesio_cli/skills/tests/test_portfolio_pressure_training.py +35 -0
  175. procesio_cli/skills/tests/test_process_lifecycle_single_run.py +25 -0
  176. procesio_cli/skills/tests/test_skill_evaluator.py +67 -0
  177. procesio_cli/skills/tests/test_skill_optimizer.py +473 -0
  178. procesio_cli/skills/tests/test_skill_portfolio_review.py +70 -0
  179. procesio_cli/skills/tests/test_skill_release_binding.py +204 -0
  180. procesio_cli/skills/tests/test_skill_routing.py +74 -0
  181. procesio_cli/skills/tests/test_skill_scaffold_v2.py +116 -0
  182. procesio_cli/skills/tests/test_validate_skills.py +115 -0
  183. procesio_cli/tools/__init__.py +0 -0
  184. procesio_cli/tools/_lib/README.md +119 -0
  185. procesio_cli/tools/_lib/__init__.py +0 -0
  186. procesio_cli/tools/_lib/accounting.py +120 -0
  187. procesio_cli/tools/_lib/contacts.py +544 -0
  188. procesio_cli/tools/_lib/creds.py +83 -0
  189. procesio_cli/tools/_lib/creds_backends.py +578 -0
  190. procesio_cli/tools/_lib/dbprofiles.py +147 -0
  191. procesio_cli/tools/_lib/dbquery.py +286 -0
  192. procesio_cli/tools/_lib/dbschema.py +225 -0
  193. procesio_cli/tools/_lib/io.py +54 -0
  194. procesio_cli/tools/_lib/manifest.py +297 -0
  195. procesio_cli/tools/_lib/skill_release.py +127 -0
  196. procesio_cli/tools/_lib/skill_resources.py +118 -0
  197. procesio_cli/tools/_lib/userdata.py +228 -0
  198. procesio_cli/tools/_lib/webserialize/__init__.py +16 -0
  199. procesio_cli/tools/_lib/webserialize/admin.py +61 -0
  200. procesio_cli/tools/_lib/webserialize/client.py +264 -0
  201. procesio_cli/tools/_lib/webserialize/config.py +96 -0
  202. procesio_cli/tools/_lib/webserialize/errors.py +27 -0
  203. procesio_cli/tools/_lib/webserialize/framing.py +45 -0
  204. procesio_cli/tools/_lib/webserialize/registry.py +47 -0
  205. procesio_cli/tools/_lib/webserialize/runtime.py +61 -0
  206. procesio_cli/tools/_lib/webserialize/server.py +510 -0
  207. procesio_cli/tools/_lib/websession.py +194 -0
  208. procesio_cli/tools/connector-builder/CONNECTOR-BUILDER-API-NOTES.md +91 -0
  209. procesio_cli/tools/connector-builder/README.md +101 -0
  210. procesio_cli/tools/connector-builder/SKILL.md +248 -0
  211. procesio_cli/tools/connector-builder/__init__.py +7 -0
  212. procesio_cli/tools/connector-builder/actiondef.py +24 -0
  213. procesio_cli/tools/connector-builder/client.py +251 -0
  214. procesio_cli/tools/connector-builder/errors.py +44 -0
  215. procesio_cli/tools/connector-builder/gen_manifest.py +142 -0
  216. procesio_cli/tools/connector-builder/handlers/__init__.py +1 -0
  217. procesio_cli/tools/connector-builder/handlers/admin.py +182 -0
  218. procesio_cli/tools/connector-builder/handlers/auth.py +74 -0
  219. procesio_cli/tools/connector-builder/handlers/builds.py +396 -0
  220. procesio_cli/tools/connector-builder/handlers/common.py +104 -0
  221. procesio_cli/tools/connector-builder/handlers/files.py +111 -0
  222. procesio_cli/tools/connector-builder/handlers/raw.py +38 -0
  223. procesio_cli/tools/connector-builder/handlers/telemetry.py +39 -0
  224. procesio_cli/tools/connector-builder/main.py +94 -0
  225. procesio_cli/tools/connector-builder/tests/conftest.py +146 -0
  226. procesio_cli/tools/connector-builder/tests/test_cb_client.py +86 -0
  227. procesio_cli/tools/connector-builder/tests/test_cb_dispatch.py +105 -0
  228. procesio_cli/tools/connector-builder/tests/test_cb_manifest_sync.py +76 -0
  229. procesio_cli/tools/connector-builder/tests/test_cb_wait.py +123 -0
  230. procesio_cli/tools/connector-builder/tool.yaml +671 -0
  231. procesio_cli/tools/framework-map/.gitattributes +2 -0
  232. procesio_cli/tools/framework-map/README.md +98 -0
  233. procesio_cli/tools/framework-map/SKILL.md +30 -0
  234. procesio_cli/tools/framework-map/app.js +188 -0
  235. procesio_cli/tools/framework-map/fm_builder.py +476 -0
  236. procesio_cli/tools/framework-map/fm_catalog.py +19 -0
  237. procesio_cli/tools/framework-map/fm_ro_catalog.py +94 -0
  238. procesio_cli/tools/framework-map/fm_strings.py +101 -0
  239. procesio_cli/tools/framework-map/main.py +95 -0
  240. procesio_cli/tools/framework-map/styles.css +214 -0
  241. procesio_cli/tools/framework-map/tests/conftest.py +33 -0
  242. procesio_cli/tools/framework-map/tests/test_fm_build.py +126 -0
  243. procesio_cli/tools/framework-map/tests/test_fm_manifest_sync.py +63 -0
  244. procesio_cli/tools/framework-map/tests/test_fm_store_tree.py +75 -0
  245. procesio_cli/tools/framework-map/tool.yaml +61 -0
  246. procesio_cli/tools/mysql/MOVED-TO-CENTRAL.md +29 -0
  247. procesio_cli/tools/mysql/README.md +196 -0
  248. procesio_cli/tools/mysql/SKILL.md +37 -0
  249. procesio_cli/tools/mysql/__init__.py +0 -0
  250. procesio_cli/tools/mysql/connection.py +191 -0
  251. procesio_cli/tools/mysql/main.py +487 -0
  252. procesio_cli/tools/mysql/profiles.template.json +1 -0
  253. procesio_cli/tools/mysql/schema.py +434 -0
  254. procesio_cli/tools/mysql/tests/__init__.py +0 -0
  255. procesio_cli/tools/mysql/tests/conftest.py +21 -0
  256. procesio_cli/tools/mysql/tests/test_manifest_sync.py +68 -0
  257. procesio_cli/tools/mysql/tests/test_mysql.py +201 -0
  258. procesio_cli/tools/mysql/tests/test_mysql_schema.py +337 -0
  259. procesio_cli/tools/mysql/tool.yaml +112 -0
  260. procesio_cli/tools/procesio/DTO-SUBTOOLS-NOTE.md +360 -0
  261. procesio_cli/tools/procesio/FORM-DEV-GUIDE/00-INDEX.md +67 -0
  262. procesio_cli/tools/procesio/FORM-DEV-GUIDE/01-ANATOMY.md +209 -0
  263. procesio_cli/tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md +309 -0
  264. procesio_cli/tools/procesio/FORM-DEV-GUIDE/03-DOM-CONTRACT.md +370 -0
  265. procesio_cli/tools/procesio/FORM-DEV-GUIDE/04-INTERACTION-RECIPES.md +600 -0
  266. procesio_cli/tools/procesio/FORM-DEV-GUIDE/05-STEPPER-AND-MOTION.md +426 -0
  267. procesio_cli/tools/procesio/FORM-DEV-GUIDE/06-PROCESS-INTEGRATION.md +347 -0
  268. procesio_cli/tools/procesio/FORM-DEV-GUIDE/07-DEPLOY-WORKFLOW.md +294 -0
  269. procesio_cli/tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md +569 -0
  270. procesio_cli/tools/procesio/FORM-DEV-GUIDE/09-NAVIGATION-AND-HOSTING.md +308 -0
  271. procesio_cli/tools/procesio/PHASE4-E2E-NOTES.md +594 -0
  272. procesio_cli/tools/procesio/PROCESIO-API-CORRECTIONS.md +295 -0
  273. procesio_cli/tools/procesio/PROCESIO-API-NOTES.md +6976 -0
  274. procesio_cli/tools/procesio/PROCESIO-AUTH-NOTES.md +226 -0
  275. procesio_cli/tools/procesio/PROCESIO-CARD-BUILD-NOTES.md +183 -0
  276. procesio_cli/tools/procesio/PROCESIO-CONNECTORS-NOTES.md +141 -0
  277. procesio_cli/tools/procesio/PROCESIO-CUSTOM-ACTION-NOTES.md +179 -0
  278. procesio_cli/tools/procesio/PROCESIO-DOCS-FIX-REPORT.md +123 -0
  279. procesio_cli/tools/procesio/PROCESIO-ENVIRONMENTS-NOTES.md +94 -0
  280. procesio_cli/tools/procesio/PROCESIO-FE-VALIDATION-NOTES.md +107 -0
  281. procesio_cli/tools/procesio/PROCESIO-FOREACH-NOTES.md +199 -0
  282. procesio_cli/tools/procesio/PROCESIO-FORM-API-HANG-NOTE.md +101 -0
  283. procesio_cli/tools/procesio/PROCESIO-FORM-SUBMISSION-NOTES.md +172 -0
  284. procesio_cli/tools/procesio/PROCESIO-HTML-TO-DOCX-NOTES.md +110 -0
  285. procesio_cli/tools/procesio/PROCESIO-INSTANCE-HISTORY-NOTES.md +242 -0
  286. procesio_cli/tools/procesio/PROCESIO-METERING-NOTES.md +201 -0
  287. procesio_cli/tools/procesio/PROCESIO-NODE-CODE-NOTES.md +279 -0
  288. procesio_cli/tools/procesio/PROCESIO-NODE-MODULE-WHITELIST.md +113 -0
  289. procesio_cli/tools/procesio/PROCESIO-PYTHON-ACTION-NOTES.md +165 -0
  290. procesio_cli/tools/procesio/PROCESIO-QUERY-STORE-NOTES.md +826 -0
  291. procesio_cli/tools/procesio/PROCESIO-RECONCILIATION-PATTERNS.md +104 -0
  292. procesio_cli/tools/procesio/PROCESIO-RESOURCE-MODEL-NOTES.md +1100 -0
  293. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-CRED-OPTIONALITY.md +45 -0
  294. procesio_cli/tools/procesio/PROCESIO-SEND-EMAIL-NOTES.md +252 -0
  295. procesio_cli/tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md +284 -0
  296. procesio_cli/tools/procesio/PROCESIO-USAGE-GUIDE.md +219 -0
  297. procesio_cli/tools/procesio/README.md +341 -0
  298. procesio_cli/tools/procesio/SCHEDULE-INPUT-SECURITY-NOTES.md +63 -0
  299. procesio_cli/tools/procesio/SKILL.md +694 -0
  300. procesio_cli/tools/procesio/__init__.py +1 -0
  301. procesio_cli/tools/procesio/actiondef.py +27 -0
  302. procesio_cli/tools/procesio/assets/html2docx/html2docx.js +2155 -0
  303. procesio_cli/tools/procesio/auth.py +354 -0
  304. procesio_cli/tools/procesio/autogen.py +121 -0
  305. procesio_cli/tools/procesio/client.py +355 -0
  306. procesio_cli/tools/procesio/config.py +96 -0
  307. procesio_cli/tools/procesio/data/endpoints.json +2901 -0
  308. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/01-authentication.md +180 -0
  309. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/02-conventions.md +116 -0
  310. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/ANONYMOUS-SURFACE.md +51 -0
  311. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/README.md +104 -0
  312. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/SYMBOL-INDEX.md +444 -0
  313. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/03-auth-users-workspaces.md +731 -0
  314. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/04-processes.md +913 -0
  315. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/05-actions.md +605 -0
  316. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/06-files.md +237 -0
  317. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/07-forms-documents.md +985 -0
  318. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/08-credentials.md +532 -0
  319. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/09-datastore-datatypes.md +830 -0
  320. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/10-custom-urls.md +319 -0
  321. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/11-subscriptions-resources-analytics.md +455 -0
  322. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/12-webhooks-notifications-misc.md +519 -0
  323. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/13-realtime-signalr.md +153 -0
  324. procesio_cli/tools/procesio/docs_info/API-DOCUMENTATION/endpoints/99-internal-and-other-services.md +52 -0
  325. procesio_cli/tools/procesio/docs_info/FormBuilder mock.ts +5725 -0
  326. procesio_cli/tools/procesio/docs_info/Procesio Platform Actions.json +30219 -0
  327. procesio_cli/tools/procesio/docs_info/form-config-enums.ts +92 -0
  328. procesio_cli/tools/procesio/docs_info/form-theme.ts +1603 -0
  329. procesio_cli/tools/procesio/docs_info/process-validation-reference-1.md +2739 -0
  330. procesio_cli/tools/procesio/dto/__init__.py +13 -0
  331. procesio_cli/tools/procesio/dto/credential/builder.py +179 -0
  332. procesio_cli/tools/procesio/dto/credential/config.schema.json +19 -0
  333. procesio_cli/tools/procesio/dto/credential/description.md +193 -0
  334. procesio_cli/tools/procesio/dto/credential/fixtures/rest.config.json +11 -0
  335. procesio_cli/tools/procesio/dto/credential/fixtures/rest.dto.json +28 -0
  336. procesio_cli/tools/procesio/dto/credential/fixtures/rest.template.json +44 -0
  337. procesio_cli/tools/procesio/dto/credential/template.dto.json +16 -0
  338. procesio_cli/tools/procesio/dto/data/_refresh.py +147 -0
  339. procesio_cli/tools/procesio/dto/data/action_catalog.json +30825 -0
  340. procesio_cli/tools/procesio/dto/data/action_families.json +55 -0
  341. procesio_cli/tools/procesio/dto/data/platform_types.json +182 -0
  342. procesio_cli/tools/procesio/dto/datatype/builder.py +223 -0
  343. procesio_cli/tools/procesio/dto/datatype/config.schema.json +47 -0
  344. procesio_cli/tools/procesio/dto/datatype/description.md +85 -0
  345. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.config.json +41 -0
  346. procesio_cli/tools/procesio/dto/datatype/fixtures/customer.dto.json +164 -0
  347. procesio_cli/tools/procesio/dto/datatype/template.dto.json +37 -0
  348. procesio_cli/tools/procesio/dto/document/builder.py +193 -0
  349. procesio_cli/tools/procesio/dto/document/config.schema.json +33 -0
  350. procesio_cli/tools/procesio/dto/document/description.md +124 -0
  351. procesio_cli/tools/procesio/dto/document/fixtures/invoice.config.json +16 -0
  352. procesio_cli/tools/procesio/dto/document/fixtures/invoice.dto.json +32 -0
  353. procesio_cli/tools/procesio/dto/document/template.dto.json +14 -0
  354. procesio_cli/tools/procesio/dto/form/FORM-STYLING-NOTES.md +142 -0
  355. procesio_cli/tools/procesio/dto/form/GOLDEN-DRIFT-NOTES.md +72 -0
  356. procesio_cli/tools/procesio/dto/form/RUN-PROCESS-RESULT-NOTES.md +80 -0
  357. procesio_cli/tools/procesio/dto/form/addelement.py +277 -0
  358. procesio_cli/tools/procesio/dto/form/builder.py +1009 -0
  359. procesio_cli/tools/procesio/dto/form/capture_goldens.py +106 -0
  360. procesio_cli/tools/procesio/dto/form/code_cipher.py +67 -0
  361. procesio_cli/tools/procesio/dto/form/config.schema.json +76 -0
  362. procesio_cli/tools/procesio/dto/form/data_shell.json +1 -0
  363. procesio_cli/tools/procesio/dto/form/description.md +346 -0
  364. procesio_cli/tools/procesio/dto/form/elements/approval.json +259 -0
  365. procesio_cli/tools/procesio/dto/form/elements/assignee.json +137 -0
  366. procesio_cli/tools/procesio/dto/form/elements/button.json +125 -0
  367. procesio_cli/tools/procesio/dto/form/elements/chart.json +341 -0
  368. procesio_cli/tools/procesio/dto/form/elements/chat.json +199 -0
  369. procesio_cli/tools/procesio/dto/form/elements/checkbox.json +153 -0
  370. procesio_cli/tools/procesio/dto/form/elements/column.json +77 -0
  371. procesio_cli/tools/procesio/dto/form/elements/columns.json +78 -0
  372. procesio_cli/tools/procesio/dto/form/elements/datetime-input.json +304 -0
  373. procesio_cli/tools/procesio/dto/form/elements/divider.json +54 -0
  374. procesio_cli/tools/procesio/dto/form/elements/dropdown.json +130 -0
  375. procesio_cli/tools/procesio/dto/form/elements/dynamic-table-row.json +253 -0
  376. procesio_cli/tools/procesio/dto/form/elements/file-upload.json +196 -0
  377. procesio_cli/tools/procesio/dto/form/elements/file-viewer.json +169 -0
  378. procesio_cli/tools/procesio/dto/form/elements/heading.json +79 -0
  379. procesio_cli/tools/procesio/dto/form/elements/icon.json +107 -0
  380. procesio_cli/tools/procesio/dto/form/elements/image.json +174 -0
  381. procesio_cli/tools/procesio/dto/form/elements/input.json +206 -0
  382. procesio_cli/tools/procesio/dto/form/elements/list.json +202 -0
  383. procesio_cli/tools/procesio/dto/form/elements/number-input.json +202 -0
  384. procesio_cli/tools/procesio/dto/form/elements/paragraph.json +79 -0
  385. procesio_cli/tools/procesio/dto/form/elements/radiobox.json +174 -0
  386. procesio_cli/tools/procesio/dto/form/elements/section.json +114 -0
  387. procesio_cli/tools/procesio/dto/form/elements/select.json +217 -0
  388. procesio_cli/tools/procesio/dto/form/elements/side-panel.json +146 -0
  389. procesio_cli/tools/procesio/dto/form/elements/signature-pad.json +141 -0
  390. procesio_cli/tools/procesio/dto/form/elements/static-table-row.json +84 -0
  391. procesio_cli/tools/procesio/dto/form/elements/step.json +105 -0
  392. procesio_cli/tools/procesio/dto/form/elements/stepper.json +126 -0
  393. procesio_cli/tools/procesio/dto/form/elements/tab.json +77 -0
  394. procesio_cli/tools/procesio/dto/form/elements/table.json +279 -0
  395. procesio_cli/tools/procesio/dto/form/elements/tabs.json +114 -0
  396. procesio_cli/tools/procesio/dto/form/elements/textarea.json +213 -0
  397. procesio_cli/tools/procesio/dto/form/enum_map.json +68 -0
  398. procesio_cli/tools/procesio/dto/form/fieldpath.py +284 -0
  399. procesio_cli/tools/procesio/dto/form/fixtures/reg.config.json +32 -0
  400. procesio_cli/tools/procesio/dto/form/fixtures/reg.elements.json +638 -0
  401. procesio_cli/tools/procesio/dto/form/sync_from_mock.py +386 -0
  402. procesio_cli/tools/procesio/dto/framework.py +125 -0
  403. procesio_cli/tools/procesio/dto/process/builder.py +1991 -0
  404. procesio_cli/tools/procesio/dto/process/config.schema.json +159 -0
  405. procesio_cli/tools/procesio/dto/process/description.md +218 -0
  406. procesio_cli/tools/procesio/dto/process/fixtures/greet.config.json +32 -0
  407. procesio_cli/tools/procesio/dto/process/fixtures/greet.dto.json +317 -0
  408. procesio_cli/tools/procesio/dto/process/naming.py +305 -0
  409. procesio_cli/tools/procesio/dto/process/normalize.py +74 -0
  410. procesio_cli/tools/procesio/dto/process/template.dto.json +32 -0
  411. procesio_cli/tools/procesio/dto/refdata.py +87 -0
  412. procesio_cli/tools/procesio/dto/registry.py +27 -0
  413. procesio_cli/tools/procesio/dto/webhook/builder.py +142 -0
  414. procesio_cli/tools/procesio/dto/webhook/config.schema.json +25 -0
  415. procesio_cli/tools/procesio/dto/webhook/description.md +92 -0
  416. procesio_cli/tools/procesio/dto/webhook/fixtures/order.config.json +10 -0
  417. procesio_cli/tools/procesio/dto/webhook/fixtures/order.dto.json +25 -0
  418. procesio_cli/tools/procesio/dto/webhook/template.dto.json +14 -0
  419. procesio_cli/tools/procesio/environments.py +264 -0
  420. procesio_cli/tools/procesio/errors.py +166 -0
  421. procesio_cli/tools/procesio/flowmodel/README.md +37 -0
  422. procesio_cli/tools/procesio/flowmodel/__init__.py +14 -0
  423. procesio_cli/tools/procesio/flowmodel/digest.py +223 -0
  424. procesio_cli/tools/procesio/flowmodel/families.py +34 -0
  425. procesio_cli/tools/procesio/flowmodel/fevalidation.py +1098 -0
  426. procesio_cli/tools/procesio/flowmodel/formdigest.py +232 -0
  427. procesio_cli/tools/procesio/flowmodel/inspect.py +78 -0
  428. procesio_cli/tools/procesio/flowmodel/model.py +82 -0
  429. procesio_cli/tools/procesio/flowmodel/nodeparam.py +871 -0
  430. procesio_cli/tools/procesio/flowmodel/reader.py +191 -0
  431. procesio_cli/tools/procesio/flowmodel/sqlparam.py +410 -0
  432. procesio_cli/tools/procesio/form_code_keys.py +50 -0
  433. procesio_cli/tools/procesio/formlint.py +292 -0
  434. procesio_cli/tools/procesio/gen_manifest.py +118 -0
  435. procesio_cli/tools/procesio/handlers/__init__.py +1 -0
  436. procesio_cli/tools/procesio/handlers/auth_actions.py +103 -0
  437. procesio_cli/tools/procesio/handlers/catalog.py +147 -0
  438. procesio_cli/tools/procesio/handlers/common.py +90 -0
  439. procesio_cli/tools/procesio/handlers/customaction_ops.py +146 -0
  440. procesio_cli/tools/procesio/handlers/datastore_ops.py +482 -0
  441. procesio_cli/tools/procesio/handlers/datatype_ops.py +275 -0
  442. procesio_cli/tools/procesio/handlers/dto_actions.py +258 -0
  443. procesio_cli/tools/procesio/handlers/environment_admin.py +146 -0
  444. procesio_cli/tools/procesio/handlers/fevalidate.py +236 -0
  445. procesio_cli/tools/procesio/handlers/files.py +141 -0
  446. procesio_cli/tools/procesio/handlers/flowgraph.py +229 -0
  447. procesio_cli/tools/procesio/handlers/flowlint.py +269 -0
  448. procesio_cli/tools/procesio/handlers/form_chains.py +336 -0
  449. procesio_cli/tools/procesio/handlers/form_code.py +277 -0
  450. procesio_cli/tools/procesio/handlers/form_element.py +199 -0
  451. procesio_cli/tools/procesio/handlers/form_events.py +441 -0
  452. procesio_cli/tools/procesio/handlers/form_update.py +270 -0
  453. procesio_cli/tools/procesio/handlers/formprocess.py +211 -0
  454. procesio_cli/tools/procesio/handlers/generic.py +135 -0
  455. procesio_cli/tools/procesio/handlers/layout.py +137 -0
  456. procesio_cli/tools/procesio/handlers/nodeparams.py +1018 -0
  457. procesio_cli/tools/procesio/handlers/process_layout.py +189 -0
  458. procesio_cli/tools/procesio/handlers/process_naming.py +213 -0
  459. procesio_cli/tools/procesio/handlers/processes.py +416 -0
  460. procesio_cli/tools/procesio/handlers/profile_admin.py +184 -0
  461. procesio_cli/tools/procesio/handlers/resource_ops.py +447 -0
  462. procesio_cli/tools/procesio/handlers/schedules.py +320 -0
  463. procesio_cli/tools/procesio/handlers/sqlactions.py +232 -0
  464. procesio_cli/tools/procesio/handlers/transport.py +463 -0
  465. procesio_cli/tools/procesio/handlers/usageguide.py +222 -0
  466. procesio_cli/tools/procesio/layout/README.md +196 -0
  467. procesio_cli/tools/procesio/layout/__init__.py +11 -0
  468. procesio_cli/tools/procesio/layout/adapter.py +736 -0
  469. procesio_cli/tools/procesio/layout/cycles.py +186 -0
  470. procesio_cli/tools/procesio/layout/dispatch.py +39 -0
  471. procesio_cli/tools/procesio/layout/elk/elk_runner.mjs +50 -0
  472. procesio_cli/tools/procesio/layout/elk/package-lock.json +21 -0
  473. procesio_cli/tools/procesio/layout/elk/package.json +11 -0
  474. procesio_cli/tools/procesio/layout/elk_engine.py +568 -0
  475. procesio_cli/tools/procesio/layout/engine.py +1311 -0
  476. procesio_cli/tools/procesio/layout/report.py +187 -0
  477. procesio_cli/tools/procesio/main.py +179 -0
  478. procesio_cli/tools/procesio/profiles.py +193 -0
  479. procesio_cli/tools/procesio/reliability.py +193 -0
  480. procesio_cli/tools/procesio/sqlformat.py +167 -0
  481. procesio_cli/tools/procesio/swagger.py +51 -0
  482. procesio_cli/tools/procesio/tests/__init__.py +0 -0
  483. procesio_cli/tools/procesio/tests/conftest.py +129 -0
  484. procesio_cli/tools/procesio/tests/test_auth.py +200 -0
  485. procesio_cli/tools/procesio/tests/test_autogen.py +78 -0
  486. procesio_cli/tools/procesio/tests/test_builder_attrpath_sqlbind.py +180 -0
  487. procesio_cli/tools/procesio/tests/test_builder_custom_action_catalog.py +72 -0
  488. procesio_cli/tools/procesio/tests/test_client.py +114 -0
  489. procesio_cli/tools/procesio/tests/test_client_reliability.py +139 -0
  490. procesio_cli/tools/procesio/tests/test_customaction.py +103 -0
  491. procesio_cli/tools/procesio/tests/test_customaction_test.py +80 -0
  492. procesio_cli/tools/procesio/tests/test_cycles.py +69 -0
  493. procesio_cli/tools/procesio/tests/test_datastore.py +378 -0
  494. procesio_cli/tools/procesio/tests/test_datastore_node.py +94 -0
  495. procesio_cli/tools/procesio/tests/test_dispatch.py +170 -0
  496. procesio_cli/tools/procesio/tests/test_document_page_size.py +19 -0
  497. procesio_cli/tools/procesio/tests/test_dto.py +734 -0
  498. procesio_cli/tools/procesio/tests/test_edit_dryrun_preview.py +96 -0
  499. procesio_cli/tools/procesio/tests/test_elk_layout.py +221 -0
  500. procesio_cli/tools/procesio/tests/test_environments.py +214 -0
  501. procesio_cli/tools/procesio/tests/test_fevalidate_gate.py +104 -0
  502. procesio_cli/tools/procesio/tests/test_fevalidation.py +317 -0
  503. procesio_cli/tools/procesio/tests/test_fieldpath_variables.py +87 -0
  504. procesio_cli/tools/procesio/tests/test_files.py +72 -0
  505. procesio_cli/tools/procesio/tests/test_flow_digest.py +202 -0
  506. procesio_cli/tools/procesio/tests/test_flowlint.py +114 -0
  507. procesio_cli/tools/procesio/tests/test_flowmodel.py +158 -0
  508. procesio_cli/tools/procesio/tests/test_form_add_element.py +256 -0
  509. procesio_cli/tools/procesio/tests/test_form_approval_gaps.py +319 -0
  510. procesio_cli/tools/procesio/tests/test_form_auto_names.py +60 -0
  511. procesio_cli/tools/procesio/tests/test_form_chains.py +217 -0
  512. procesio_cli/tools/procesio/tests/test_form_code_actions.py +188 -0
  513. procesio_cli/tools/procesio/tests/test_form_code_keys.py +92 -0
  514. procesio_cli/tools/procesio/tests/test_form_code_style.py +178 -0
  515. procesio_cli/tools/procesio/tests/test_form_delete_element.py +99 -0
  516. procesio_cli/tools/procesio/tests/test_form_element_config.py +141 -0
  517. procesio_cli/tools/procesio/tests/test_form_event_maps.py +135 -0
  518. procesio_cli/tools/procesio/tests/test_form_event_ops.py +376 -0
  519. procesio_cli/tools/procesio/tests/test_form_event_replace.py +86 -0
  520. procesio_cli/tools/procesio/tests/test_form_events.py +92 -0
  521. procesio_cli/tools/procesio/tests/test_form_parity.py +171 -0
  522. procesio_cli/tools/procesio/tests/test_form_select_source.py +74 -0
  523. procesio_cli/tools/procesio/tests/test_form_sync.py +35 -0
  524. procesio_cli/tools/procesio/tests/test_form_update.py +133 -0
  525. procesio_cli/tools/procesio/tests/test_formlint.py +155 -0
  526. procesio_cli/tools/procesio/tests/test_formlint_css_scope.py +38 -0
  527. procesio_cli/tools/procesio/tests/test_formlint_field_names.py +83 -0
  528. procesio_cli/tools/procesio/tests/test_guards.py +110 -0
  529. procesio_cli/tools/procesio/tests/test_hidden_setting_types.py +39 -0
  530. procesio_cli/tools/procesio/tests/test_html2docx_asset.py +132 -0
  531. procesio_cli/tools/procesio/tests/test_key_handle_terminology.py +45 -0
  532. procesio_cli/tools/procesio/tests/test_layout.py +574 -0
  533. procesio_cli/tools/procesio/tests/test_layout_report.py +88 -0
  534. procesio_cli/tools/procesio/tests/test_manifest_sync.py +68 -0
  535. procesio_cli/tools/procesio/tests/test_nodedelete.py +151 -0
  536. procesio_cli/tools/procesio/tests/test_nodeparam.py +826 -0
  537. procesio_cli/tools/procesio/tests/test_normalize.py +70 -0
  538. procesio_cli/tools/procesio/tests/test_payload_docs.py +86 -0
  539. procesio_cli/tools/procesio/tests/test_process_action_naming.py +170 -0
  540. procesio_cli/tools/procesio/tests/test_process_call_api_seed.py +46 -0
  541. procesio_cli/tools/procesio/tests/test_process_ext.py +373 -0
  542. procesio_cli/tools/procesio/tests/test_process_invariants.py +183 -0
  543. procesio_cli/tools/procesio/tests/test_process_layout.py +117 -0
  544. procesio_cli/tools/procesio/tests/test_process_naming.py +188 -0
  545. procesio_cli/tools/procesio/tests/test_process_query_store.py +172 -0
  546. procesio_cli/tools/procesio/tests/test_processinfo_variable.py +56 -0
  547. procesio_cli/tools/procesio/tests/test_profiles.py +127 -0
  548. procesio_cli/tools/procesio/tests/test_put_projects.py +41 -0
  549. procesio_cli/tools/procesio/tests/test_reliability.py +107 -0
  550. procesio_cli/tools/procesio/tests/test_removal_gate.py +95 -0
  551. procesio_cli/tools/procesio/tests/test_resource_ops.py +173 -0
  552. procesio_cli/tools/procesio/tests/test_save_validity.py +207 -0
  553. procesio_cli/tools/procesio/tests/test_schedule_cron_shape.py +111 -0
  554. procesio_cli/tools/procesio/tests/test_schedules.py +309 -0
  555. procesio_cli/tools/procesio/tests/test_sqlconvert.py +234 -0
  556. procesio_cli/tools/procesio/tests/test_sqlformat.py +83 -0
  557. procesio_cli/tools/procesio/tests/test_sqlparam.py +187 -0
  558. procesio_cli/tools/procesio/tests/test_superseded_actions.py +54 -0
  559. procesio_cli/tools/procesio/tests/test_surgical_concurrency.py +156 -0
  560. procesio_cli/tools/procesio/tests/test_tier4.py +123 -0
  561. procesio_cli/tools/procesio/tests/test_transport.py +147 -0
  562. procesio_cli/tools/procesio/tests/test_transport_data_stores.py +168 -0
  563. procesio_cli/tools/procesio/tests/test_transport_mapper_repair.py +150 -0
  564. procesio_cli/tools/procesio/tests/test_transport_webhook_strip.py +253 -0
  565. procesio_cli/tools/procesio/tests/test_usage_guide.py +96 -0
  566. procesio_cli/tools/procesio/tool.yaml +12486 -0
  567. procesio_cli/tools/sqlserver/MOVED-TO-CENTRAL.md +29 -0
  568. procesio_cli/tools/sqlserver/README.md +192 -0
  569. procesio_cli/tools/sqlserver/SKILL.md +37 -0
  570. procesio_cli/tools/sqlserver/SQLSERVER-SCHEMA-NOTES.md +284 -0
  571. procesio_cli/tools/sqlserver/__init__.py +0 -0
  572. procesio_cli/tools/sqlserver/connection.py +242 -0
  573. procesio_cli/tools/sqlserver/main.py +521 -0
  574. procesio_cli/tools/sqlserver/profiles.template.json +1 -0
  575. procesio_cli/tools/sqlserver/schema.py +600 -0
  576. procesio_cli/tools/sqlserver/tests/__init__.py +0 -0
  577. procesio_cli/tools/sqlserver/tests/conftest.py +21 -0
  578. procesio_cli/tools/sqlserver/tests/test_connection.py +75 -0
  579. procesio_cli/tools/sqlserver/tests/test_dbprofiles.py +92 -0
  580. procesio_cli/tools/sqlserver/tests/test_dbquery.py +220 -0
  581. procesio_cli/tools/sqlserver/tests/test_manifest_sync.py +68 -0
  582. procesio_cli/tools/sqlserver/tests/test_sqlserver.py +326 -0
  583. procesio_cli/tools/sqlserver/tests/test_sqlserver_schema.py +488 -0
  584. procesio_cli/tools/sqlserver/tool.yaml +123 -0
  585. procesio_cli/tools/web/README.md +381 -0
  586. procesio_cli/tools/web/SKILL.md +37 -0
  587. procesio_cli/tools/web/WEB-AUTOMATION-NOTES.md +277 -0
  588. procesio_cli/tools/web/__init__.py +21 -0
  589. procesio_cli/tools/web/actiondef.py +24 -0
  590. procesio_cli/tools/web/api.py +444 -0
  591. procesio_cli/tools/web/brokered.py +107 -0
  592. procesio_cli/tools/web/driver.py +839 -0
  593. procesio_cli/tools/web/drivercontract.py +44 -0
  594. procesio_cli/tools/web/errors.py +54 -0
  595. procesio_cli/tools/web/handlers/__init__.py +1 -0
  596. procesio_cli/tools/web/handlers/archive.py +367 -0
  597. procesio_cli/tools/web/handlers/browse.py +182 -0
  598. procesio_cli/tools/web/handlers/contacts.py +74 -0
  599. procesio_cli/tools/web/handlers/sessmgmt.py +120 -0
  600. procesio_cli/tools/web/main.py +128 -0
  601. procesio_cli/tools/web/sessions.py +253 -0
  602. procesio_cli/tools/web/steps.py +162 -0
  603. procesio_cli/tools/web/tests/__init__.py +0 -0
  604. procesio_cli/tools/web/tests/conftest.py +197 -0
  605. procesio_cli/tools/web/tests/test_api.py +330 -0
  606. procesio_cli/tools/web/tests/test_archive.py +190 -0
  607. procesio_cli/tools/web/tests/test_brokered.py +138 -0
  608. procesio_cli/tools/web/tests/test_dispatch.py +132 -0
  609. procesio_cli/tools/web/tests/test_errors.py +60 -0
  610. procesio_cli/tools/web/tests/test_manifest_sync.py +76 -0
  611. procesio_cli/tools/web/tests/test_page_contacts.py +68 -0
  612. procesio_cli/tools/web/tests/test_sessions.py +145 -0
  613. procesio_cli/tools/web/tests/test_steps.py +210 -0
  614. procesio_cli/tools/web/tool.yaml +184 -0
  615. procesio_cli/tools/xlsx/README.md +34 -0
  616. procesio_cli/tools/xlsx/SKILL.md +28 -0
  617. procesio_cli/tools/xlsx/__init__.py +0 -0
  618. procesio_cli/tools/xlsx/main.py +129 -0
  619. procesio_cli/tools/xlsx/reader.py +91 -0
  620. procesio_cli/tools/xlsx/tests/__init__.py +0 -0
  621. procesio_cli/tools/xlsx/tests/conftest.py +39 -0
  622. procesio_cli/tools/xlsx/tests/test_xlsx.py +103 -0
  623. procesio_cli/tools/xlsx/tool.yaml +30 -0
  624. procesio_cli/webplatform/aat_mcp/AAT-MCP-NOTES.md +244 -0
  625. procesio_cli/webplatform/aat_mcp/README.md +78 -0
  626. procesio_cli/webplatform/aat_mcp/bridge.py +705 -0
  627. procesio_cli/webplatform/aat_mcp/chat_server.py +194 -0
  628. procesio_cli/webplatform/aat_mcp/chat_surface.snapshot.json +668 -0
  629. procesio_cli/webplatform/aat_mcp/chat_surface.yaml +372 -0
  630. procesio_cli/webplatform/aat_mcp/gate.py +68 -0
  631. procesio_cli/webplatform/aat_mcp/http_server.py +139 -0
  632. procesio_cli/webplatform/aat_mcp/protocol.py +175 -0
  633. procesio_cli/webplatform/aat_mcp/server.py +306 -0
  634. procesio_cli/webplatform/aat_mcp/tests/conftest.py +8 -0
  635. procesio_cli/webplatform/aat_mcp/tests/test_aat_mcp.py +255 -0
  636. procesio_cli/webplatform/aat_mcp/tests/test_chat_surface.py +247 -0
  637. procesio_cli/webplatform/aat_mcp/tests/test_discovery.py +489 -0
  638. procesio_cli/webplatform/aat_mcp/tests/test_multiuser.py +86 -0
  639. procesio_cli/webplatform/aat_mcp/tests/test_progressive_discovery.py +89 -0
  640. procesio_cli/webplatform/aat_mcp/tests/test_protocol.py +180 -0
  641. procesio_cli/webplatform/aat_mcp/tests/test_skill_discovery.py +23 -0
  642. procesio_cli-0.1.1.dist-info/METADATA +467 -0
  643. procesio_cli-0.1.1.dist-info/RECORD +647 -0
  644. procesio_cli-0.1.1.dist-info/WHEEL +4 -0
  645. procesio_cli-0.1.1.dist-info/entry_points.txt +7 -0
  646. procesio_cli-0.1.1.dist-info/licenses/LICENSE +201 -0
  647. 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.