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,229 @@
1
+ """Offline structural reader actions over a .procesio export / live flow DTO.
2
+
3
+ `read-flow-graph` returns the canonical node/edge graph model (the substrate the canvas
4
+ layout tool and inspect-flow build on). No network; reads a file, '-' (stdin), or a raw
5
+ JSON string.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ import argparse
10
+ import json
11
+ import sys
12
+ from pathlib import Path
13
+
14
+ from tools.procesio.actiondef import ActionDef
15
+ from tools.procesio import errors
16
+ from tools.procesio.flowmodel import read_bundle, read_flow
17
+ from tools.procesio.flowmodel.inspect import inspect as _inspect
18
+
19
+
20
+ def _load_in(value: str) -> str:
21
+ """Resolve --in to a JSON string: '-' = stdin, an existing path = file, else literal."""
22
+ if value == "-":
23
+ return sys.stdin.read()
24
+ try:
25
+ p = Path(value)
26
+ if p.exists() and p.is_file():
27
+ return p.read_text(encoding="utf-8")
28
+ except OSError:
29
+ pass
30
+ return value
31
+
32
+
33
+ def _in_args(p: argparse.ArgumentParser) -> None:
34
+ p.add_argument("--in", dest="in_path", required=True,
35
+ help=".procesio export or flow JSON: a path, '-' for stdin, or raw JSON")
36
+ p.add_argument("--flow-id", dest="flow_id",
37
+ help="which flow when the bundle has more than one")
38
+ p.add_argument("--resource-map", dest="resource_map", action="store_true",
39
+ help="emit every flow + the cross-process (process→process) edge list")
40
+
41
+
42
+ def read_flow_graph(args) -> dict:
43
+ raw = _load_in(args.in_path)
44
+ try:
45
+ obj = json.loads(raw)
46
+ except json.JSONDecodeError as e:
47
+ raise errors.UsageError(f"--in is not valid JSON: {e}")
48
+ if args.resource_map:
49
+ return {"result": read_bundle(obj)}
50
+ return {"result": read_flow(obj, flow_id=args.flow_id).to_dict()}
51
+
52
+
53
+ def _inspect_args(p: argparse.ArgumentParser) -> None:
54
+ p.add_argument("--in", dest="in_path", required=True,
55
+ help=".procesio export or flow JSON: a path, '-' for stdin, or raw JSON")
56
+ p.add_argument("--flow-id", dest="flow_id",
57
+ help="which flow when the bundle has more than one")
58
+
59
+
60
+ def inspect_flow(args) -> dict:
61
+ raw = _load_in(args.in_path)
62
+ try:
63
+ obj = json.loads(raw)
64
+ except json.JSONDecodeError as e:
65
+ raise errors.UsageError(f"--in is not valid JSON: {e}")
66
+ return {"result": _inspect(obj, flow_id=args.flow_id)}
67
+
68
+
69
+ def _digest_args(p: argparse.ArgumentParser) -> None:
70
+ p.add_argument("--in", dest="in_path", required=True,
71
+ help="a flow JSON / API envelope / .procesio bundle file, OR a directory of them "
72
+ "(every *.json is read; subprocess targets resolve to titles across the set)")
73
+ p.add_argument("--out", dest="out_dir",
74
+ help="write one <slug>.md per flow + INDEX.md here; omit to return the Markdown inline")
75
+ p.add_argument("--names", dest="names",
76
+ help="optional JSON file {guid: display name} for ids outside the flows "
77
+ "(credentials, forms, data models)")
78
+
79
+
80
+ def _slug(title: str) -> str:
81
+ import re as _re
82
+ s = _re.sub(r"[^A-Za-z0-9]+", "-", title).strip("-").lower()
83
+ return s[:80] or "untitled"
84
+
85
+
86
+ def flow_digest(args) -> dict:
87
+ from tools.procesio.flowmodel import digest as _d
88
+ src = Path(args.in_path)
89
+ paths = sorted(src.glob("*.json")) if src.is_dir() else [src]
90
+ if not paths:
91
+ raise errors.UsageError(f"--in {args.in_path}: no .json files")
92
+ flows = []
93
+ for p in paths:
94
+ try:
95
+ flows += _d.unwrap(json.loads(p.read_text(encoding="utf-8")))
96
+ except (json.JSONDecodeError, OSError) as e:
97
+ raise errors.UsageError(f"{p}: {e}")
98
+ names = {f.get("id"): _d._title(f) for f in flows if f.get("id")}
99
+ if args.names:
100
+ try:
101
+ names.update(json.loads(Path(args.names).read_text(encoding="utf-8")))
102
+ except (json.JSONDecodeError, OSError) as e:
103
+ raise errors.UsageError(f"--names: {e}")
104
+ if not args.out_dir:
105
+ return {"result": {"count": len(flows),
106
+ "flows": [{"id": f.get("id"), "title": _d._title(f),
107
+ "markdown": _d.render(f, names)} for f in flows]}}
108
+ out = Path(args.out_dir)
109
+ out.mkdir(parents=True, exist_ok=True)
110
+ index = ["# Process index", "", "| process | nodes | calls |", "|---|---|---|"]
111
+ written = []
112
+ for f in sorted(flows, key=_d._title):
113
+ slug = _slug(_d._title(f)) + "-" + str(f.get("id", ""))[:8]
114
+ (out / f"{slug}.md").write_text(_d.render(f, names), encoding="utf-8")
115
+ called = [names[g] for g in _d.calls(f) if g in names and g != f.get("id")
116
+ and g in {x.get("id") for x in flows}]
117
+ index.append(f"| [{_d._title(f)}]({slug}.md) | {len(f.get('actions') or [])} | "
118
+ f"{'; '.join(sorted(set(called)))} |")
119
+ written.append(f"{slug}.md")
120
+ (out / "INDEX.md").write_text("\n".join(index) + "\n", encoding="utf-8")
121
+ return {"result": {"count": len(flows), "out": str(out), "files": written + ["INDEX.md"]}}
122
+
123
+
124
+ def _form_digest_args(p: argparse.ArgumentParser) -> None:
125
+ p.add_argument("--in", dest="in_path", required=True,
126
+ help="a form template JSON (form-get output) or a directory of them; a sibling "
127
+ "<id>.code.json (form-get-code output) adds the global CSS/JS")
128
+ p.add_argument("--processes", dest="processes",
129
+ help="directory of process JSON (API envelope / flow) to name RUN_PROCESS targets "
130
+ "and their variables")
131
+ p.add_argument("--out", dest="out_dir",
132
+ help="write <slug>.md + <slug>/ (scripts, global form.js/form.css) per form and "
133
+ "FORM-PROCESS-MAP.md here; omit to return the Markdown inline")
134
+
135
+
136
+ def form_digest(args) -> dict:
137
+ from tools.procesio.flowmodel import digest as _d
138
+ from tools.procesio.flowmodel import formdigest as _fd
139
+ src = Path(args.in_path)
140
+ paths = ([p for p in sorted(src.glob("*.json")) if not p.name.endswith(".code.json")]
141
+ if src.is_dir() else [src])
142
+ if not paths:
143
+ raise errors.UsageError(f"--in {args.in_path}: no form .json files")
144
+ processes: dict = {}
145
+ if args.processes:
146
+ for p in sorted(Path(args.processes).glob("*.json")):
147
+ try:
148
+ for f in _d.unwrap(json.loads(p.read_text(encoding="utf-8"))):
149
+ if f.get("id"):
150
+ processes[f["id"]] = f
151
+ except (json.JSONDecodeError, OSError):
152
+ continue
153
+ forms = []
154
+ for p in paths:
155
+ try:
156
+ form = _fd.unwrap(json.loads(p.read_text(encoding="utf-8")))
157
+ except (json.JSONDecodeError, OSError) as e:
158
+ raise errors.UsageError(f"{p}: {e}")
159
+ code_path = p.with_name(p.stem + ".code.json")
160
+ code = {}
161
+ if code_path.exists():
162
+ try:
163
+ code = json.loads(code_path.read_text(encoding="utf-8"))
164
+ except json.JSONDecodeError:
165
+ code = {}
166
+ forms.append((form, code))
167
+
168
+ if not args.out_dir:
169
+ return {"result": {"count": len(forms), "forms": [
170
+ {"id": f.get("id"), "name": f.get("name"), "markdown": _fd.render(f, processes)[0]}
171
+ for f, _ in forms]}}
172
+
173
+ out = Path(args.out_dir)
174
+ out.mkdir(parents=True, exist_ok=True)
175
+ fmap = ["# Form → process map", "", "| form | element | trigger | process |", "|---|---|---|---|"]
176
+ written = []
177
+ for form, code in sorted(forms, key=lambda x: x[0].get("name") or ""):
178
+ slug = _slug(form.get("name") or "form") + "-" + str(form.get("id", ""))[:8]
179
+ md, scripts = _fd.render(form, processes)
180
+ side = out / slug
181
+ side.mkdir(exist_ok=True)
182
+ for i, body in enumerate(scripts, 1):
183
+ (side / f"script-{i:03d}.js").write_text(body, encoding="utf-8")
184
+ if code.get("javascript"):
185
+ (side / "form.js").write_text(code["javascript"], encoding="utf-8")
186
+ if code.get("css"):
187
+ (side / "form.css").write_text(code["css"], encoding="utf-8")
188
+ extra = []
189
+ if code.get("javascript") or code.get("css"):
190
+ extra = ["", "## Global code", "",
191
+ f"- JavaScript: {len(code.get('javascript') or '')} chars → `{slug}/form.js`",
192
+ f"- CSS: {len(code.get('css') or '')} chars → `{slug}/form.css`"]
193
+ (out / f"{slug}.md").write_text(md + "\n".join(extra) + f"\n\nScripts: `{slug}/script-NNN.js`\n",
194
+ encoding="utf-8")
195
+ written.append(f"{slug}.md")
196
+ for link in _fd.process_links(form):
197
+ pid = link["process_id"]
198
+ title = (processes.get(pid) or {}).get("title") or pid
199
+ fmap.append(f"| {form.get('name')} | {link['element']} | {link['trigger']} | {title} |")
200
+ (out / "FORM-PROCESS-MAP.md").write_text("\n".join(fmap) + "\n", encoding="utf-8")
201
+ return {"result": {"count": len(forms), "out": str(out), "files": written + ["FORM-PROCESS-MAP.md"]}}
202
+
203
+
204
+ ACTIONS = {
205
+ "form-digest": ActionDef(
206
+ func=form_digest, add_args=_form_digest_args, needs_client=False,
207
+ description="Readable Markdown digest of forms (offline): structure tree, every element / "
208
+ "form-level event, RUN_PROCESS input/output maps with form paths and process "
209
+ "variables resolved to names, MAP_FORM_DATA conditions, scripts saved beside. "
210
+ "--out adds FORM-PROCESS-MAP.md.",
211
+ ),
212
+ "flow-digest": ActionDef(
213
+ func=flow_digest, add_args=_digest_args, needs_client=False,
214
+ description="Readable Markdown digest of flows (offline): variable contract, nodes in "
215
+ "execution order, each node's script/SQL/HTTP/subprocess parameters with "
216
+ "variable and flow ids resolved to names. --in a file or a directory; --out "
217
+ "writes one .md per flow + INDEX.md.",
218
+ ),
219
+ "read-flow-graph": ActionDef(
220
+ func=read_flow_graph, add_args=_in_args, needs_client=False,
221
+ description="Parse a .procesio export/flow into a node/edge graph model "
222
+ "(offline). --resource-map for the cross-process graph.",
223
+ ),
224
+ "inspect-flow": ActionDef(
225
+ func=inspect_flow, add_args=_inspect_args, needs_client=False,
226
+ description="Structural summary of a flow (offline): counts, action families, "
227
+ "branches, subprocess calls, resources, variables, advisory smells.",
228
+ ),
229
+ }
@@ -0,0 +1,269 @@
1
+ """flow-lint: replicate the designer's client-side "Process Errors" checks on a live flow.
2
+
3
+ Why this exists: POST /api/Projects/validate only validates the RUNTIME layer (parameters) and
4
+ returns EMPTY even when the designer refuses to SAVE. The designer's "Process Errors" panel is a
5
+ separate CLIENT-SIDE check of the DESIGNER layer (customData) with NO server endpoint. This lint
6
+ replicates that designer check so a flow can be verified offline / in CI.
7
+
8
+ Checks (per action, against the DESIGNER customData layer):
9
+ 1. SIDEPANEL_ID — a Call/Trigger Subprocess node whose "Subprocess Configuration" side-pannel
10
+ setting id != the CURRENT template's id. PROCESIO bumped the template's side-pannel id over
11
+ time; nodes built against an older template keep the old id, so the designer can't find the
12
+ mapping and reports EVERY required input as "missing". THE most common cause of the phantom
13
+ "Mapping of required subprocess variable (X) is missing." (Networky: 1da555da / 15af8b81 vs
14
+ current 5456caf0 for Call, 8540605e for Trigger.)
15
+ 2. REQ_INPUT_UNMAPPED — a required target input (type 10, isRequired) with no process-inputs row.
16
+ 3. OUTPUT_NOT_TYPE30 — a process-outputs row mapping a target var that is NOT an output (type 30).
17
+ A subprocess only exposes type-30 vars as outputs; mapping a type-20 internal var => the
18
+ designer flags "Check data mapping."
19
+ 4. EXECQUERY_NO_OUTPUT — an Execute Query whose Output subsection is null. The designer requires it.
20
+ 5. CODE_ERROR_SCOPE / CODE_UNDECLARED — Node code binding an isError variable (an action's
21
+ error-port output, shown in the "Error" tab, never free-initialized) or an undeclared var.
22
+ 6. missing_error_variable — variableErrorId set to a non-existent variable.
23
+ 7. CUSTOMDATA_PLACEHOLDER — a DESIGNER setting value still holding a runtime `<%N%>` placeholder. The
24
+ customData layer mirrors each Parameter EXCEPT a variable ref is the raw variableId (GUID) there, not
25
+ the positional `<%N%>`. A `<%N%>` left in a customData value = the param->customData mirror was skipped
26
+ (hand-rolled flow edits bypassing the builder's _apply_values_to_config) -> the designer can't resolve
27
+ the token and paints it RED. (Caught three times in review before the rule was written down.)
28
+
29
+ 8. UNREADABLE_STATEMENT / UNREADABLE_SCRIPT — a Query Store or Execute Query statement, or a
30
+ Node script, stored as ONE long line. It runs perfectly and no one can read it: a Query
31
+ Store node IS its statement, and the designer shows a single row that scrolls sideways off
32
+ the screen. The builder lays Query Store SQL out on the way in (tools/procesio/sqlformat.py);
33
+ this catches everything that reached the flow another way.
34
+
35
+ Born 2026-07-05; rebuilt 2026-07-06 after runtime-only versions repeatedly reported false "clean".
36
+ """
37
+ from __future__ import annotations
38
+
39
+ import argparse
40
+ import re
41
+
42
+ from tools.procesio.actiondef import ActionDef
43
+ from tools.procesio.client import VARIABLES_ONLY
44
+ from tools.procesio.handlers.common import add_profile_arg
45
+ from tools.procesio.sqlformat import is_unreadable
46
+
47
+ CODE_PID = "1e6a5523-2091-6c4c-94ac-c7984074673d"
48
+ QUERY_STORE_SQL_PID = "02577ada-0000-0200-0000-00000000b102"
49
+ NULL_GUID = "00000000-0000-0000-0000-000000000000"
50
+ _SUB_TEMPLATES = ("Call Subprocess", "Trigger Subprocess")
51
+ OUTPUT_TYPE = 30 # subprocess variables exposed as outputs
52
+ # built-in scalar datatypes share this prefix; the only object among them is ...1221 (any/Object).
53
+ # An Execute Query Output is a SQL result SET -> must be a list<Object>: isList=True and the element
54
+ # type an Object (the generic ...1221 OR any custom DataModel, whose GUID does NOT share this prefix).
55
+ _PRIM_PREFIX = "0317bfee-b2f5-4bde-bfe8-1212"
56
+ _GENERIC_OBJECT = "0317bfee-b2f5-4bde-bfe8-121212121221"
57
+ # The DESIGNER customData mirrors each Parameter EXCEPT a variable ref is the raw variableId there,
58
+ # while the runtime Parameter uses a <%N%> positional placeholder. A <%N%> left in a customData setting
59
+ # value means the param->customData mirror was skipped (hand-rolled edits) -> the designer can't resolve
60
+ # the token and paints it red ("still red <%0%>"). The builder's _apply_values_to_config does this
61
+ # transform; this lint catches nodes that bypassed it.
62
+ _PLACEHOLDER_RE = re.compile(r"<%\d+%>")
63
+
64
+
65
+ def _is_guid(x) -> bool:
66
+ return isinstance(x, str) and len(x) == 36 and x.count("-") == 4
67
+
68
+
69
+ def _walk_settings(action: dict):
70
+ """Yield every customData.configuration setting (recursing into list-valued settings)."""
71
+ def walk(settings):
72
+ for s in settings or []:
73
+ if isinstance(s, dict):
74
+ yield s
75
+ if isinstance(s.get("value"), list):
76
+ yield from walk(s["value"])
77
+ for cf in (action.get("customData") or {}).get("configuration") or []:
78
+ yield from walk(cf.get("settings") or [])
79
+
80
+
81
+ def _sidepanel(action: dict) -> dict | None:
82
+ for cf in (action.get("customData") or {}).get("configuration") or []:
83
+ for s in cf.get("settings") or []:
84
+ if s.get("type") == "side-pannel":
85
+ return s
86
+ return None
87
+
88
+
89
+ def _subsection(sidepanel: dict | None, kind: str) -> list:
90
+ for sub in (sidepanel.get("value") or []) if sidepanel else []:
91
+ if sub.get("type") == kind:
92
+ return sub.get("value") or []
93
+ return []
94
+
95
+
96
+ def _execquery_output(action: dict):
97
+ """The Execute Query Output subsection value, or the sentinel '__absent__'."""
98
+ for cf in (action.get("customData") or {}).get("configuration") or []:
99
+ for s in cf.get("settings") or []:
100
+ if s.get("type") == "side-pannel":
101
+ for sub in s.get("value") or []:
102
+ if str(sub.get("label")) == "Output":
103
+ return sub.get("value")
104
+ return "__absent__"
105
+
106
+
107
+ _SQL_WORDS = re.compile(r"(?i)(select|insert|update|delete|merge|with)")
108
+
109
+
110
+ def _looks_like_sql(value: str) -> bool:
111
+ return bool(_SQL_WORDS.search(value))
112
+
113
+
114
+ def lint_flow_dto(flow: dict, template_sidepanel_ids: dict, target_vars_of) -> list[dict]:
115
+ """Pure lint over a flow DTO.
116
+ template_sidepanel_ids: {"Call Subprocess": id, "Trigger Subprocess": id} (current template).
117
+ target_vars_of(flow_id) -> {var_id: var_dict} for a called subprocess (injected: no network in tests).
118
+ """
119
+ vmap = {v["id"]: v for v in flow.get("variables") or []}
120
+ problems: list[dict] = []
121
+
122
+ def add(action, kind, detail):
123
+ problems.append({"action": action, "kind": kind, "detail": detail})
124
+
125
+ for a in flow.get("actions") or []:
126
+ nm = a.get("actionName")
127
+ tmpl = a.get("actionTemplateName")
128
+
129
+ for s in _walk_settings(a):
130
+ val = s.get("value")
131
+ if isinstance(val, str) and _PLACEHOLDER_RE.search(val):
132
+ add(nm, "CUSTOMDATA_PLACEHOLDER",
133
+ f"designer setting '{s.get('label')}' still holds a <%N%> placeholder "
134
+ f"(customData must carry the variable GUID, not the runtime placeholder - the "
135
+ f"designer paints it red); param->customData mirror was not applied")
136
+
137
+ # A statement or a script stored as ONE long line runs perfectly and cannot be read:
138
+ # the designer shows a single row that scrolls off the screen. Flagged, not rewritten,
139
+ # because reflowing someone else's code is not the lint's job.
140
+ for prm in a.get("parameters") or []:
141
+ pid, val = prm.get("tabPropertyId"), prm.get("value")
142
+ if not isinstance(val, str) or not is_unreadable(val):
143
+ continue
144
+ if pid == QUERY_STORE_SQL_PID or (tmpl in ("Execute Query", "Execute Command")
145
+ and _looks_like_sql(val)):
146
+ add(nm, "UNREADABLE_STATEMENT",
147
+ f"the SQL is {len(val.strip())} characters on ONE line; lay it out over "
148
+ f"lines so a reader can see the clauses")
149
+ elif pid == CODE_PID:
150
+ add(nm, "UNREADABLE_SCRIPT",
151
+ f"the script is {len(val.strip())} characters on ONE line; keep a script "
152
+ f"body multi-line, one statement per line")
153
+
154
+ if tmpl == "Node":
155
+ cp = next((p for p in a.get("parameters") or [] if p.get("tabPropertyId") == CODE_PID), None)
156
+ for ve in (cp.get("variable") if cp else []) or []:
157
+ vid = ve.get("variableId")
158
+ v = vmap.get(vid)
159
+ if v is None:
160
+ add(nm, "CODE_UNDECLARED", f"code binds undeclared variable {vid}")
161
+ elif v.get("isError"):
162
+ add(nm, "CODE_ERROR_SCOPE",
163
+ f"code binds error-scope variable '{v.get('name')}' (isError=true)")
164
+
165
+ if tmpl == "Execute Query":
166
+ out = _execquery_output(a)
167
+ if out is None or out == "":
168
+ add(nm, "EXECQUERY_NO_OUTPUT", "Execute Query Output subsection is null")
169
+ elif out != "__absent__":
170
+ ov = vmap.get(out)
171
+ if ov is None:
172
+ add(nm, "EXECQUERY_OUTPUT_UNDECLARED", f"Output variable {out} not declared")
173
+ else:
174
+ dt = ov.get("dataType") or ""
175
+ if (not ov.get("isList")) or (dt.startswith(_PRIM_PREFIX) and dt != _GENERIC_OBJECT):
176
+ add(nm, "EXECQUERY_OUTPUT_TYPE",
177
+ f"Output '{ov.get('name')}' must be a list<Object> (a SQL result set) - "
178
+ f"got isList={ov.get('isList')} dataType=...{dt[-4:]} "
179
+ f"(scalar/primitive -> designer 'data type mismatch')")
180
+
181
+ ev = a.get("variableErrorId")
182
+ if ev and ev not in vmap:
183
+ add(nm, "missing_error_variable", f"variableErrorId {ev} not declared")
184
+
185
+ if tmpl in _SUB_TEMPLATES:
186
+ sp = _sidepanel(a)
187
+ want = template_sidepanel_ids.get(tmpl)
188
+ if want and (sp is None or sp.get("id") != want):
189
+ add(nm, "SIDEPANEL_ID",
190
+ f"side-pannel id {sp.get('id') if sp else None} != current template {want} "
191
+ f"(designer cannot find the mapping)")
192
+ target = next((p["value"] for p in a.get("parameters") or []
193
+ if _is_guid(p.get("value")) and p["value"] != NULL_GUID), None)
194
+ if not target:
195
+ continue
196
+ tv = target_vars_of(target) or {}
197
+ mapped_in = {r.get("subprocess"): r.get("process") for r in _subsection(sp, "process-inputs")}
198
+ for vid, v in tv.items():
199
+ if v.get("type") == 10 and v.get("isRequired"):
200
+ src = mapped_in.get(vid)
201
+ if src is None or src == "":
202
+ add(nm, "REQ_INPUT_UNMAPPED",
203
+ f"required subprocess input '{v.get('name')}' has no designer mapping")
204
+ else:
205
+ root = str(src).split(".")[0]
206
+ if _is_guid(root) and root not in vmap:
207
+ add(nm, "REQ_INPUT_DEAD_SOURCE",
208
+ f"input '{v.get('name')}' mapped from undeclared variable {root}")
209
+ for r in _subsection(sp, "process-outputs"):
210
+ ov = tv.get(r.get("subprocess"))
211
+ if ov is not None and ov.get("type") != OUTPUT_TYPE:
212
+ add(nm, "OUTPUT_NOT_TYPE30",
213
+ f"output maps target var '{ov.get('name')}' which is type {ov.get('type')}, "
214
+ f"not an exposed output (type {OUTPUT_TYPE})")
215
+ return problems
216
+
217
+
218
+ def _args(p: argparse.ArgumentParser) -> None:
219
+ add_profile_arg(p)
220
+ p.add_argument("--id", required=True, help="flow (process) id to lint")
221
+
222
+
223
+ def _template_sidepanel_ids(client) -> dict:
224
+ acts = client.get("/api/Actions?getFullAction=true")
225
+ if isinstance(acts, dict):
226
+ acts = acts.get("result", acts)
227
+ acts = acts.get("actions", acts) if isinstance(acts, dict) else acts
228
+ out = {}
229
+ for tn in _SUB_TEMPLATES:
230
+ t = next((a for a in acts if a.get("name") == tn), None)
231
+ if not t:
232
+ continue
233
+ sp = next((s["id"] for tab in t.get("configuration") or []
234
+ for s in tab.get("settings") or [] if s.get("type") == "side-pannel"), None)
235
+ if sp:
236
+ out[tn] = sp
237
+ return out
238
+
239
+
240
+ def flow_lint(client, args) -> dict:
241
+ resp = client.get(f"/api/Projects/{args.id}")
242
+ flow = resp.get("flow", resp) if isinstance(resp, dict) else resp
243
+ tmpl_sp = _template_sidepanel_ids(client)
244
+ cache: dict = {}
245
+
246
+ def target_vars_of(fid: str) -> dict:
247
+ if fid not in cache:
248
+ try:
249
+ r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
250
+ f = r.get("flow", r) if isinstance(r, dict) else r
251
+ cache[fid] = {v["id"]: v for v in f.get("variables") or []}
252
+ except Exception: # noqa: BLE001 - unreadable target -> can't assert its contract
253
+ cache[fid] = {}
254
+ return cache[fid]
255
+
256
+ problems = lint_flow_dto(flow, tmpl_sp, target_vars_of)
257
+ return {"id": args.id, "title": flow.get("title"), "clean": not problems,
258
+ "problem_count": len(problems), "problems": problems}
259
+
260
+
261
+ ACTIONS = {
262
+ "flow-lint": ActionDef(
263
+ func=flow_lint, add_args=_args, needs_client=True,
264
+ description="Designer-layer 'Process Errors' lint on a live flow (the check that blocks "
265
+ "designer SAVE, which POST /Projects/validate does NOT catch): stale subprocess "
266
+ "side-pannel ids, unmapped/dead required subprocess inputs, subprocess outputs "
267
+ "mapped to non-output (non-type-30) vars, Execute Query with null Output, and Node "
268
+ "code binding error-scope/undeclared vars. clean=true when none."),
269
+ }