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,293 @@
1
+ # Database patterns for PROCESIO ↔ SQL Server (generalized)
2
+
3
+ These are reusable techniques taken from a production PROCESIO workspace backed by Azure SQL. They contain no client names, no business table names and no data values. Each entry follows the same shape: **Pattern / Problem / Mechanics / When / Pitfalls**. The first group (1–14) is worth copying. The last section (15) lists anti-patterns found in the same database, so they are not repeated.
4
+
5
+ ---
6
+
7
+ ## 1. Whole-form JSON orchestrator procedure
8
+
9
+ **Problem.** A multi-step web form produces one large nested object. Writing it from the flow as a dozen separate SQL nodes gives no atomicity, no shared validation and a flow that is hard to read.
10
+
11
+ **Mechanics.**
12
+ - The flow makes one call, `EXEC schema.usp_X_SaveFormObject @form_json = @form_json`, which passes the whole object serialized.
13
+ - The orchestrator validates, generates all keys, opens **one transaction**, and calls small sub-procedures, one per detail table. Each sub-procedure does `INSERT … SELECT … FROM OPENJSON(@form_json, '$.section') WITH (...)`.
14
+ - It commits and returns the resulting root row.
15
+
16
+ **When.** Any form or wizard submit that touches more than one table.
17
+
18
+ **Pitfalls.**
19
+ - Sub-procedures must **THROW** on data errors (`IF @@ROWCOUNT <> 1 THROW 500xx`). Only the orchestrator turns errors into result rows (see 3).
20
+ - Keep `SET XACT_ABORT ON` so an error inside a nested EXEC dooms the transaction.
21
+
22
+ ## 2. Pre-flight error collection before any write
23
+
24
+ **Problem.** Failing on the first error forces the user through fix-and-retry loops, and a partial write leaves junk rows behind.
25
+
26
+ **Mechanics.**
27
+ - `DECLARE @Errors TABLE (error_step, error_code, error_message, sql_error_number, sql_error_line, sql_error_procedure)`.
28
+ - Run every check as its own `IF … INSERT @Errors`. Checks include required fields, enum values, a JSON shape check on the selected branch (for example, "person type = company but the company id is empty"), and a duplicate or retry check.
29
+ - Then `IF EXISTS (SELECT 1 FROM @Errors) GOTO ErrorOutput`, before `BEGIN TRANSACTION`.
30
+ - Use stable UPPER_SNAKE error codes.
31
+ - A pure helper procedure that validates part of the input returns `@error_code` / `@error_message` as OUTPUT parameters instead of throwing, so the caller can add them to the same list.
32
+
33
+ **When.** Every writer called from a form.
34
+
35
+ **Pitfalls.**
36
+ - A `NULL NOT IN (...)` test evaluates to UNKNOWN and silently falls through to the else branch. Test `IS NULL OR … NOT IN (...)`.
37
+ - Validate the branch that was actually selected, not only the discriminator.
38
+
39
+ ## 3. One result contract for success and failure
40
+
41
+ **Problem.** PROCESIO's `Execute Query` returns a list of row objects. If success and failure return different shapes, or success returns nothing, every flow needs fragile branching.
42
+
43
+ **Mechanics.**
44
+ - Every procedure returns **the same columns** in every outcome: `e_ok BIT, error_step, error_code, error_message, sql_error_number, sql_error_line, sql_error_procedure`, followed by the data columns.
45
+ - On failure the data columns are `CAST(NULL AS <type>)`. On success the `error_*` columns are NULL.
46
+ - Writers return one row on success and one row per error on failure. Readers return exactly one row.
47
+ - In the flow: `Get Element [0]` → Decisional on `e_ok`. For multi-row error output, use a JS check such as `list.every(r => r.e_ok === true)`.
48
+
49
+ **When.** Every procedure a flow calls.
50
+
51
+ **Pitfalls.**
52
+ - Use one result family per database. Mixing `e_ok` with `result='isOK'` and with "JSON in a single column" forces a different parser for each procedure.
53
+ - The CATCH branch must produce the same columns as the success branch.
54
+
55
+ ## 4. Guarded state-machine updates
56
+
57
+ **Problem.** A root record moves through statuses. A step can run twice, run out of order, or run against a record that is already further along.
58
+
59
+ **Mechanics.**
60
+ - Inside the transaction, each step does `UPDATE root SET <pointer> = @key, status = '<next>' WHERE id = @id AND status = '<prev>'; SET @rc = @@ROWCOUNT; IF @rc <> 1 THROW 5001x, 'State machine: …', 1;`.
61
+ - Flows that advance the status later use the same guard: `WHERE id = … AND status = '<expected>'`.
62
+
63
+ **When.** Any lifecycle column: requests, approvals, integration steps.
64
+
65
+ **Pitfalls.**
66
+ - Unguarded `UPDATE … SET status = 'x' WHERE key = …` in flows breaks the machine. A replay or an out-of-order run silently regresses the state.
67
+ - Document the state list in the procedure header and keep it in sync with the code. Doc drift here is common.
68
+
69
+ ## 5. Echo OUTPUT parameters as result columns
70
+
71
+ **Problem.** A PROCESIO SQL node reads only the result set, so OUTPUT parameters are invisible to the flow.
72
+
73
+ **Mechanics.**
74
+ - Sub-procedures use OUTPUT parameters to talk to the orchestrator (`@rows_inserted`, `@items_json`).
75
+ - The orchestrator exposes them in its final SELECT: `@nr_rows AS rows_inserted, @items_json AS items_json`.
76
+ - A child list that the next steps need (for example, one row per recipient with its own token) is returned as a **JSON array string column**. The flow parses it with `JSON.parse` in a JS node.
77
+
78
+ **When.** Whenever the flow needs counts or generated ids.
79
+
80
+ **Pitfalls.**
81
+ - Build the echoed JSON from the same in-memory rows that were inserted (an IDENTITY-ordered table variable), not by re-reading the base table. That guarantees the order and the exact truncated values.
82
+
83
+ ## 6. Always-one-row reader with a fixed JSON skeleton
84
+
85
+ **Problem.** Consumers such as document generators, code nodes and templates break when keys disappear, when lists are null, or when the query returns zero rows.
86
+
87
+ **Mechanics.**
88
+ - Start from a driver row, `FROM (SELECT @id AS req_id) q LEFT JOIN root … LEFT JOIN detail …`, and emit `FOR JSON PATH, WITHOUT_ARRAY_WRAPPER, INCLUDE_NULL_VALUES` using dotted aliases (`[section.sub.field]`) that mirror the form object 1:1.
89
+ - Default every list to `JSON_QUERY(ISNULL((SELECT … FOR JSON PATH), '[]'))`.
90
+ - Add `TOP (1)` as a guard: a duplicated key would multiply the joined row, and FOR JSON would then glue two objects together into invalid JSON.
91
+ - Return `e_ok, error_code, …, payload_json` as one row.
92
+ - Include `_proc_version` and a `warnings[]` array for anomalies that are not errors, such as orphan pointers or inferred values.
93
+ - A JSON column stored as a string is re-emitted as a real array with `JSON_QUERY(CASE WHEN ISJSON(col)=1 THEN col ELSE '[]' END)`.
94
+
95
+ **When.** "Get the whole request" readers that feed templates or later steps, especially when the output must be interchangeable with the original form object.
96
+
97
+ **Pitfalls.**
98
+ - With FOR JSON PATH, columns that share a prefix **must be adjacent**. Otherwise the object is emitted twice.
99
+ - `JSON_QUERY` over malformed text raises an error. Wrapping it in `CASE` turns the output into an escaped string. Filter with `ISJSON` upstream, into a variable or table variable, and call `JSON_QUERY` directly in the SELECT.
100
+ - Heavy blobs (HTML, base64) should be **opt-in** through `@include_x BIT = 0` flags, with `has_x` / `length_x` columns so the flow can branch without loading them.
101
+
102
+ ## 7. Root row with pointers to its detail rows
103
+
104
+ **Problem.** A request is made of several sections, some 1:1 and some 1:N, filled at different times.
105
+
106
+ **Mechanics.**
107
+ - The root row holds one GUID pointer column per section. The detail tables use `id = <that GUID>`.
108
+ - In 1:N sections every child row carries the same GUID, which acts as a group key.
109
+ - Readers follow root → pointer → detail. An orphan check is simply `pointer IS NOT NULL AND NOT EXISTS (detail WHERE id = pointer)`.
110
+
111
+ **When.** Form-shaped data whose sections are optional or depend on a discriminator (for example, person type or product type).
112
+
113
+ **Pitfalls.**
114
+ - Children have no back-reference and no row identity, so add both: a request id or FK, and a per-row `nr` order column. Without an order column, "the order SQL Server returns" is not guaranteed, and rebuilt lists can reorder between reads.
115
+ - Index the group-key and pointer columns, and put a unique constraint on any per-row token.
116
+
117
+ ## 8. Zipping parallel JSON lists into rows
118
+
119
+ **Problem.** The form sends several parallel arrays for the same N items (address[], identification[], technical[], quantities[]), linked by an `id` in each element. Older payload versions send a single object instead of an array.
120
+
121
+ **Mechanics.**
122
+ 1. **Normalize** each sub-node into an array: `CASE WHEN j IS NULL THEN '[]' WHEN LEFT(LTRIM(j),1)='{' THEN '['+j+']' ELSE j END`, stored in a `@lists (name PK, arr)` table variable.
123
+ 2. **Guard against duplicates**: `GROUP BY list, ISNULL(TRY_CONVERT(INT, JSON_VALUE(value,'$.id')), [key]+1) HAVING COUNT(*)>1 → THROW`.
124
+ 3. `elem` CTE: every element of every list, with `item_key = id, or position+1`.
125
+ 4. `keys` CTE: `SELECT DISTINCT item_key`. This is the **union** of keys, so no list is the "driver".
126
+ 5. One CTE per list that shreds its element with `OPENJSON … WITH`.
127
+ 6. `FROM keys LEFT JOIN each CTE ON item_key` → INSERT one row per item.
128
+
129
+ **When.** Repeating groups in low-code forms, and any backward-compatible payload evolution from object to array.
130
+
131
+ **Pitfalls.**
132
+ - A duplicate id would multiply rows through the joins. That is why the guard in step 2 runs first.
133
+ - Map empty strings to NULL (`NULLIF(x,'')`) on date and numeric fields.
134
+
135
+ ## 9. Reading large JSON safely
136
+
137
+ **Problem.** `JSON_VALUE` returns NULL (in lax mode) for values longer than 4000 characters, which silently loses big embedded strings. Low-code nodes also sometimes pass the wrapper object `{"field": "<json string>"}` instead of the inner string.
138
+
139
+ **Mechanics.**
140
+ - For long values use `SELECT @v = [value] FROM OPENJSON(@doc) WHERE [key] = 'field'`.
141
+ - To **auto-unwrap**, check whether a key expected at the top level is missing and a single known wrapper key is present. If so, replace `@doc` with that key's value and re-validate it with `ISJSON`.
142
+
143
+ **When.** Any procedure that receives a serialized object from a code node.
144
+
145
+ **Pitfalls.**
146
+ - Declare the target variables `NVARCHAR(MAX)` so that an oversized value **raises a truncation error** on insert, rather than being cut silently on assignment.
147
+
148
+ ## 10. Canonical JSON strings for nested selections
149
+
150
+ **Problem.** A nested, loosely shaped list (selected items, co-signers) has to be stored in one column and read back reliably.
151
+
152
+ **Mechanics.**
153
+ - Normalize before storing: `SELECT ISNULL(TRY_CONVERT(INT, JSON_VALUE(v,'$.id')), [key]+1) AS id, JSON_VALUE(v,'$.a') AS a, … FROM OPENJSON(@src) ORDER BY CONVERT(INT,[key]) FOR JSON PATH, INCLUDE_NULL_VALUES`. This fixes the keys and their order, drops foreign keys and fills missing ids.
154
+ - `ISNULL(…, '[]')`, because FOR JSON over zero rows returns NULL.
155
+ - Wrap the list together with its metadata in one object (`FOR JSON PATH, WITHOUT_ARRAY_WRAPPER`). Use the union of columns across variants so the stored shape is the same whichever variant was chosen.
156
+ - Read it back with `CROSS APPLY OPENJSON(col, '$.items') WITH (...)`.
157
+
158
+ **When.** Small, bounded child lists where a separate table is not justified.
159
+
160
+ **Pitfalls.**
161
+ - Check `LEN()` against the column width and fail with a clear message that says which column to widen, rather than failing with a generic truncation error.
162
+
163
+ ## 11. Singleton configuration table fed by a webhook
164
+
165
+ **Problem.** An external system pushes a full configuration document (tariffs, rates) that replaces the previous one.
166
+
167
+ **Mechanics.**
168
+ - Validate with `ISJSON`.
169
+ - Read scalars with `JSON_VALUE` and arrays/objects with `JSON_QUERY`, storing the latter raw.
170
+ - For a key that may be either null or an object, use `COALESCE(JSON_QUERY(...), JSON_VALUE(...))`.
171
+ - Upsert: `IF EXISTS (SELECT 1 FROM cfg) UPDATE cfg SET … ELSE INSERT`.
172
+ - Wrap it in a transaction and TRY/CATCH, and return one row of status.
173
+
174
+ **When.** Reference data that is replaced as a whole.
175
+
176
+ **Pitfalls.**
177
+ - Keep the history: add `valid_from` and keep old rows instead of overwriting them in place. Contracts generated earlier may need the tariffs that were valid at the time.
178
+ - Protect the endpoint. The API key must not sit in a readable table (see 15).
179
+
180
+ ## 12. Compile safety for optional schema elements
181
+
182
+ **Problem.** A procedure must deploy on databases where an optional column has not been added yet, while static SQL fails at CREATE with "Invalid column name".
183
+
184
+ **Mechanics.**
185
+ - Detect the column with `COL_LENGTH('schema.table','col') IS NOT NULL`, then touch it only through `sp_executesql` with typed parameters.
186
+ - Truncate to the real width with `LEFT(x, ISNULL(NULLIF(COL_LENGTH(...), -1)/2, 4000))`, so a long value cannot abort the whole transaction.
187
+ - Ship a read-only `00_verificare_*.sql` pre-check that lists missing columns before any deploy.
188
+
189
+ **When.** Rolling schema changes across several environments.
190
+
191
+ **Pitfalls.**
192
+ - `COL_LENGTH` returns **bytes** (halve it for nvarchar) and `-1` for MAX.
193
+ - An "optional" safety feature that is never switched on is a silent gap. Verify that it is actually live (for example, retry dedup that depends on an optional column).
194
+
195
+ ## 13. Per-recipient tokens with consumed-link semantics
196
+
197
+ **Problem.** Several recipients each receive a personal link. Each must act once, and the flow must know who has already acted.
198
+
199
+ **Mechanics.**
200
+ - Group id on every row, plus a **per-row token** generated with `DEFAULT LOWER(CONVERT(NVARCHAR(36), NEWID()))` in the table variable before the insert.
201
+ - The token lookup uses INNER JOINs and returns a row **only if** the chain is complete **and** the recipient has not yet acted. "Not found", "not ready" and "already used" look identical (`[]`), on purpose.
202
+ - Define one **shared "done" predicate** in every reader and code node: `status IN (<done values>) OR <artifact column> is filled`. The second clause covers an artifact that was saved while the status update failed.
203
+ - Offer both per-row lists (one row per recipient, email first, so the result can drive a For Each) and aggregated DISTINCT recipients (`STUFF((SELECT DISTINCT ';'+x … FOR XML PATH(''),TYPE).value('.','NVARCHAR(MAX)'),1,1,'')`, or `STRING_AGG`).
204
+
205
+ **When.** Multi-party signing, approvals, surveys.
206
+
207
+ **Pitfalls.**
208
+ - Put a **UNIQUE** constraint on the token.
209
+ - The **write** must be guarded too: `WHERE token = @t AND <not done>`. A read-side check alone still lets a replayed link overwrite the stored artifact.
210
+ - Aggregate a group status from children after cleaning dirty values: `LOWER(LTRIM(RTRIM(REPLACE(… CHAR(13)/CHAR(10)/CHAR(9)/NCHAR(160) …))))`.
211
+
212
+ ## 14. Deterministic fuzzy matching against a reference register
213
+
214
+ **Problem.** Free-text input (place names, entity names) must be resolved to official codes despite diacritics, abbreviations, old spellings and typos, without ever silently choosing a wrong neighbor.
215
+
216
+ **Mechanics.**
217
+ 1. **Symmetric normalization.** Apply the same key function to the user input and to the register column: strip diacritics (including the decomposed NFD combining marks that macOS sends), turn punctuation into spaces, collapse spaces, UPPER, strip administrative prefixes, and expand abbreviations on word boundaries.
218
+ 2. Write the key functions as **scalar UDFs with `WITH SCHEMABINDING, INLINE = OFF`**. An inline TVF with around a hundred nested REPLACEs is re-expanded at every reference and hits **Msg 8632** (the expression-services limit). Without `INLINE = OFF`, scalar UDF inlining (SQL Server 2019+) reintroduces the same expansion.
219
+ 3. Keep the source **ASCII-only** by writing special characters as `NCHAR(0x….)` literals. One wrong encoding round-trip would otherwise break every replacement silently. Keep each SET to about 6 REPLACEs.
220
+ 4. Match as a cascade: exact → edit distance d=1..k → prefix → reverse prefix → contains. Give each step a score and a confidence threshold, **scale the allowed distance with the name length** (short names get exact matches only), and **break ties deterministically** (smaller distance, higher administrative level, closer length, lowest code).
221
+ 5. For Levenshtein in T-SQL, use two rows kept in an NVARCHAR (store d as `NCHAR(d+1)`, because `NCHAR(0)` is NULL), exit early when the whole row exceeds `@max`, and **pre-filter** on `ABS(len_a − len_b) ≤ @max`. That filter is a mathematical lower bound, so it never loses a real match.
222
+ 6. Below the threshold, return a clear error plus the top-N candidates and "same name in another region" suggestions, never a guess.
223
+
224
+ **When.** Address normalization, entity matching against any official list.
225
+
226
+ **Pitfalls.**
227
+ - Real neighbors exist at distance 1 or 2, so tolerating typos on short names rounds silently to the wrong record.
228
+ - Precompute the register keys as **persisted computed columns** with an index. The functions are deterministic and schema-bound, which makes that possible, and it avoids running two UDFs over the whole register on every call.
229
+
230
+ ---
231
+
232
+ ## PROCESIO ↔ SQL techniques
233
+
234
+ ### P1. Bind parameters. Never interpolate values into SQL text.
235
+
236
+ **Problem.** Interpolating `N'<%N%>'` into the SQL text lets any value containing `'` break the statement, and a crafted value injects SQL. Numeric placeholders written without quotes are worse.
237
+
238
+ **Mechanics.**
239
+ - Use the current `Execute Query` template with named `@params` in the SQL and the **Parameters config tab** mapping each `@param` to a flow variable, for example `EXEC schema.usp_X @id = @id`.
240
+ - The repo tooling does the conversion: `procesio sql-scan` then `procesio sql-parameterize --dry-run`.
241
+ - **Runtime-verify** afterwards. Structural validation does not catch an unbound `@param`.
242
+
243
+ **Stopgap, when binding is impossible.** A code node that does `JSON.stringify(obj).replace(/'/g, "''")`, while keeping the `N` prefix.
244
+
245
+ **Pitfalls.**
246
+ - Escaping HTML (`&#39;`) is **not** SQL escaping.
247
+ - A flow that passes a JSON object straight into `N'…'` is exposed.
248
+
249
+ ### P2. Least privilege for the flow credential
250
+
251
+ The PROCESIO login should have EXECUTE on the procedures plus the minimum DML it needs, not `db_owner`. With injection-prone nodes, `db_owner` means an injection controls the whole database.
252
+
253
+ ### P3. Consuming results in a flow
254
+
255
+ - The output is always a list.
256
+ - `Get Element [0]` → `Extract Objects` or a JS node → Decisional on `e_ok`.
257
+ - Parse JSON-string columns with `JSON.parse`.
258
+ - Procedures that return a single `result` JSON column need one more extract-and-convert step. Prefer the row contract from pattern 3.
259
+
260
+ ### P4. Atomicity lives in the database
261
+
262
+ PROCESIO has no transaction that spans nodes. Any multi-statement write (for example, insert a child and then set the root's pointer to it, or delete-and-reinsert a detail set) belongs in **one procedure** with a transaction, or at least in one node with an explicit `BEGIN TRAN … COMMIT` and a way to report errors.
263
+
264
+ ### P5. Procedure file conventions that keep deploys repeatable
265
+
266
+ - One procedure per file, no `GO` (the whole file is one batch), `CREATE OR ALTER`, numbered deploy order.
267
+ - A read-only pre-check script for the columns the procedure uses.
268
+ - A header that states the exact PROCESIO call, what each id parameter is **and is not**, the lookup chain, the output contract and the error codes.
269
+ - A trailing "quick test" block with positive, negative and control queries, with writes wrapped in `BEGIN TRAN … ROLLBACK`.
270
+ - A `_proc_version` string inside the returned JSON.
271
+
272
+ ### P6. A run-log table for multi-step external integrations
273
+
274
+ - One row per run: `id` = the flow instance id, `business_key`, `status`, `step` as `'[n/N]'`, and one `*_meta` column per step holding either the created record id or the error text.
275
+ - Every step updates its own column plus `status` and `step`.
276
+ - Guard the transitions (pattern 4). Store the error text in its own column, not in the success column.
277
+
278
+ ---
279
+
280
+ ## 15. Anti-patterns seen in production (do not copy)
281
+
282
+ | Anti-pattern | Why it hurts | Do instead |
283
+ |---|---|---|
284
+ | Every column `nvarchar`: numbers, dates and flags as text | String date comparisons break once formats mix. Flags drift between `'1'`, `'true'` and `'da'`. `CAST` fails at read time. | Real types in new tables. Convert at the boundary. |
285
+ | Heaps with no PK, FK, unique constraint or index | Duplicate tokens and keys go unnoticed. Readers need `TOP (1)` guards. Every lookup is a scan. | A PK on `id`, a UNIQUE on tokens, indexes on pointer and group columns. |
286
+ | Renaming the primary key to a business number after creation | References that still hold the old id stop resolving, and a reused number violates the PK. | A separate business-number column. |
287
+ | Secrets (API keys, backend username and password, OAuth tokens) in plain tables | One injection or one over-broad SELECT leaks them. | The platform credential store or a key vault. Restrict the schema at the least. |
288
+ | Personal data (national id numbers, ID documents, IBAN, signature images) in clear text, with `SELECT *` exposed to a flow | Leaks, and no minimization or retention | Dynamic Data Masking or column encryption, column lists instead of `SELECT *`, a retention job. |
289
+ | An open-state filter on a column no flow ever writes | Lists grow forever | Every state predicate needs a writer. Test the transition that closes the state. |
290
+ | A valid procedure left unused while the flow does the same write inline | Validation and error reporting are bypassed | Call the procedure, or delete it. |
291
+ | Trailing commas and similar syntax errors in rarely used branches | The branch always fails, which shows up as an empty table | Run every SQL node at least once. Lint inline SQL. |
292
+ | A "delete everything" admin flow with no environment guard | Loses all data on one click | A `DB_NAME()` / environment check, soft delete, restricted runners. |
293
+ | Selecting columns that do not exist in disabled nodes | Re-enabling the node breaks the flow | Remove dead nodes, or fix them with the schema. |
@@ -0,0 +1,113 @@
1
+ # PROCESIO API reliability doctrine
2
+
3
+ How to drive the PROCESIO Web API **safely and predictably** when building or
4
+ operating processes and forms. These are platform truths, not project quirks —
5
+ they hold for any workspace. Each was learned by hitting it live; the `procesio`
6
+ tool now ENFORCES most of them so you cannot silently violate them (see the
7
+ guardrails table at the end), but the operating rules still shape how you sequence
8
+ your calls and how you decide a change actually landed.
9
+
10
+ Load this any time you are about to script a sequence of PROCESIO calls:
11
+ `python scripts/run-agent.py procesio guidance --topic reliability`.
12
+
13
+ ---
14
+
15
+ ## 1. Drive PROCESIO sequentially, not concurrently
16
+
17
+ Do NOT run PROCESIO calls in parallel against one workspace. Mixing synchronous
18
+ `run-process` executions with heavy definition reads/writes
19
+ (`GET /api/Projects/{id}` ~120 KB, `GET /api/FormTemplate/{id}` ~420 KB) can stall
20
+ the definition calls for **minutes**; the same calls issued strictly one-at-a-time
21
+ return normally. Fast endpoints (`POST /api/Projects/{id}/run`, `GET /api/Schedules`,
22
+ `GET /api/Projects` list, `form-set-code`) stay responsive throughout.
23
+
24
+ The leading explanation (a **hypothesis**, not confirmed): a process is many
25
+ actions each with its own timeout, workspace execution capacity is finite, and
26
+ under load both executions and definition reads/writes **queue** behind it — i.e.
27
+ the "hangs" are legitimate long/queued work, not a broken API. Whether or not that
28
+ is the mechanism, the operating rule is the same: **one PROCESIO call in flight at
29
+ a time.** Build loops sequentially; do not fan out.
30
+
31
+ ## 2. Behavioural verification over re-read — writes can lie
32
+
33
+ A success-shaped response is NOT proof the change persisted. A definition PUT has
34
+ been seen to return `200` with an empty/`{"raw_text":""}` body while the change did
35
+ **not** land server-side. The only trustworthy check is **behavioural**: run the
36
+ process (or open/submit the form) and observe the effect — or re-read the
37
+ definition and diff it. Never conclude "it worked" from the write's own echo.
38
+ `put-projects` now warns you when the body comes back empty.
39
+
40
+ ## 3. The client surfaces a stall instead of hanging
41
+
42
+ The client's HTTP timeout is a *per-read inactivity* guard, not a total deadline:
43
+ a connection that is accepted and then dribbles (or is held open) never trips it,
44
+ so a stalled call used to run until the process was killed. The client now imposes
45
+ a **total wall-clock deadline** per call, by class — definition/list/schedule
46
+ **reads ~90 s**, definition **writes (PUT) ~180 s** — and on expiry raises a
47
+ structured `deadline_exceeded` error (`outcome:"unknown"`, exit non-zero) instead
48
+ of hanging. `run-process` is **exempt** (see §4). Opt out with
49
+ `AAT_PROCESIO_NO_DEADLINE=1` if you are deliberately waiting on something slow.
50
+
51
+ ## 4. Client-side abort ≠ server-side stop
52
+
53
+ Aborting a slow synchronous run on the client does **not** stop the run on the
54
+ server — it keeps executing and writing its side effects (Sheet rows, emails,
55
+ social posts, DB writes). So `run-process --synchronous` is exempt from the total
56
+ deadline: a many-action process legitimately runs for minutes, and killing it
57
+ client-side is itself a hazard. If you must bound it, pass `--timeout`
58
+ (`secondsTimeOut`) so the SERVER stops it, or use the async
59
+ publish → launch → poll path and stop the instance in the UI. Never assume a
60
+ client-side timeout undid anything.
61
+
62
+ ## 5. The workspace is never idle
63
+
64
+ Server-side **schedules** fire processes around the clock (a dispatcher tick every
65
+ few minutes is common). Any reasoning that "nothing else is running right now" is
66
+ wrong, and the client cannot see scheduled executions. When latency looks off,
67
+ list the schedules (`list-schedules`) and check their next-run times before
68
+ blaming your own call.
69
+
70
+ ## 6. Retry reads, never writes
71
+
72
+ The client retries **GET only**, on transient statuses (`429/502/503/504`) and
73
+ network errors, with jittered backoff inside the deadline. `POST/PUT/PATCH/DELETE`
74
+ are **never** retried: re-POSTing an execution double-runs a process with real
75
+ side effects, and a timed-out write may already have applied. If a write fails or
76
+ times out, treat the outcome as **unknown** and verify behaviourally (§2) before
77
+ resending. Opt out of retries with `AAT_PROCESIO_NO_RETRY=1`.
78
+
79
+ ## 7. Form-build traps (accepted silently by the server)
80
+
81
+ These cost a debugging session each because the server accepts them without
82
+ complaint. `form-update` now emits non-blocking **lint warnings** for the first
83
+ three; full detail in `tools/procesio/FORM-DEV-GUIDE/08-PITFALLS.md`.
84
+
85
+ - **Phantom `parentId`** — an element whose `parentId` matches no element id
86
+ renders on NO pane. Tab/container membership is by `parentId` = a container
87
+ element's id; a dangling reference is invisible, not an error.
88
+ - **`form-update` deep-merge** — arrays REPLACE wholesale (pass the whole new
89
+ array to change one item); `None` sets the key to `null` (it does not delete);
90
+ and a patch wrapped as `{"Data": {...}}` becomes an inert junk key that changes
91
+ nothing. Pass the INNER fields directly.
92
+ - **Duplicate `id`/`name` configs** across elements collide for CSS/JS selectors
93
+ and process mapping — keep them unique.
94
+ - **Event editing is replace-then-append.** An element commonly carries
95
+ `[RUN_PROCESS, RUN_JAVASCRIPT]` on one click trigger. A blanket "replace" wipes
96
+ BOTH. Replace only the one action you mean (`form-set-element-event
97
+ --replace-action RUN_PROCESS`) and the sibling survives in order; bare
98
+ `--replace` now warns before discarding more than one.
99
+
100
+ ---
101
+
102
+ ## What the tool enforces for you
103
+
104
+ | Rule | Enforcement in the `procesio` tool |
105
+ |---|---|
106
+ | §2 writes can lie | `put-projects` reports HTTP status/elapsed and WARNS on an empty body |
107
+ | §3 no total deadline | class-aware wall-clock deadline → `deadline_exceeded` (`AAT_PROCESIO_NO_DEADLINE=1` to opt out) |
108
+ | §4 abort ≠ stop | `run-process` exempt from the deadline; keeps its own `--timeout` |
109
+ | §6 retry reads only | GET-only retry with backoff; POST/PUT never retried (`AAT_PROCESIO_NO_RETRY=1` to opt out) |
110
+ | §7 form traps | `form-update` DTO lints; `form-set-element-event --replace-action` |
111
+
112
+ The rules the tool does NOT enforce — sequential sequencing (§1), behavioural
113
+ verification (§2), and reading schedules (§5) — are on you. Follow them.