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,45 @@
1
+ # PROCESIO `Send Email` — credential optionality (why a "permanently optional email branch" can't ship credential-less)
2
+
3
+ Live-probed on the `Send Email` action (`c7673492-…`) while building a **zero-credential**
4
+ marketplace template (must import and run with no credentials configured). The question: can
5
+ an email branch be built that runs when an SMTP credential + recipient are present and is
6
+ skipped cleanly when they are not — inside a template that ships with **no** SMTP credential?
7
+ Answer: **no, not via the API.** `Send Email` requires a real, bound SMTP credential just to
8
+ **save**. Evidence (each from `process-create --dry-run`, which runs FE then BE validation):
9
+
10
+ | Attempt | Result |
11
+ |---|---|
12
+ | `Send Email` with **no** credential bound | **FE blocks**: `REQUIRED` — *"Please make sure that the action is defined/configured properly."* on badge **"Send Email - Select SMTP credentials"**. (BE was empty.) |
13
+ | Credential field bound to a **variable** (`{var:...}`) instead of a literal | FE passes, but **BE blocks**: *"Nullable object must have a value."* |
14
+ | Bind a **mock/dummy** credential GUID | Rejected by policy — a credential that doesn't resolve is a support ticket on import; never do this. |
15
+ | Keep a gated `Decisional` **without** a `Send Email` (both branches → one `Join`) | **BE blocks**: *"Duplicate connection port! SourceId … DestinationId …"* — two ports from one source to the same destination are illegal. |
16
+
17
+ ## Consequences (rules)
18
+
19
+ - **`Send Email` is only saveable with a real, bound SMTP credential GUID** (a literal
20
+ credential instance id). Neither empty nor variable-bound satisfies validation.
21
+ - Therefore, in a template that must run with **zero credentials**, the email node **cannot
22
+ be part of the shipped flow** — and neither can a "placeholder" gated `Decisional`, because
23
+ a Decisional's two branches must go to **two distinct targets**; with no `Send Email` to be
24
+ the second target, both would collapse onto the `Join` → "Duplicate connection port".
25
+ - **Ship the flow linear** (no `Send Email`, no decorative `Decisional`/`Join`). Keep the
26
+ optional recipient **input variable** so the future email step has its trigger. The
27
+ zero-config run reaches `Stop` and produces its file outputs with no credential in play —
28
+ outputs never depend on a credential, which is the template standard.
29
+ - This is a genuine **template-standard** finding, not a one-card quirk: any credential-less
30
+ marketplace template that wants an *optional* notification must add it **post-import**, not
31
+ ship it dormant.
32
+
33
+ ## Add the gated email branch AFTER import (manual UI recipe, once an SMTP credential exists)
34
+
35
+ The gated branch *is* valid once there is a credential to bind (case and default then have
36
+ two distinct targets):
37
+
38
+ 1. Create/adopt an **SMTP credential** in the workspace (Credentials → new SMTP).
39
+ 2. On the canvas, after the file-producing step, add a **Decisional** "Has Recipient?" with a
40
+ single case `SubmitterEmail IS_NOT_EMPTY`.
41
+ 3. In the **true** branch add **Send Email**: bind the SMTP credential; `To = SubmitterEmail`;
42
+ set Subject/Body; **Map attachment = [ExcelFile, PdfFile] as a `list<File>`** (a single
43
+ `File` silently drops the attachment though the run still returns status 50).
44
+ 4. Wire **Send Email → Join**; wire the Decisional **default → Join**; **Join → Stop**. Two
45
+ distinct targets (Send Email vs Join) — no duplicate-port error.
@@ -0,0 +1,252 @@
1
+ # PROCESIO "Send Email" action — attachment + dynamic recipient
2
+
3
+ How a PROCESIO **Send Email** action node sends an email with a **file
4
+ attachment** and a **dynamic (variable) recipient**. Verified against both the
5
+ offline `.procesio` export and the live `GET /api/Actions?getFullAction=true`
6
+ catalog for workspace `3fd85e9d-121e-415b-877f-f488cd685ce3`.
7
+
8
+ **Reference flow (real, working):**
9
+ `tools/procesio/docs_info/Exports/export_POSF_PROCESIO.procesio` ->
10
+ Flow **"Notification/Process Event with FILE"** -> action
11
+ `ActionName="notify"`, `ActionTemplateName="Send Email"`,
12
+ `TemplateId = c7673492-2912-4975-8cab-747fb9f4085d`, `Category = "cat1"`.
13
+
14
+ This is a node-building note (how to author the action's `Parameters[]` in a
15
+ flow DTO), complementing the API/auth notes — see
16
+ [PROCESIO-API-NOTES.md](PROCESIO-API-NOTES.md).
17
+
18
+ ---
19
+
20
+ ## 1. "Send Email" is the only send action (SMTP, NOT SendGrid)
21
+
22
+ The action catalog has four email-related actions:
23
+
24
+ | Action | Purpose |
25
+ |---|---|
26
+ | **Send Email** | **The ONLY email-send action.** SMTP-based. |
27
+ | Read Mailbox | Read incoming mail |
28
+ | Read Mailbox V2 | Read incoming mail (newer) |
29
+ | Word Mail Merge | Mail-merge a Word template |
30
+
31
+ There is **no SendGrid action** in PROCESIO — "Send Email" goes out over SMTP.
32
+ Its **first** configuration field is `type="credentials"`, label
33
+ **"Select SMTP credentials"**, with
34
+ `credentialsTemplateId = 20202020-0001-0000-0000-aaaaaaaaaaaa`. The bound
35
+ value is the GUID of a stored SMTP credential (in the example below,
36
+ `2aacf4f1-310c-469f-80ef-394d6ab9582f`).
37
+
38
+ ## 2. Variable-binding pattern (applies to every field)
39
+
40
+ Every configurable field is one entry in the action's `Parameters[]` array:
41
+
42
+ ```jsonc
43
+ {
44
+ "TabPropertyId": "<field GUID>", // which field (see map in section 3)
45
+ "Variable": [ // [] when the field is empty/literal
46
+ { "id": 0, "variableId": "<flow var GUID>", "attribute": null }
47
+ ],
48
+ "Value": "<%0%>" // PROCESIO placeholder(s) + literal text
49
+ }
50
+ ```
51
+
52
+ - **`Value`** holds PROCESIO placeholders of the form **`<%N%>`**, where `N` is
53
+ the `id` of the matching entry in `Variable[]`. Placeholders are **mixable
54
+ with literal text** — e.g. a Subject of `"Notificare mesaj: <%1%>"` injects
55
+ flow variable `id:1` after the literal prefix.
56
+ - Each `<%N%>` in `Value` must have a `Variable[]` entry whose `id == N`; that
57
+ entry's `variableId` is the flow variable's GUID. `attribute` is `null` for a
58
+ whole-variable bind (set it to bind a sub-property of a complex variable).
59
+ - A field that is **empty or purely literal** has **`Variable: []`** and either a
60
+ literal string `Value` (e.g. From display name `"POSF Notification"`) or
61
+ `""`/`null`.
62
+
63
+ ## 3. TabPropertyId map — Send Email fields
64
+
65
+ | TabPropertyId | Field | Type / notes |
66
+ |---|---|---|
67
+ | `f9d5da64-bbc0-4d53-a0ad-6f948cc3ff05` | **Select SMTP credentials** | `credentials` (credentialsTemplateId `20202020-0001-0000-0000-aaaaaaaaaaaa`) |
68
+ | `90d1ec9f-803c-42bc-bd8b-ca11e4ef116c` | **From (Display Name)** | string |
69
+ | `90d1ec9f-803c-42bc-bd8b-ca11e4ef11c6` | **From (Entity)** | string — WARNING: differs from Display Name only in the last 4 chars (`...11c6` vs `...116c`); easy to transpose |
70
+ | `1def19eb-ec69-4a21-a756-4abec8ae3171` | **To** | string (dynamic recipient — see section 5) |
71
+ | `30ba958f-0d83-4259-97b9-d64ce7282d83` | **Cc** | string |
72
+ | `1b6fbfac-183a-481b-9e0d-d4e7cf5543fe` | **Bcc** | string |
73
+ | `9eeaf788-c023-4848-afe7-2454840bd321` | **Subject** | string |
74
+ | `235aa4cf-d20f-4dbb-ad1d-d03e5ff5f13e` | **Body** | code-editor (HTML or plain text) |
75
+ | `5330da65-bd38-4419-88c7-93136bdb6dd9` | **Map attachment** | `file`, `isList=true`, dataTypeId `10c6ac59-3929-49e6-99dc-121212121219` (see section 4) |
76
+ | `3fdba8f7-75b5-4350-9d85-b542f8e5a73d` | **Body is Html** | check-box (`Value: null`/false = plain text; true = HTML) |
77
+
78
+ ## 4. Attachment — bind a File-typed variable
79
+
80
+ Bind TabPropertyId **`5330da65-bd38-4419-88c7-93136bdb6dd9`** (Map attachment)
81
+ to a **File** flow variable.
82
+
83
+ - File DataType id = **`10c6ac59-3929-49e6-99dc-121212121219`**.
84
+ - The field is a **list** (`isList=true`), so a **`List<File>`** fits naturally;
85
+ a **single `File`** variable also works.
86
+ - In the reference flow it is bound to variable **`mailList`** (a `List<File>`,
87
+ `IsList=True`, DataType `10c6ac59-...121219`).
88
+ - **No inline / base64 content.** Files travel as **PROCESIO File variable
89
+ references** — you build/obtain a File (e.g. via *Object To File*, *Export To
90
+ CSV*, a download action) earlier in the flow and pass that variable here. The
91
+ binding is `Variable:[{id:N, variableId:<file var>, attribute:null}]`,
92
+ `Value:"<%N%>"`.
93
+
94
+ ## 5. Dynamic recipient — bind a String variable
95
+
96
+ Bind TabPropertyId **`1def19eb-ec69-4a21-a756-4abec8ae3171`** (To) to a
97
+ **String** flow variable (DataType `0317bfee-b2f5-4bde-bfe8-121212121214`).
98
+
99
+ - **One recipient:** point the String variable at a single address.
100
+ - **Multiple recipients:** use **one String variable holding comma-joined
101
+ addresses** (NOT a List). In the reference flow the To field binds variable
102
+ **`emailsConcatenated`**, which is built upstream by a **For-Each** over the
103
+ recipient list feeding a **Concatenate** action (`concatEmails` +
104
+ `concatCrtEmail` in the same flow).
105
+
106
+ - **Separator: use `;` for a LITERAL list, not `,` (verified live 2026-09-30).** A literal
107
+ To value `a@example.com,b@example.com` fails AT RUN with `Invalid emails a@example.com,b@example.com` (instance
108
+ status 40); the same value with `;` sends to both. Validation (FE + BE) passes either way, so
109
+ only a run catches it. Prefer `;` for variable-built lists too.
110
+ - **SendGrid-backed SMTP credential: From (Entity) must be a verified sender.** Leaving it empty
111
+ (or using an unverified address) fails at run with `The from address does not match a verified
112
+ Sender Identity`. Find a working sender by reading an existing Send Email node that uses the
113
+ same credential (field `90d1ec9f-...11c6`) and reuse its From (Entity).
114
+
115
+ ## 6. Built-in dataTypeIds (for typing flow variables)
116
+
117
+ | Type | dataTypeId |
118
+ |---|---|
119
+ | String | `0317bfee-b2f5-4bde-bfe8-121212121214` |
120
+ | Text (rich) | `0317bfee-b2f5-4bde-bfe8-121212121221` |
121
+ | Boolean | `0317bfee-b2f5-4bde-bfe8-121212121210` |
122
+ | Integer / Guid | `0317bfee-b2f5-4bde-bfe8-121212121211` |
123
+ | File | `10c6ac59-3929-49e6-99dc-121212121219` |
124
+
125
+ ---
126
+
127
+ ## Reference — verbatim `Parameters[]` from the `notify` action
128
+
129
+ Taken as-is from the reference flow. Note the byte between `Notificare mesaj:`
130
+ and `<%1%>` in the Subject is **U+00A0 (non-breaking space)**, not a normal
131
+ space — preserved verbatim below.
132
+
133
+ ```json
134
+ [
135
+ {
136
+ "TabPropertyId": "f9d5da64-bbc0-4d53-a0ad-6f948cc3ff05",
137
+ "Variable": [],
138
+ "Value": "2aacf4f1-310c-469f-80ef-394d6ab9582f"
139
+ },
140
+ {
141
+ "TabPropertyId": "90d1ec9f-803c-42bc-bd8b-ca11e4ef116c",
142
+ "Variable": [],
143
+ "Value": "POSF Notification"
144
+ },
145
+ {
146
+ "TabPropertyId": "1def19eb-ec69-4a21-a756-4abec8ae3171",
147
+ "Variable": [
148
+ {
149
+ "id": 0,
150
+ "variableId": "82957998-8f7f-46d6-819e-e370d9bc913d",
151
+ "attribute": null
152
+ }
153
+ ],
154
+ "Value": "<%0%>"
155
+ },
156
+ {
157
+ "TabPropertyId": "30ba958f-0d83-4259-97b9-d64ce7282d83",
158
+ "Variable": [],
159
+ "Value": ""
160
+ },
161
+ {
162
+ "TabPropertyId": "1b6fbfac-183a-481b-9e0d-d4e7cf5543fe",
163
+ "Variable": [],
164
+ "Value": ""
165
+ },
166
+ {
167
+ "TabPropertyId": "9eeaf788-c023-4848-afe7-2454840bd321",
168
+ "Variable": [
169
+ {
170
+ "id": 1,
171
+ "variableId": "50f8dbbe-ccc6-477b-9492-1544bb011d2d",
172
+ "attribute": null
173
+ }
174
+ ],
175
+ "Value": "Notificare mesaj: <%1%>"
176
+ },
177
+ {
178
+ "TabPropertyId": "235aa4cf-d20f-4dbb-ad1d-d03e5ff5f13e",
179
+ "Variable": [],
180
+ "Value": "Hello,
181
+
182
+ The message body goes here. Line breaks in a plain-text body are literal \r\n sequences inside the JSON string, not real newlines.
183
+
184
+ Regards,
185
+ The team"
186
+ },
187
+ {
188
+ "TabPropertyId": "5330da65-bd38-4419-88c7-93136bdb6dd9",
189
+ "Variable": [
190
+ {
191
+ "id": 2,
192
+ "variableId": "3b45476e-b634-4e05-9fb5-c7ac521615ed",
193
+ "attribute": null
194
+ }
195
+ ],
196
+ "Value": "<%2%>"
197
+ },
198
+ {
199
+ "TabPropertyId": "3fdba8f7-75b5-4350-9d85-b542f8e5a73d",
200
+ "Variable": [],
201
+ "Value": null
202
+ }
203
+ ]
204
+ ```
205
+
206
+ How the example binds each field (resolved against the flow's `Variables[]`):
207
+
208
+ | TabPropertyId | Field | Binding |
209
+ |---|---|---|
210
+ | `f9d5da64-...ff05` | SMTP credentials | literal credential GUID `2aacf4f1-310c-469f-80ef-394d6ab9582f` |
211
+ | `90d1ec9f-...116c` | From (Display Name) | literal `"POSF Notification"` |
212
+ | `1def19eb-...3171` | **To** | `<%0%>` -> var `emailsConcatenated` (String, comma-joined) |
213
+ | `30ba958f-...2d83` | Cc | empty |
214
+ | `1b6fbfac-...543fe` | Bcc | empty |
215
+ | `9eeaf788-...d321` | Subject | `"Notificare mesaj: <%1%>"` -> var `messageType` (String) |
216
+ | `235aa4cf-...5f13e` | Body | literal multi-line plain-text body |
217
+ | `5330da65-...6dd9` | **Map attachment** | `<%2%>` -> var `mailList` (List<File>) |
218
+ | `3fdba8f7-...a73d` | Body is Html | `null` (unchecked -> plain-text body) |
219
+
220
+ ---
221
+
222
+ ## Corroborating flows (also use Send Email + Map attachment)
223
+
224
+ Same pattern verified across other production exports under
225
+ `tools/procesio/docs_info/Exports/`:
226
+
227
+ - **RINGHEL_RINGHEL 1** -> `HR_UC/Add CtrAndAnnex`
228
+ - **RINGHEL_RINGHEL 1** -> `PRC/Generate Contract`
229
+ - **OMS_v2_dev** -> `notification/lateDeliveryNote`
230
+ - **OMS_v2_dev** -> `utilitary/extractFile`
231
+ - **RINGHEL_Demo** -> `Party Invite/Send email to all attendees`
232
+
233
+ ---
234
+
235
+ ## Map attachment requires `list<File>` (verified live 2026-06-25)
236
+
237
+ The **"Map attachment"** field (`TabPropertyId 5330da65-bd38-4419-88c7-93136bdb6dd9`,
238
+ `type="file"`) is a **LIST of files** at runtime. Binding a **single** `File` variable
239
+ (model `10c6ac59-3929-49e6-99dc-121212121219`, `isList:false`) makes the designer show
240
+ **"Error: data type mismatch"** on the Send Email node and the email sends with **NO
241
+ attachment** — and the run STILL returns **status 50** (the mismatch does not fail the run,
242
+ so a green run is NOT proof the file attached). The designer's "+ Add Variable" tooltip on
243
+ that field literally reads **"Add Variable type=list <File>"**.
244
+
245
+ **Fix:** the bound variable must be **`isList:true`** (a `list<File>`). So:
246
+ - Declare the process input as `{model: "10c6ac59-…", isList: true}`.
247
+ - When running directly, pass the file DTO **inside a list**: `"briefFile": [ <fileDTO> ]`.
248
+ - A form file-upload control already holds a list, so a form→process attachment binds cleanly.
249
+
250
+ A **dynamic recipient** is a normal variable bind: `To` Value `<%0%>` + `Variable:[{id:0,
251
+ variableId: <recipientEmail var>}]` — verified delivering live to the entered address, with
252
+ the `list<File>` PDF attached (form → Process 2 brief → Process 3 email, AAT_ use case).
@@ -0,0 +1,284 @@
1
+ # PROCESIO SQL Server actions — PARAMETERIZED (safe) vs INLINE `<%N%>` (WRONG)
2
+
3
+ **Discovered 2026-07-03** during a review of a chat flow's contact-resolution
4
+ nodes: the reviewer suffixed the existing nodes `[old]`, disabled them, and added
5
+ `[new]` nodes "properly configured using parameters". The whole 2026-07 Networky build authored
6
+ SQL nodes by **string-interpolating flow-variable values into the SQL text** as `N'<%N%>'`. That is
7
+ (a) SQL-injection-prone and (b) the wrong action configuration.
8
+
9
+ ## THE RULE
10
+ Never interpolate a flow-variable value into SQL as `N'<%N%>'`. Use the **`Execute Query`** action
11
+ (NOT `Execute Query V2`) — or **`Execute Command`** for non-query writes — with its **parameter
12
+ binding**: named `@params` in the SQL + a **`Parameters config tab`** (`map-parameters`) collection
13
+ mapping each `@param` to a flow variable. The DB driver passes values as **typed SQL parameters**
14
+ (escaped), so `O'Brien`, quotes, or malicious input can never break or inject the query.
15
+ Literals (`@TopN = 5`) may stay inline. Variable values must be bound, never inlined.
16
+
17
+ ## WRONG (injectable — do NOT author, and convert existing)
18
+ - Template **`Execute Query V2`** (inline-only; substitutes `<%N%>` as raw string into the SQL text).
19
+ - Any `Execute Query` / `Execute Command` node whose SQL contains `N'<%N%>'` / `'<%N%>'` for a value.
20
+ ```sql
21
+ -- INJECTABLE: a name like O'Brien or '; DROP ... breaks/injects it
22
+ EXEC sp_FindContact @ConversationId = N'<%0%>', @Query = N'<%1%>', @TopN = 5
23
+ ```
24
+
25
+ ## CORRECT — `Execute Query` template, parameter binding
26
+ ```sql
27
+ EXEC sp_FindContact @ConversationId = @conversationId, @Query = @resolveHint, @TopN = 5
28
+ ```
29
+ plus a binding: `@conversationId <- flowVar(conversation)`, `@resolveHint <- flowVar(resolveHint)`.
30
+
31
+ ### Exact node DTO (the `Execute Query` template — property ids are stable, reuse them)
32
+ `customData.configuration[0].settings`:
33
+ - `Select Database Server` (type `credentials`) = credential gid (e.g. `45a1dd18-…` = Database).
34
+ - `Execute Query` (type `side-pannel`) = a list of sub-settings:
35
+ - `{id: 11350a1d-4139-d942-adcb-a2c2c52e5e22, label: "Query", type: "code-editor", language: "sql", value: <SQL with @params>}`
36
+ - `{id: 73416282-bcfe-4934-9e40-a39f2bb33d2d, label: "Parameters config tab", type: "map-parameters", value: [{id, destination: "<paramName>", source: "<variableId>"}]}`
37
+ - `{id: 9ce93b2d-5226-4228-a64d-3693c8d3e0e3, label: "Time Out", type: "number", value: "100"}`
38
+ - `{id: 8aa02e91-1a1e-a44a-b09b-6965d67da04d, label: "Output", type: "any", value: "<output-var-gid>"}`
39
+
40
+ `parameters[]` (the RUNTIME form the engine executes — must be kept in sync with the settings;
41
+ tabPropertyId == the setting/sub-setting id):
42
+ - `{tabPropertyId: f96ff811-572f-084a-8cac-a74a2c2e365f, value: "<credential-gid>"}` (Select Database Server)
43
+ - `{tabPropertyId: 11350a1d-…, value: "<SQL text with @params>"}` (Query)
44
+ - `{tabPropertyId: 73416282-…, value: [ {id:0, source:{value:"<%0%>", variable:[{id:0, variableId:"<gid>", attribute:null}]}, destination:{value:"<paramName>", variable:[]}}, … ] }` (binding)
45
+ - `{tabPropertyId: 9ce93b2d-…, value: "100"}` (Time Out)
46
+ - `{tabPropertyId: 8aa02e91-…, value: "<%K%>"}` (Output binding; setting holds the output-var gid)
47
+
48
+ Binding semantics: `destination.value` = the SQL parameter NAME (as it appears after `@` in the SQL —
49
+ the action substitutes it with a typed parameter); `source.value` = a positional `<%N%>` whose
50
+ `variable[0].variableId` is the flow variable GUID. So: SQL `@conversationId` ⇄ binding
51
+ `destination:"conversationId"` ⇄ `source:<%0%>` ⇄ variable `conversation`.
52
+
53
+ Reference DTO captured at `scratchpad/eq_reference.json` (the live `Execute Query [new]` from Resolve Contact).
54
+
55
+ ## `Execute Command` (SQL Server Command — INSERT/UPDATE/DELETE, no result set)
56
+ Same defect when inlined — e.g. `Chat Flow/Extract Info Image` `Execute Command` node:
57
+ `UPDATE messages SET ocr_text = COALESCE(ocr_text,' ') + N'<%0%>' …` (inline, injectable if the value
58
+ is OCR/user text). Fix identically: named `@param` in the SQL + the `Parameters config tab` binding.
59
+ (The Command template exposes the same `Query`/`Parameters config tab`/`Time Out` sub-settings; confirm
60
+ its property ids from a live corrected node before authoring — do not assume they equal the Query ids.)
61
+
62
+ ## Converter / tooling — the `procesio` tool (NOT a Networky script)
63
+ - **`procesio sql-scan --id <process-id>`** — lists every SQL node (Execute Query / Execute Command) with inline-vs-parameterized status. Read-only.
64
+ - **`procesio sql-parameterize --id <process-id> {--node <label|id> | --all} [--dry-run]`** — converts inline `N'<%K%>'` → `@pK`, builds the `Parameters config tab` binding from the node's `<%N%>`→variable map (migrating a deprecated `Execute Query V2` node to `Execute Query`), then PROCESIO-validates and PUTs. NEVER PUTs an invalid flow; `--dry-run` previews.
65
+ - Implementation: `tools/procesio/flowmodel/sqlparam.py` (pure) + `tools/procesio/handlers/sqlactions.py` + `tools/procesio/tests/test_sqlparam.py`.
66
+ - **flowpatch note:** `setscript`/`syncparams` `_to_runtime_form` (GUID→`<%N%>`) is for **CODE (JS) nodes**,
67
+ NOT SQL. Never use it to (re)author a SQL node's `<%N%>` — that reproduces the injectable inline form.
68
+
69
+ ## Scope in the live build (to convert; audit ongoing)
70
+ - `Execute Query V2` nodes (inline): `Get Last 10 msg` (sp_GetLastMesseges) in Start + clone (GUID inlined — low risk, still convert).
71
+ - `Execute Command` inline: Extract Info Image OCR `UPDATE messages` (OCR text inlined — **user-text, HIGH risk**).
72
+ - `Execute Query` template but inline SQL (my Leak-A edits): `Get info from SalesOMMO` Persist node
73
+ (`f2503397`, RecordSearchClaim/UpdateSessionContext) + Callback resolver (`11f25dbf`, sp_ClaimSearchResult).
74
+ - **HIGH injection risk = wherever USER TEXT is inlined**: `@Query`/name (sp_FindContact), message_text
75
+ (sp_MessageAdd/AddMessage), OCR text — prioritize these. GUID/int-only inlines are lower risk.
76
+ - The reviewer already fixed the two contact-resolution nodes (`Execute Query [new]`, `Pending Write [new]`); my
77
+ `[old]` disabled copies can be deleted.
78
+
79
+
80
+ ## CRITICAL — the action TYPE is the templateId, NOT the label (learned the hard way, 2026-07-04)
81
+ The designer renders ACTION TYPE from **templateId**, not actionTemplateName. The 2026-07 build put MOST
82
+ SQL nodes on the deprecated **V2 template `a9f851c2-e0ba-4fee-9a06-5445ba000001`** while LABELLING many
83
+ of them "Execute Query". The map-parameters binding (73416282) is a property of the LATEST template
84
+ `76470756-...` ONLY — it does NOT exist on V2. So adding the binding + @params to an a9f851c2 node leaves
85
+ the @params UNBOUND at runtime -> the query errors (a real message creates no user/rows).
86
+ - `procesio sql-parameterize` migrates by **templateId**: any node whose templateId contains `a9f851c2`
87
+ is swapped to `76470756` (role-based id remap) BEFORE the binding is added. Changing templateId on PUT
88
+ DOES persist. Keying on the "V2" LABEL alone misses the mislabelled nodes — that bug broke prod once.
89
+ - **PROCESIO `validate` does NOT catch unbound @params** (structure only, not runtime binding). A
90
+ parameterized SQL change can pass validate and still fail at runtime. ALWAYS runtime-verify (below).
91
+
92
+ ## Runtime verification — the webhook E2E harness (no WhatsApp Web needed)
93
+ Inject a synthetic WhatsApp-Business inbound at Start's webhook, then read the DB:
94
+ `procesio webhook-launch --id db92281a-17b5-451f-b9f4-2a7f6a70f1fc --payload '{"PhoneNumber":"<digits>","FinalMessage":"<text>","MessageId":"wamid.TEST","ImageBase64":"","AudioBase64":""}'`
95
+ The body is the flat WTB DataModel (PhoneNumber / FinalMessage / MessageId / ImageBase64 / AudioBase64),
96
+ passed DIRECTLY (not wrapped in {WTB:...}). Use a fake phone (e.g. 4070000001X) so the Business-API reply
97
+ fails harmlessly. Verify in chatbotAI: a users row + an in message + an out reply = the flow (incl. its SQL
98
+ nodes) works. A REAL launch runs the live LLM + DB + Business-API send and creates real rows (delete test
99
+ rows after). WhatsApp Web itself needs the linked phone ONLINE (else chats stay "Loading…", #main never
100
+ opens; also dismiss the "What'''s new" modal).
101
+
102
+ ## MySQL + Redis engines (PRC-3696, 2026-08)
103
+
104
+ The DB credential (catalog type "SQL") became multi-engine: `DbClientType` gained
105
+ `MYSQL = 2` (alongside `MSSQL = 1`). A **MySQL** connection is the same DB credential with
106
+ its **server-type** option set to MySQL; the existing `Execute Query` / `Execute Command`
107
+ actions run against it unchanged (they resolve the client by the credential's DbClientType).
108
+ `CustomMySQLClient` was added in BOTH the Web-Api credential-test stack and the
109
+ Process-Execution runtime stack. **Redis** is a STANDALONE credential type
110
+ (`CredentialsType.REDIS = 9`, NOT a `DbClientType`/SQL sub-type) with its own **"Redis
111
+ Connector"** action (19 typed ops; no raw-command execution) — Web-Api #1452 / Action-Core
112
+ #130 / Process-Execution #250. Redis properties: Host/Port(6379)/Username/Password/
113
+ Database(0)/UseTls/ValidateCertificate/ConnectTimeoutSeconds/CommandTimeoutSeconds.
114
+ It shipped but is **not yet activated** (template not seeded in DataBase-Update), so `Redis`
115
+ is not in `/api/Credentials/types` yet; the contract is stable. Security: outbound DB hosts
116
+ are validated by `DbHostBlacklistChecker` (CIDR blacklist) — a private/blacklisted host is
117
+ rejected at connect time. Tool impact: none — credential types are live-resolved from
118
+ `/api/Credentials/types`, so a MySQL/Redis credential is created by setting the template +
119
+ properties (incl. the server-type option). Confirm the exact server-type option name/GUID
120
+ with `procesio list-connection-types` post-launch.
121
+
122
+ ## `Execute Command` is a SECOND family with its own property ids
123
+
124
+ `sql-parameterize` originally knew only the `Execute Query` family. Command nodes need their own
125
+ ids, and getting this wrong is silent:
126
+
127
+ | role | Execute Query (`76470756`) | Execute Command (`a1625da6`) |
128
+ |---|---|---|
129
+ | credentials | `f96ff811-572f-084a-8cac-a74a2c2e365f` | `5f75a4fd-d0f5-4ac1-8257-467e50e7292e` |
130
+ | side-pannel | `8add0f17-b2b1-4d5f-962b-c5d400a4e2d4` | `975f25dc-1044-4488-b635-10a2039f8d89` |
131
+ | sql | `11350a1d-4139-d942-adcb-a2c2c52e5e22` (Query) | `824575f6-7652-4bc2-8186-63b32c92cc22` (Command) |
132
+ | **Parameters config tab** | `73416282-bcfe-4934-9e40-a39f2bb33d2d` | `0acb249e-8b21-4bfd-946c-1e65e26baa68` |
133
+ | Time Out | `9ce93b2d-5226-4228-a64d-3693c8d3e0e3` | `2be309c6-9144-4b27-a722-fbc9c89735c2` |
134
+ | Output | `8aa02e91-1a1e-a44a-b09b-6965d67da04d` (any) | `e6ffaa2d-2c32-412d-a9d4-b1038ece9d38` (number) |
135
+
136
+ **Write the Query bind id onto a Command node and every `@param` is unbound at runtime**, with no
137
+ validation error to show for it: the SQL still executes, the parameter simply arrives NULL, and a
138
+ procedure that reads `OPENJSON(NULL)` inserts nothing and reports success. `sqlparam` now keys the
139
+ family off `templateId` (`family_of` / `bind_pid`) so the right id is always used.
140
+
141
+ ### Deprecated templates, and why the label cannot be trusted
142
+
143
+ Three templates are inline-only (no map-parameters), so a node on one MUST be migrated before it can
144
+ bind anything: `Execute Query V2` (`a9f851c2-…ba000001`), `Execute Query V1`
145
+ (`574a2ab1-…`), `Execute Command V1` (`c2760ff2-…`). `_migrate_to_current` does a role-based id
146
+ remap from a table of each legacy template's ids, in both the runtime and designer layers, and
147
+ refreshes each remapped setting's label to the current template's wording.
148
+
149
+ **Always key on `templateId`, never on `actionTemplateName`.** In one live workspace all four
150
+ collectors sat on `Execute Command V1` while two of them were *labelled* "Execute Command". The
151
+ label is cosmetic and drifts; the templateId is what the designer and the engine resolve.
152
+
153
+ ### Migrating raises the Output type bar
154
+
155
+ `Execute Command V1`'s Output was permissive; the current template types it **number** (rows
156
+ affected, `isRequired`). A legacy node that bound an `Object`/`Json` variable there validates fine on
157
+ V1 and fails migration with `statusCode 142 Data type mismatch … at parameter Output`. Retype that
158
+ variable to number first (`variable-set-type`, safe when it is an internal type-20 variable that
159
+ nothing else reads). The current template also makes **Time Out required** (60..1800) where the
160
+ legacy one had none, so the migration seeds a default rather than leaving a required field empty.
161
+
162
+ ### Proving a parameter is actually bound
163
+
164
+ A NULL-bound parameter is indistinguishable from "nothing to do" in the logs, so prove the binding
165
+ instead of assuming it. Temporarily prefix the statement with a guard that fails loudly, keeping the
166
+ real statement after it, and run the process:
167
+
168
+ ```sql
169
+ IF @p0 IS NULL OR LEN(@p0) < 1000 RAISERROR('PROBE-PARAM-NOT-BOUND', 16, 1);
170
+ EXEC <the real procedure> @Body = @p0;
171
+ ```
172
+
173
+ A successful run proves the value arrived with real length; the RAISERROR surfaces as a failed
174
+ instance carrying the message. **Run the negative control too**: set the threshold absurdly high and
175
+ confirm the run DOES fail, otherwise a guard that never fires proves nothing. Restore the plain
176
+ statement afterwards. At every point the process is either correct or fails safe, so this is
177
+ usable on a live process when no fresh source data is available to observe an insert.
178
+
179
+ ## `Execute Command` DISCARDS a result set — `sql-convert` moves the node to `Execute Query`
180
+
181
+ Discovered 2026-08-27. The two SQL families differ in more than their property ids: **`Execute
182
+ Query` carries a RESULT SET into a flow variable; `Execute Command` carries ROWS AFFECTED** (its
183
+ Output property is literally typed `number`). So a stored procedure that ends in `SELECT` — the
184
+ normal way a procedure reports `Success` / `ErrorMessage` / a new id / a token back to its caller
185
+ — returns all of that into a Command node's Output and it is thrown away. There is no error to
186
+ find: the flow is valid, the run finishes green, `flow-lint` is clean, and the output variable
187
+ just holds a count. Everything downstream then treats a refusal and a success identically.
188
+
189
+ **The tell:** an `Execute Command` node whose SQL is `EXEC <proc>` where the proc's last statement
190
+ is a `SELECT`. Also: an output variable declared `list<Object>` but bound to a Command node — the
191
+ declared shape and the family disagree, and the family wins.
192
+
193
+ **The fix:** `procesio sql-convert --id <process> --node <label|id> --to query
194
+ [--output-variable <name|id>]`. It is a role-based property-id remap (the same machinery as the
195
+ legacy-template migration) across BOTH the runtime `parameters[]` and the designer `customData`,
196
+ plus three things the remap does not reach and a reader WILL trust: the Output setting's designer
197
+ `type` (`number` -> `any`), the configuration container's label, and `customData.description`.
198
+ The SQL text, credential, timeout and `@param` binding are carried across untouched. `--to command`
199
+ is the exact inverse. A node on a deprecated template is refused rather than half-converted — run
200
+ `sql-parameterize` first, which migrates it onto its family's current template.
201
+
202
+ **Order matters when both are needed:** parameterize FIRST (it can migrate a legacy template), then
203
+ convert the family. Converting first leaves `sql-parameterize`'s inline detector looking at the new
204
+ family's property id, which is fine, but a legacy node would already have been refused.
205
+
206
+ ### The output variable's data type is a separate axis from the family
207
+ `flow-lint`'s `EXECQUERY_OUTPUT_TYPE` wants an Execute Query Output to be `list<Object>`
208
+ (`...121221`, `isList: true`). `...121220` (Json) also works at RUNTIME — a whole workspace ran on
209
+ it — but the designer renders a "data type mismatch" on every such node. Fix it with
210
+ `variable-set-type --data-type ...121221 --is-list true`; an output/input variable needs
211
+ `--allow-contract-change` because it is the process's public shape.
212
+
213
+ ## Verifying a SQL change: run BOTH paths, and run one through the FORM
214
+
215
+ `run-process --synchronous` returns `{status, variable, error}` directly, which makes the
216
+ success path easy. The path that actually regresses is the REFUSAL path, because a discarded
217
+ result set looks exactly like a successful one — so assert on a call the procedure must reject
218
+ (a slot outside the offered list, a malformed email) and read the `ErrorMessage` back.
219
+
220
+ And prove the injection fix while you are there: submit a value containing an apostrophe and a
221
+ statement terminator (`O'Brien Test; DROP TABLE x--`). Under the old inline `N'<%N%>'` form that
222
+ breaks or injects; under parameter binding it is stored verbatim as data. Reading the row back
223
+ afterwards is the assertion.
224
+
225
+ Finally run one submission through `run-form-with-files`, not just `run-process`: the form and the
226
+ process are assembled separately and nothing asserts they agree. See
227
+ PROCESIO-FORM-SUBMISSION-NOTES.md.
228
+
229
+ ## MySQL is GA - same credential template, `ServerType` discriminator (PRC-3696, 2026-07)
230
+
231
+ MySQL is a first-class SQL engine now, not a separate credential type. The mechanics an
232
+ API client must know:
233
+
234
+ - **`DbClientType`**: `MSSQL = 1`, `MYSQL = 2`. This lives on the credential, not the
235
+ action. The Execute Query / Execute Command action templates are unchanged - the same
236
+ template runs against either engine and picks the driver from the bound credential.
237
+ - **No separate MySQL credential template.** The existing SQL Server template was
238
+ UPDATEd in place: renamed to **"SQL"** and given a **`ServerType`** select
239
+ (`MSSQL` default / `MYSQL`). Choose MySQL by setting that property, not by choosing a
240
+ different template. `ProtocolType` is now **conditional on `ServerType=MSSQL`**; for
241
+ MySQL send `ServerType, ServerName, Username, Password` (required) + optional
242
+ `PortNumber` (default 3306), `DatabaseName`, `Encrypt`, `Pooling`,
243
+ `TrustServerCertificate`. On MySQL the `Encrypt`/`TrustServerCertificate` flags map to
244
+ MySqlConnector `SslMode`. Because the tool resolves credential templates live by name,
245
+ this needs no tool change - you build a "SQL" credential and set `ServerType`.
246
+ - **Parameter binding** is named `@param` (Dapper) via `MapParameters {id, source,
247
+ destination}` → a dict keyed by `destination.value`, value `source.value`; a duplicate
248
+ destination errors. MySQL relies on `AllowUserVariables=true` (set server-side). Only
249
+ the V2 action variants carry a `Parameters` (Map_Parameters) tab; the base
250
+ Execute Query/Command bind no parameters. Keep using parameters, never inline
251
+ `<%N%>` for SQL (see the parameterization section above).
252
+ - **DB host blacklist (silent).** Process-Execution enforces a `DbHostBlacklist` (host,
253
+ `host:port`, IP, or **CIDR**) BEFORE opening a connection; the committed default blocks
254
+ the private/non-routable ranges (172.16/12, 192.168/16, 127/8, 169.254/16, 100.64/10,
255
+ 0.0.0.0/8 and IPv6 loopback/ULA/link-local), real prod ranges injected per-env. A block
256
+ is disguised as an ordinary **connect-timeout** - so a SQL/MySQL node that "times out"
257
+ connecting to an internal host may actually be blacklisted, not slow.
258
+ - **Execute Command injection guard (PRC-5613):** stacked statements in Execute Command
259
+ are guarded server-side. Author one statement per action; rely on parameters.
260
+ - **Data stores are MySQL-backed, per-workspace users (PRC-5442):** creating/altering a
261
+ data store provisions a physical MySQL table (why `datastore-create`/`-modify-column`
262
+ carry a long timeout). Not something the client sends, but explains the latency.
263
+
264
+ Note reconciliation: an older line in `dto/credential/description.md` called
265
+ "Execute Query V3 / Execute Command V2" the current versions; the live catalog and
266
+ `flowmodel/sqlparam.py` treat the unversioned `Execute Query` / `Execute Command`
267
+ (GUIDs `76470756-…` / `a1625da6-…`) as current, with V2 variants adding Timeout +
268
+ Parameters. Trust the live catalog.
269
+
270
+ ## The `Execute Query` output is `list<Object>`, and `sql-parameterize` saves a failing flow as invalid (measured 2026-10-22)
271
+
272
+ Declare the variable bound to an `Execute Query` **Output** as `{"type": "object", "isList": true}`
273
+ (`0317bfee-…-121212121221`). A `json` list (`…1220`) is what many older flows use and it runs, and
274
+ `process-create` accepts it, but the designer layer flags it (`flow-lint` EXECQUERY_OUTPUT_TYPE). The
275
+ first `sql-parameterize` on such a flow then runs the designer gate, still PUTs the converted SQL,
276
+ and stamps the flow `isValid: false`. The platform stores that stamp as is, so every launch answers
277
+ `HTTP 400 statusCode 373 "Process needs to be valid in order to be launched."` even though
278
+ `POST /api/Projects/validate` reports it valid. Read `isValid` in the `sql-parameterize` result (and
279
+ run `flow-lint`) before you call the process ready. Fix: retype the variable in the config,
280
+ `process-edit` (desired state, variable ids are kept by name), then `sql-parameterize --all` again.
281
+
282
+ When parameterizing, keep each `<%N%>` alone on the right of a `DECLARE`
283
+ (`DECLARE @key_in nvarchar(100) = N'<%0%>';`) and do the `COALESCE`/`LEFT`/`NULLIF` work on that SQL
284
+ variable afterwards: the converter turns `N'<%N%>'` into `@pN` wherever it sits.