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,320 @@
1
+ """Curated scheduler actions (run a process on a cron / recurrence).
2
+
3
+ Wraps the `/api/Schedules*` surface so a user or agent can list / get / create /
4
+ update / delete a schedule, enable or disable one, manage its notifications, and
5
+ list a project's schedules — without dropping to the untyped generic `request`.
6
+
7
+ Verified routes + methods (Web-API, tag Schedules; perms in parens):
8
+ list GET /api/Schedules (Schedule.Read)
9
+ get GET /api/Schedules/{scheduleId} (Schedule.Read)
10
+ create POST /api/Schedules (Schedule.Write)
11
+ update PUT /api/Schedules (Schedule.Update)
12
+ delete DELETE /api/Schedules/{scheduleId} (Schedule.Delete)
13
+ set status PATCH /api/Schedules/{scheduleId}/status (Schedule.Update)
14
+ get notifs GET /api/Schedules/notifications/{scheduleId} (Schedule.Read)
15
+ set notifs POST /api/Schedules/notifications (Schedule.Update)
16
+ project list GET /api/Projects/{id}/restricted/schedules (Schedule.Read)
17
+
18
+ The create/update body shape is captured in PROCESIO-API-NOTES.md (Hard rule 6).
19
+ Security: literal ``processInputs`` are persisted and returned by schedule reads.
20
+ The curated handler preserves the raw DTO by default for backward-compatible
21
+ round-tripping and offers ``get-schedule --redact-process-inputs`` for evidence and
22
+ diagnostics. Read SCHEDULE-INPUT-SECURITY-NOTES.md before storing authentication
23
+ material there or capturing a raw schedule result.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import argparse
28
+ from typing import Any
29
+
30
+ from tools.procesio import errors
31
+ from tools.procesio.actiondef import ActionDef
32
+ from tools.procesio.client import parse_json_arg
33
+ from tools.procesio.handlers.common import add_paging_args, add_profile_arg
34
+
35
+
36
+ _REDACTED = "[REDACTED]"
37
+
38
+
39
+ # -- list / get -------------------------------------------------------------
40
+
41
+ def _list_args(p: argparse.ArgumentParser) -> None:
42
+ add_profile_arg(p)
43
+ add_paging_args(p)
44
+ p.add_argument("--search", help="filter by schedule name (searchName)")
45
+
46
+
47
+ def list_schedules(client, args) -> dict:
48
+ q = {"pageNumber": args.page, "pageItemCount": args.page_size,
49
+ "searchName": args.search}
50
+ return {"result": client.get("/api/Schedules", q)}
51
+
52
+
53
+ def _id_args(p: argparse.ArgumentParser) -> None:
54
+ add_profile_arg(p)
55
+ p.add_argument("--id", required=True, help="schedule id (scheduleId)")
56
+
57
+
58
+ def _get_args(p: argparse.ArgumentParser) -> None:
59
+ _id_args(p)
60
+ p.add_argument(
61
+ "--redact-process-inputs",
62
+ action="store_true",
63
+ help="replace every returned processInputs[].value with [REDACTED]",
64
+ )
65
+
66
+
67
+ def _redact_process_inputs(value: Any) -> Any:
68
+ """Copy a schedule DTO while masking literal process-input values.
69
+
70
+ Both camelCase live DTOs and PascalCase export-like shapes are handled. Other
71
+ fields stay byte-for-byte equivalent at the JSON-value level so the result is
72
+ useful for structural diagnostics without exposing a stored secret.
73
+ """
74
+ if isinstance(value, list):
75
+ return [_redact_process_inputs(item) for item in value]
76
+ if not isinstance(value, dict):
77
+ return value
78
+
79
+ result: dict[str, Any] = {}
80
+ for key, item in value.items():
81
+ if key.casefold() != "processinputs" or not isinstance(item, list):
82
+ result[key] = _redact_process_inputs(item)
83
+ continue
84
+
85
+ rows: list[Any] = []
86
+ for row in item:
87
+ if not isinstance(row, dict):
88
+ rows.append(_REDACTED if row is not None else None)
89
+ continue
90
+ clean: dict[str, Any] = {}
91
+ for row_key, row_value in row.items():
92
+ if row_key.casefold() == "value" and row_value is not None:
93
+ clean[row_key] = _REDACTED
94
+ else:
95
+ clean[row_key] = _redact_process_inputs(row_value)
96
+ rows.append(clean)
97
+ result[key] = rows
98
+ return result
99
+
100
+
101
+ def get_schedule(client, args) -> dict:
102
+ result = client.get(f"/api/Schedules/{args.id}")
103
+ if args.redact_process_inputs:
104
+ result = _redact_process_inputs(result)
105
+ return {"result": result}
106
+
107
+
108
+ # -- create / update / delete ----------------------------------------------
109
+
110
+ # RecurrenceTypes enum (Domain/Enums/Scheduler/RecurrenceTypes.cs): NONE=0, ONCE=1,
111
+ # MINUTES=2, HOURS=3, DAILY=4, WEEKLY=5, MONTHLY=6, YEARLY=7, CRON=8. The crontab
112
+ # feature (PRC-3282) is recurrence type 8 with a RecurrenceCron block.
113
+ _RECURRENCE_CRON = 8
114
+
115
+
116
+ def _apply_cron(body: dict, args) -> dict:
117
+ """When --cron is given, REPLACE the recurrence block with the crontab shape.
118
+
119
+ Replace, not overlay. A cron recurrence carries only `recurrence: 8`,
120
+ `cronExpression`, `timeZone`, `info`, `startDate` and `isEndDate` (plus `endDate` when
121
+ the window really ends). Leaving the calendar-recurrence fields in place —
122
+ `every` / `onDay` / `onThe` / `isOnThe` / `isWeekendExcluded` — is what earns the
123
+ generic HTTP 400 `[{"statusCode":502,"value":"Invalid request due to missing or
124
+ incorrect resource parameters.","target":"schedules"}]`. Captured from the designer's
125
+ own PUT, which sends exactly the keys below and nothing else; the same body that fails
126
+ with them present succeeds with them stripped, so this drops them rather than
127
+ trusting a caller's --payload to be cron-shaped already.
128
+ """
129
+ if not getattr(args, "cron", None):
130
+ return body
131
+ src_rec = dict(body.get("recurrence") or {})
132
+ rec = {"recurrence": _RECURRENCE_CRON,
133
+ "cronExpression": args.cron,
134
+ "info": (getattr(args, "recurrence_info", None)
135
+ or src_rec.get("info") or f"cron: {args.cron}"),
136
+ "isEndDate": bool(src_rec.get("isEndDate"))}
137
+ tz = getattr(args, "timezone", None) or src_rec.get("timeZone")
138
+ if tz:
139
+ rec["timeZone"] = tz
140
+ # Only these two calendar fields survive: the activation window a cron may still carry.
141
+ if src_rec.get("startDate"):
142
+ rec["startDate"] = src_rec["startDate"]
143
+ if rec["isEndDate"] and src_rec.get("endDate"):
144
+ rec["endDate"] = src_rec["endDate"]
145
+ body["recurrence"] = rec
146
+ return body
147
+
148
+
149
+ # Recurrences that read `recurrence.timeZone`: DAILY..YEARLY evaluate their weekday /
150
+ # day-of-month / time-of-day rules on that zone's local clock, CRON evaluates its
151
+ # expression there. ONCE / MINUTES / HOURS never read it. An absent zone means UTC; an id
152
+ # the server cannot resolve fails the whole recurrence.
153
+ _ZONED_RECURRENCES = {4, 5, 6, 7, _RECURRENCE_CRON}
154
+
155
+
156
+ def _apply_timezone(body: dict, args) -> dict:
157
+ """Set --timezone on a calendar recurrence (the cron path already carries it).
158
+
159
+ Refuses it on a recurrence type that ignores the zone, rather than writing a key the
160
+ server silently drops."""
161
+ tz = getattr(args, "timezone", None)
162
+ if not tz or getattr(args, "cron", None):
163
+ return body
164
+ rec = body.get("recurrence")
165
+ kind = rec.get("recurrence") if isinstance(rec, dict) else None
166
+ if kind not in _ZONED_RECURRENCES:
167
+ raise errors.UsageError(
168
+ f"--timezone has no effect on recurrence type {kind!r}: only daily (4), weekly (5), "
169
+ f"monthly (6), yearly (7) and cron (8) schedules are evaluated in a time zone")
170
+ rec["timeZone"] = tz
171
+ return body
172
+
173
+
174
+ def _payload_args(p: argparse.ArgumentParser) -> None:
175
+ add_profile_arg(p)
176
+ p.add_argument("--payload", required=True,
177
+ help="schedule as a JSON object (see PROCESIO-API-NOTES.md for the shape)")
178
+ p.add_argument("--cron",
179
+ help="5-field crontab expression (min hour day month weekday); sets "
180
+ "the recurrence to CRON (type 8) over the --payload. Preview it "
181
+ "first with validate-crontab. BE rule (PRC-5406): 5 fields only "
182
+ "(no seconds), @-macros like @daily are REJECTED, max 100 chars. "
183
+ "The expression runs on --timezone's clock (UTC when omitted); "
184
+ "startDate / endDate are always UTC.")
185
+ p.add_argument("--timezone",
186
+ help="IANA timezone id (e.g. Europe/Bucharest) the recurrence runs in. "
187
+ "Applies to cron and to daily / weekly / monthly / yearly "
188
+ "recurrences, whose day and time rules follow that zone's local "
189
+ "clock, DST included; absent means UTC")
190
+ p.add_argument("--recurrence-info", dest="recurrence_info",
191
+ help="human-readable recurrence label (optional)")
192
+
193
+
194
+ def create_schedule(client, args) -> dict:
195
+ body = _apply_timezone(_apply_cron(parse_json_arg(args.payload, "payload"), args), args)
196
+ return {"result": client.post("/api/Schedules", body)}
197
+
198
+
199
+ def update_schedule(client, args) -> dict:
200
+ body = _apply_timezone(_apply_cron(parse_json_arg(args.payload, "payload"), args), args)
201
+ return {"result": client.put("/api/Schedules", body)}
202
+
203
+
204
+ # -- crontab preview --------------------------------------------------------
205
+
206
+ def _validate_crontab_args(p: argparse.ArgumentParser) -> None:
207
+ add_profile_arg(p)
208
+ p.add_argument("--cron", required=True,
209
+ help="5-field crontab expression to validate (min hour day month weekday)")
210
+ p.add_argument("--timezone", help="IANA timezone id (default server/UTC)")
211
+ p.add_argument("--count", type=int,
212
+ help="how many upcoming occurrences to return (default 5, max 20)")
213
+ p.add_argument("--start-date", dest="start_date", help="ISO-8601 activation start (optional)")
214
+ p.add_argument("--end-date", dest="end_date", help="ISO-8601 activation end (optional)")
215
+
216
+
217
+ def validate_crontab(client, args) -> dict:
218
+ body = {"cronExpression": args.cron, "timeZone": args.timezone,
219
+ "count": args.count, "startDate": args.start_date, "endDate": args.end_date}
220
+ body = {k: v for k, v in body.items() if v is not None}
221
+ return {"result": client.post("/api/Schedules/validate-crontab", body)}
222
+
223
+
224
+ def delete_schedule(client, args) -> dict:
225
+ return {"result": client.delete(f"/api/Schedules/{args.id}")}
226
+
227
+
228
+ # -- enable / disable -------------------------------------------------------
229
+
230
+ def _status_args(p: argparse.ArgumentParser) -> None:
231
+ add_profile_arg(p)
232
+ p.add_argument("--id", required=True, help="schedule id (scheduleId)")
233
+ p.add_argument("--active", required=True, choices=["true", "false"],
234
+ help="true to enable the schedule, false to disable it")
235
+
236
+
237
+ def set_schedule_status(client, args) -> dict:
238
+ # The API names the query flag `enable`; we expose it as --active per spec.
239
+ q = {"enable": args.active}
240
+ return {"result": client.patch(f"/api/Schedules/{args.id}/status", None, q)}
241
+
242
+
243
+ # -- notifications ----------------------------------------------------------
244
+
245
+ def _notif_id_args(p: argparse.ArgumentParser) -> None:
246
+ add_profile_arg(p)
247
+ p.add_argument("--id", required=True, help="schedule id (scheduleId)")
248
+
249
+
250
+ def get_schedule_notifications(client, args) -> dict:
251
+ return {"result": client.get(f"/api/Schedules/notifications/{args.id}")}
252
+
253
+
254
+ def _notif_payload_args(p: argparse.ArgumentParser) -> None:
255
+ add_profile_arg(p)
256
+ p.add_argument("--payload", required=True,
257
+ help="notifications config as a JSON object")
258
+
259
+
260
+ def set_schedule_notifications(client, args) -> dict:
261
+ body = parse_json_arg(args.payload, "payload")
262
+ return {"result": client.post("/api/Schedules/notifications", body)}
263
+
264
+
265
+ # -- project schedules ------------------------------------------------------
266
+
267
+ def _project_args(p: argparse.ArgumentParser) -> None:
268
+ add_profile_arg(p)
269
+ p.add_argument("--id", required=True, help="project (process) id")
270
+
271
+
272
+ def list_project_schedules(client, args) -> dict:
273
+ return {"result": client.get(f"/api/Projects/{args.id}/restricted/schedules")}
274
+
275
+
276
+ ACTIONS = {
277
+ "list-schedules": ActionDef(
278
+ func=list_schedules, add_args=_list_args, needs_client=True,
279
+ description="List schedules (GET /api/Schedules).",
280
+ ),
281
+ "get-schedule": ActionDef(
282
+ func=get_schedule, add_args=_get_args, needs_client=True,
283
+ description="Get one schedule by id; use --redact-process-inputs for safe evidence.",
284
+ ),
285
+ "create-schedule": ActionDef(
286
+ func=create_schedule, add_args=_payload_args, needs_client=True,
287
+ description="Create a schedule (POST /api/Schedules) from a JSON --payload; "
288
+ "--cron/--timezone sets a crontab recurrence.",
289
+ ),
290
+ "update-schedule": ActionDef(
291
+ func=update_schedule, add_args=_payload_args, needs_client=True,
292
+ description="Update a schedule (PUT /api/Schedules) from a JSON --payload; "
293
+ "--cron/--timezone sets a crontab recurrence.",
294
+ ),
295
+ "validate-crontab": ActionDef(
296
+ func=validate_crontab, add_args=_validate_crontab_args, needs_client=True,
297
+ description="Preview a crontab expression's next occurrences "
298
+ "(POST /api/Schedules/validate-crontab).",
299
+ ),
300
+ "delete-schedule": ActionDef(
301
+ func=delete_schedule, add_args=_id_args, needs_client=True,
302
+ description="Delete a schedule (DELETE /api/Schedules/{id}).",
303
+ ),
304
+ "set-schedule-status": ActionDef(
305
+ func=set_schedule_status, add_args=_status_args, needs_client=True,
306
+ description="Enable/disable a schedule (PATCH /api/Schedules/{id}/status --active true|false).",
307
+ ),
308
+ "get-schedule-notifications": ActionDef(
309
+ func=get_schedule_notifications, add_args=_notif_id_args, needs_client=True,
310
+ description="Get a schedule's notifications (GET /api/Schedules/notifications/{id}).",
311
+ ),
312
+ "set-schedule-notifications": ActionDef(
313
+ func=set_schedule_notifications, add_args=_notif_payload_args, needs_client=True,
314
+ description="Set a schedule's notifications (POST /api/Schedules/notifications) from a JSON --payload.",
315
+ ),
316
+ "list-project-schedules": ActionDef(
317
+ func=list_project_schedules, add_args=_project_args, needs_client=True,
318
+ description="List a project's schedules (GET /api/Projects/{id}/restricted/schedules).",
319
+ ),
320
+ }
@@ -0,0 +1,232 @@
1
+ """SQL Server action hardening: convert inline `N'<%N%>'` string-substitution in Execute Query /
2
+ Execute Command nodes (SQL-injection-prone, and the wrong action config) into the safe form —
3
+ named `@params` bound via the `Parameters config tab`. See tools/procesio/PROCESIO-SQL-ACTIONS-NOTES.md.
4
+
5
+ sql-scan list a process's SQL nodes with inline-vs-parameterized status (read-only)
6
+ sql-parameterize convert one node (--node) or every inline node (--all) -> validate -> PUT
7
+ (--dry-run converts + validates but does not PUT; an invalid flow is never PUT)
8
+ sql-convert move one node between the Execute Command and Execute Query families, and
9
+ optionally rebind its Output -> validate + flow-lint -> PUT. Needed whenever a
10
+ procedure that ends in SELECT sits on a Command node: Command returns
11
+ rows-affected, so the result set is discarded with no error to show for it.
12
+
13
+ JSON in / JSON out; impure (live client). Thin, validated wrappers over GET/validate/PUT /api/Projects.
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import argparse
18
+
19
+ from tools.procesio.actiondef import ActionDef
20
+ from tools.procesio.client import VARIABLES_ONLY
21
+ from tools.procesio.errors import ProcesioAPIError, UsageError
22
+ from tools.procesio.flowmodel import sqlparam
23
+ from tools.procesio.handlers.common import add_profile_arg
24
+ from tools.procesio.handlers.fevalidate import run_fe_validation, save_flow
25
+
26
+
27
+ def _enabled(node: dict) -> bool:
28
+ """False if the node is disabled in the designer (so --all never touches a disabled node)."""
29
+ cd = node.get("customData") or {}
30
+ return not (node.get("isDisabled") or node.get("disabled") or cd.get("isDisabled"))
31
+
32
+
33
+ def _fetch_flow(client, pid: str) -> dict:
34
+ flow = client.get(f"/api/Projects/{pid}")
35
+ return flow.get("flow") if isinstance(flow, dict) and "flow" in flow else flow
36
+
37
+
38
+ def _validate(client, flow: dict):
39
+ """(is_valid, errors). Empty 200 == valid (mirrors process-validate)."""
40
+ try:
41
+ res = client.post("/api/Projects/validate", flow)
42
+ except ProcesioAPIError as e:
43
+ det = e.details if isinstance(e.details, dict) else {"body": e.details}
44
+ return False, det.get("body", det)
45
+ empty = (not res) or (isinstance(res, dict) and list(res.keys()) == ["raw_text"] and not res["raw_text"])
46
+ return (True, None) if empty else (False, res)
47
+
48
+
49
+ def _lint(client, flow: dict) -> list[dict]:
50
+ """Designer-layer save-blockers the BE validator does not report (same oracle as flow-lint)."""
51
+ from tools.procesio.handlers.flowlint import _template_sidepanel_ids, lint_flow_dto
52
+
53
+ try:
54
+ tmpl_sp = _template_sidepanel_ids(client)
55
+ except Exception: # noqa: BLE001 - catalog unreachable -> lint what does not need it
56
+ tmpl_sp = {}
57
+
58
+ def target_vars_of(fid: str) -> dict:
59
+ try:
60
+ r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
61
+ f = r.get("flow", r) if isinstance(r, dict) else r
62
+ return {v["id"]: v for v in f.get("variables") or []}
63
+ except Exception: # noqa: BLE001 - unreadable target -> can't assert its contract
64
+ return {}
65
+ return lint_flow_dto(flow, tmpl_sp, target_vars_of)
66
+
67
+
68
+ def sql_scan(client, args) -> dict:
69
+ flow = _fetch_flow(client, args.id)
70
+ return {"id": args.id, "title": flow.get("title"), "sql_nodes": sqlparam.scan(flow)}
71
+
72
+
73
+ def sql_parameterize(client, args) -> dict:
74
+ if not args.node and not args.all:
75
+ raise UsageError("pass --node <label|id> to convert one node, or --all for every inline SQL node")
76
+ flow = _fetch_flow(client, args.id)
77
+ if args.all:
78
+ targets = [a for a in flow.get("actions") or []
79
+ if sqlparam.is_sql_node(a) and sqlparam.is_inline(a) and _enabled(a)]
80
+ else:
81
+ n = sqlparam.find_node(flow, args.node)
82
+ if not n:
83
+ raise UsageError(f"node not found in process {args.id}: {args.node}")
84
+ targets = [n]
85
+
86
+ changes = []
87
+ for n in targets:
88
+ ok, msg = sqlparam.parameterize_node(n)
89
+ changes.append({"node": n.get("actionName"), "id": n.get("id"), "converted": ok, "msg": msg})
90
+ converted = [c for c in changes if c["converted"]]
91
+ result = {"id": args.id, "converted": len(converted), "changes": changes}
92
+ if not converted:
93
+ result["note"] = "nothing to convert (already parameterized or no inline SQL)"
94
+ return result
95
+
96
+ valid, errors = _validate(client, flow)
97
+ result["isValid"] = valid
98
+ if not valid: # never PUT an invalid flow
99
+ result["errors"] = errors
100
+ result["put"] = False
101
+ return result
102
+ fe = run_fe_validation(client, flow)
103
+ result["fe"] = fe
104
+ if args.dry_run:
105
+ result["isValid"] = bool(valid and fe["clean"])
106
+ result["put"] = False
107
+ result["dry_run"] = True
108
+ return result
109
+ # The mark is stamped from the FE+BE verdict and then re-read: the platform stores
110
+ # whatever the body carries and never computes this field, so passing the fetched
111
+ # value through would leave a corrected process marked broken.
112
+ saved = save_flow(client, flow, flow_id=args.id, valid=valid and fe["clean"])
113
+ result["isValid"] = saved["isValid"]
114
+ result["stamped"] = saved["stamped"]
115
+ if "readback_error" in saved:
116
+ result["readback_error"] = saved["readback_error"]
117
+ result["put"] = True
118
+ return result
119
+
120
+
121
+ def _resolve_variable(flow: dict, key: str) -> str:
122
+ """A flow variable's id, from its id or its name. Ambiguity is an error, never a guess."""
123
+ variables = flow.get("variables") or []
124
+ if any(v.get("id") == key for v in variables):
125
+ return key
126
+ matches = [v for v in variables if v.get("name") == key]
127
+ if not matches:
128
+ known = ", ".join(sorted(str(v.get("name")) for v in variables))
129
+ raise UsageError(f"variable not found: {key} (process has: {known})")
130
+ if len(matches) > 1:
131
+ raise UsageError(f"variable name {key!r} is ambiguous - pass its id instead")
132
+ return matches[0]["id"]
133
+
134
+
135
+ def sql_convert(client, args) -> dict:
136
+ target = sqlparam.EQ_TEMPLATE if args.to == "query" else sqlparam.EC_TEMPLATE
137
+ flow = _fetch_flow(client, args.id)
138
+ node = sqlparam.find_node(flow, args.node)
139
+ if not node:
140
+ raise UsageError(f"node not found in process {args.id}: {args.node}")
141
+
142
+ changed, msg = sqlparam.convert_family(node, target)
143
+ result = {"id": args.id, "node": node.get("actionName"), "node_id": node.get("id"),
144
+ "to": target, "converted": changed, "msg": msg}
145
+
146
+ if args.output_variable:
147
+ var_id = _resolve_variable(flow, args.output_variable)
148
+ rebound, rmsg = sqlparam.rebind_output(node, var_id)
149
+ result["output_rebound"] = rebound
150
+ result["output_msg"] = rmsg
151
+ changed = changed or rebound
152
+
153
+ if not changed:
154
+ result["note"] = "nothing to change"
155
+ result["put"] = False
156
+ return result
157
+
158
+ valid, errors = _validate(client, flow)
159
+ result["isValid"] = valid
160
+ if not valid: # never PUT an invalid flow
161
+ result["errors"] = errors
162
+ result["put"] = False
163
+ return result
164
+
165
+ # The BE validator does not see designer save-blockers, and "Execute Query with a null Output"
166
+ # is exactly one of them — the case this conversion is most likely to create.
167
+ problems = _lint(client, flow)
168
+ result["lint_clean"] = not problems
169
+ if problems:
170
+ result["lint_problems"] = problems
171
+ result["put"] = False
172
+ return result
173
+
174
+ fe = run_fe_validation(client, flow)
175
+ result["fe"] = fe
176
+ if args.dry_run:
177
+ result["isValid"] = bool(valid and fe["clean"])
178
+ result["put"] = False
179
+ result["dry_run"] = True
180
+ return result
181
+ # The mark is stamped from the FE+BE verdict and then re-read: the platform stores
182
+ # whatever the body carries and never computes this field, so passing the fetched
183
+ # value through would leave a corrected process marked broken.
184
+ saved = save_flow(client, flow, flow_id=args.id, valid=valid and fe["clean"])
185
+ result["isValid"] = saved["isValid"]
186
+ result["stamped"] = saved["stamped"]
187
+ if "readback_error" in saved:
188
+ result["readback_error"] = saved["readback_error"]
189
+ result["put"] = True
190
+ return result
191
+
192
+
193
+ def _scan_args(p: argparse.ArgumentParser) -> None:
194
+ add_profile_arg(p)
195
+ p.add_argument("--id", required=True, help="process (project) id")
196
+
197
+
198
+ def _param_args(p: argparse.ArgumentParser) -> None:
199
+ add_profile_arg(p)
200
+ p.add_argument("--id", required=True, help="process (project) id")
201
+ p.add_argument("--node", help="node actionName or id to convert")
202
+ p.add_argument("--all", action="store_true", help="convert every inline SQL node in the process")
203
+ p.add_argument("--dry-run", dest="dry_run", action="store_true",
204
+ help="convert + validate but do not PUT")
205
+
206
+
207
+ def _convert_args(p: argparse.ArgumentParser) -> None:
208
+ add_profile_arg(p)
209
+ p.add_argument("--id", required=True, help="process (project) id")
210
+ p.add_argument("--node", required=True, help="node actionName or id to convert")
211
+ p.add_argument("--to", required=True, choices=("query", "command"),
212
+ help="target family: query (returns a result set) or command (returns rows affected)")
213
+ p.add_argument("--output-variable", dest="output_variable",
214
+ help="flow variable name or id to bind the node's Output to")
215
+ p.add_argument("--dry-run", dest="dry_run", action="store_true",
216
+ help="convert + validate + lint but do not PUT")
217
+
218
+
219
+ ACTIONS = {
220
+ "sql-convert": ActionDef(
221
+ func=sql_convert, add_args=_convert_args, needs_client=True,
222
+ description=("Move one SQL node between the Execute Command and Execute Query families "
223
+ "(--to) and optionally rebind its Output (--output-variable); validate + "
224
+ "flow-lint then PUT (--dry-run to preview). A SELECT-ing procedure on a Command "
225
+ "node discards its result set silently - this is the fix.")),
226
+ "sql-scan": ActionDef(
227
+ func=sql_scan, add_args=_scan_args, needs_client=True,
228
+ description="List a process's SQL Server actions (Execute Query/Command) with inline-vs-parameterized status."),
229
+ "sql-parameterize": ActionDef(
230
+ func=sql_parameterize, add_args=_param_args, needs_client=True,
231
+ description="Convert inline N'<%N%>' SQL nodes to safe named-@param binding (--node or --all); validate then PUT (--dry-run to preview)."),
232
+ }