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,199 @@
1
+ # PROCESIO `For Each` — construction quirks and the loop-timeout trap
2
+
3
+ The `For Each` action is template id **`dbef0804-66a9-4f8f-872c-ece1b89b8fdb`**.
4
+ Body membership is by **`ParentId`** (a child action's `parentId` == the loop's
5
+ id), never by an enclosing edge, and only `TemplateId` identifies the action —
6
+ `ActionTemplateName` is `null` on ~half of the corpus's For Each nodes and
7
+ `ActionName` is free text.
8
+
9
+ ## ⚠⚠ A programmatically-built For Each is missing two parameters a designer-built one has
10
+
11
+ > ✅ **FIXED IN THE BUILDER (E-160, 28/08/2026).** `dto/process/builder.py` now
12
+ > materialises the two template-default output params at build time, so a `For Each`
13
+ > built through `process-create` / the compact config **iterates out of the box** — no
14
+ > post-create splice. See `_template_default_params` and the "the fix" section below.
15
+ > The description that follows is the diagnosis that led there; the workaround at the
16
+ > bottom is retained only as history and is **no longer needed**.
17
+
18
+ Read from live flows, the same `For Each` template carries a **different
19
+ parameter set** depending on how it was created:
20
+
21
+ | built how | `tabPropertyId` suffixes present | Action timeout |
22
+ |---|---|---|
23
+ | **designer (GUI)** | `…55f8c7` (For Each Item), `…adae8b` (In List), `…df9db1` (Action timeout), **`…61724e` = `"-1"`**, **`…808b0d` = `"2010-01-01T00:00:00.0000000Z"`** | commonly 600 |
24
+ | **programmatic** (compact config → `process-create`, or hand-built flow JSON) | `…55f8c7`, `…adae8b`, `…df9db1` only | whatever you set |
25
+
26
+ The programmatic build path **omits `…61724e` and `…808b0d`**, and they are **not
27
+ defaulted in on save/validate** — the flow validates and creates cleanly with
28
+ three parameters.
29
+
30
+ ## ⚠⚠ The failure mode: the loop times out without iterating a populated list
31
+
32
+ A For Each carrying only the three parameters has been observed to **fail to
33
+ iterate a list that is demonstrably populated and correctly bound**, returning:
34
+
35
+ ```
36
+ status 40
37
+ {"errorMessage": "Foreach timeout exceeded!", "actionName": "...", "actionType": "For Each"}
38
+ ```
39
+
40
+ after the loop's `Action timeout` seconds, **writing nothing** — no body child
41
+ executes even once. This was isolated hard:
42
+
43
+ - The `In List` parameter **is** bound (its `variable[0].variableId` points at the
44
+ list variable) — verified by reading the created flow back; it is not a
45
+ null/unbound-list problem.
46
+ - The list variable **is** populated at runtime — the same run that times out
47
+ returns the list (e.g. 3 elements) in its output variables.
48
+ - A **no-loop** flow proves the pieces are healthy: the list-producer Node yields
49
+ the elements, a Node reads them, and a Data Store `InsertRows` writes a row —
50
+ all at **status 50**. Only inside the For Each does it hang.
51
+ - Reproduced in a **minimal** For Each (one Node → the loop → one Data Store
52
+ `InsertRows` body child), independent of the body's contents and of whether the
53
+ body's `InsertRows` binds the loop item directly or a pick-Node-derived scalar.
54
+
55
+ ## ⚠⚠ CONFIRMED (causal test done): the two parameters ARE the cause, and the timeout is NOT
56
+
57
+ The leaf-diff causal test is now performed. Splice **EXACTLY** `…61724e` = `"-1"`
58
+ and `…808b0d` = `"2010-01-01T00:00:00Z"` onto a live 3-parameter loop via
59
+ `put-projects`, **change nothing else**, re-run, and judge on rows landed:
60
+
61
+ | the same loop, only these two parameters differ | body executions | status |
62
+ |---|---|---|
63
+ | 3-parameter (as `process-create` builds it), populated list | **0** | 40 `Foreach timeout exceeded!` |
64
+ | **+ `…61724e` + `…808b0d`** (Action timeout left **unchanged**) | **3** (full) | 50 |
65
+
66
+ Measured twice, independently: **0 → 3 on a minimal loop**, and **entry 3 / body 3 /
67
+ real inserts 3 of 3** on a two-loop diff flow.
68
+
69
+ - ⚠⚠ **The Action timeout does NOT matter.** The designer loop's `…df9db1` is 600
70
+ and the programmatic one's is 120; the splice **held it at 120** and the body ran.
71
+ The two output parameters alone are sufficient — do **not** raise the timeout as
72
+ part of the "fix" (that would be two changes at once and mis-attribute the cause).
73
+ - ⚠⚠ **Both are OUTPUT parameters** (`direction 2`, type `ignore`): `…61724e`
74
+ "Zero based list index" (the current-iteration counter) and `…808b0d` "Action
75
+ start time". A loop with no index slot has nowhere to advance the iteration index,
76
+ consistent with never entering the body — mechanism plausible, the *measurement*
77
+ is that adding exactly these two flips 0 → N.
78
+ - ⚠⚠ **The omission is in OUR builder, not the platform (E-158 refinement — A-42
79
+ WITHDRAWN as a platform defect).** The two output parameters are the `For Each`
80
+ template's **own default-valued settings**: the live action catalog shows template
81
+ `dbef0804` declaring `61724e` "Zero based list index" with default `value` `"-1"`
82
+ and `808b0d` "Action start time" with default the `2010-…Z` sentinel — both
83
+ `direction 2`, `type ignore`, **`isRequired false`**. The DESIGNER materialises every
84
+ template setting into the flow; the compact-config builder
85
+ (`dto/process/builder.py::_action_parameters`) is **binding-driven** — it emits one
86
+ parameter per config *binding* and never walks the template's settings — so a param no
87
+ one binds (a runtime-written output with a default) is never emitted. Neither API path
88
+ defaults it in on save. **So the fix belongs in the builder: materialise the template's
89
+ default-valued output settings** (at minimum emit these two for `For Each`; generally,
90
+ any `direction:2/type:ignore` setting carrying a template `value`). Because the
91
+ validator keys on `isRequired`, a 3-param loop validates + creates clean and only fails
92
+ at runtime with the generic timeout — a genuinely platform-side rough edge, but a minor
93
+ quality/parity note, not the "build path is broken" claim.
94
+ - ✅ **DONE (E-160). The builder now materialises them.** `dto/process/builder.py`
95
+ gained `_is_template_default_output` (predicate: `direction:2` or `type:ignore` with a
96
+ non-empty scalar `value`) and `_template_default_params` (walks the template, emits
97
+ `{TabPropertyId, Value:<default>, Variable:[]}` for each such setting not already
98
+ produced by a binding, deduped by `TabPropertyId`), called in `build()` after the
99
+ binding-driven / doc-mapper / decisional / subprocess params. It is **template-driven,
100
+ not a For-Each special-case**: `For Each` gains `61724e`/`808b0d`, and `Call
101
+ Subprocess`'s `a03fe2` started-flow slot (the only other member of the class in the live
102
+ 233-action catalog) is subsumed — already emitted by `_build_subprocess`, so the dedupe
103
+ makes it a no-op there. Proven a TRANSFORM (a process with no such setting builds
104
+ byte-identical; `For Each` differs by exactly the two params appended) and proven LIVE
105
+ (a loop built by `process-create` iterates 3, no splice; both loops of a two-loop flow
106
+ iterate → status 50, where the E-150 single-loop splice left status 40). ⚠ A separate,
107
+ larger class is NOT fixed: 40 actions carry INPUT-side (`direction:1`) template defaults
108
+ the builder also drops when unbound — untested whether it matters; see
109
+ `todo/procesio-builder-input-default-materialisation.md`.
110
+ - ⚠ **`put-projects` cannot create — it is PUT/edit only.** A create DTO (fresh
111
+ client-supplied Id) PUT to `put-projects` returns HTTP 400 / statusCode 502 "missing or
112
+ incorrect resource parameters" and persists nothing; creation is **POST /api/Projects**
113
+ (what `process-create` wraps). As a save path `put-projects` stores the parameter set
114
+ literally — it does NOT materialise template defaults either. So there is no alternative
115
+ API build path that carries the two params for you; a loop built + saved via
116
+ `put-projects` iterates iff they are present (measured 0→3 on the same object).
117
+ - ✅ **Workaround (HISTORY — no longer needed since E-160):** before the builder fix,
118
+ the way to iterate was, after `process-create`, to read the flow back, append the two
119
+ parameter objects to the loop action's `parameters`, and `put-projects` (verify by
120
+ reading the loop's `parameters` back — 5 present, originals unchanged — before running).
121
+ The builder now emits the two at create, so this post-create splice is retired. ⚠ One
122
+ fact from it that still applies to any read-back diff: **on save the platform
123
+ normalises `…808b0d` from `"…00.0000000Z"` to `"…00:00:00Z"`** — the same parameter;
124
+ tolerate the trailing-precision reformat when you diff a stored loop.
125
+
126
+ The parameter objects to append (authoritative `parameters`-array form):
127
+ `{"tabPropertyId":"99e8766d-d6be-4948-8f57-1f141f61724e","value":"-1","variable":[]}`
128
+ and `{"tabPropertyId":"9d2d3483-f04b-48ac-9dea-2ef7ae808b0d","value":"2010-01-01T00:00:00.0000000Z","variable":[]}`.
129
+
130
+ ## Diagnosing a For Each that "does nothing"
131
+
132
+ - **Prove the loop's INPUT is populated before you read its zero — a wrong-shaped
133
+ run payload reads identically to a dead loop.** If the flow's input variable is
134
+ supplied in the wrong shape (e.g. a bare list where the process declares
135
+ `{source, tenant}`), the input variable is left empty, any pre-loop JavaScript
136
+ node that substitutes it via `<%N%>` dies with **`"Unexpected token ';'"`** (an
137
+ empty token becomes `var x = ;`), the list the loop iterates comes back **null**,
138
+ and the loop iterates nothing — indistinguishable from the parameter-omission
139
+ hang unless you check the pre-loop nodes' error variables and the list length.
140
+ Gate on: the pre-loop nodes ran clean AND the In-List variable is the expected
141
+ length, THEN read the loop's body count.
142
+ - **A body node that never ran reports no error.** Clean per-node error variables
143
+ are NOT evidence the body executed. Get positive evidence out-of-band: a Data
144
+ Store `InsertRows` in the body writing to a disposable store, read from OUTSIDE
145
+ the flow — a timeout can suppress every *returned* output variable (observed:
146
+ `vars: {}` on a timed-out run), so never rely on a value returned into a flow
147
+ variable to prove the body ran. Prove that marker can write with a **no-loop**
148
+ run first, or its zero is uninterpretable.
149
+ - **Judge a loop on rows landed, not status.**
150
+ - **`For Each` takes ONE input port.** Two loops in sequence, or a body-exit and
151
+ the loop-continuation both reaching the same downstream node, need a `Join`
152
+ between them, or the back end refuses `statusCode 383 "Action has too many
153
+ input ports."` on save.
154
+ - A **list**-returning Node binds its result via the **`List Result`** parameter
155
+ (`…60237e88`); a scalar via **`Single Result`** (`…51b9fcdc`). Wrong one → the
156
+ list variable is never assigned and the loop iterates null (also a timeout).
157
+
158
+ ## Related Data Store facts used above
159
+
160
+ - A Data Store **must have a primary key** — `datastore-from-json` without
161
+ `primaryKeyAttributeNames` is refused `502 "At least one column must be marked
162
+ as a primary key."` So you cannot append identical rows as a pure log; a
163
+ per-row distinct key is required to count iterations by row.
164
+ - Inside a For Each, per-iteration **single** `InsertRows` calls write N distinct
165
+ rows correctly (this is the working idiom); the **collapse-to-one** failure is a
166
+ *batch* insert of a parallel-list mapper in a single call, a different path.
167
+
168
+ ## Landing N rows: the working shape, its body-port wiring, and the re-run NOOP
169
+
170
+ Confirmed end to end (a multi-row landing card, 2026-09-02): to write **N rows to a
171
+ store from one run**, loop a **model-typed list** and do **one `InsertRows` per
172
+ iteration** binding the loop ITEM's data-model attributes. Concretely:
173
+
174
+ - **The list and the item are both typed as the store's data model.** A Node emits the
175
+ list bound via **`List Result`** (not `Single Result`); the For Each's **`For Each
176
+ Item`** output is bound to a NON-list variable of the same model type; the body
177
+ `InsertRows` Set-Values mapper binds `item.<attr>` exactly as the single-row splice
178
+ does (b017 pattern), only the bound variable is the loop item, not a standalone one.
179
+ - **Body-port wiring (edges, not just `parent`).** The `parent` key on the body action
180
+ sets ParentId (visual containment) but gives it **no ports** — ports come from edges.
181
+ Read from a designer export, a For Each with one body child carries **two out-ports on
182
+ the loop** (loop → continuation, e.g. the Join; and loop → body child) **plus one
183
+ out-port on the body child back to the loop** (body → loop). So the compact-config
184
+ edges are: `[loop, <next>]`, `[loop, <body>]`, `[<body>, loop]`. Omit the last two and
185
+ the build validates but the body node fails with **statusCode 390/391 "Action has too
186
+ few input/output ports."** The platform infers body-vs-continuation from the child's
187
+ ParentId, so edge order does not matter; supply all three edges.
188
+ - **Idempotency comes free from the store PK — do NOT write dedupe logic.** Give each row
189
+ a **deterministic natural key** (stable per input, unique within the batch, e.g.
190
+ `<tool>:<table>:r<zero-padded-index>`). A fresh batch lands all N at **status 50**; a
191
+ re-run of the same input replays the same keys and the store PK rejects the duplicates,
192
+ so the instance **halts at status 40 with nothing written twice** — a clean NOOP, the
193
+ same dup-PK guard a single-row card shows (a re-run "must be a NOOP, not a double-load"
194
+ is satisfied by this alone). Validate the WHOLE input up front (count, shape, any
195
+ ceiling) and emit rows only on the clean branch, so a bad input never starts a partial
196
+ loop; then the only mid-loop halt is a dup key, which is the desired NOOP.
197
+ - **Cost scales with N.** One native `InsertRows` per row is billed per row: measured
198
+ `timeConsumed ≈ fixed + ~14 ms × N` (vs a single-insert card that bills flat). Size the
199
+ loop to the real table; a very large table is a v2 concern (bulk import), not this shape.
@@ -0,0 +1,101 @@
1
+ > ## ⚠ SUPERSEDED (re-probed 2026-09-03): `form-get` does NOT hang
2
+ >
3
+ > `GET /api/FormTemplate/{id}` returned a 342 KB DTO in seconds, repeatedly, and every
4
+ > read-modify-write action built on it (`form-get-element-events`, `form-set-element-event`,
5
+ > `form-add-element`, `form-set-element-config`) worked. Whatever caused the original hang is
6
+ > not reproducible on this installation.
7
+ >
8
+ > **Why this matters more than a stale row:** the note below steers the reader away from the
9
+ > surgical read-modify-write path and toward full rebuilds, which is the riskier route on a
10
+ > live form. Treat the table as history. Re-probe before believing any "this call hangs"
11
+ > claim — an intermittent or since-fixed hang reads identically to a permanent one.
12
+
13
+ # PROCESIO forms over the API — what works, and the one call that hangs
14
+
15
+ Live-probed while shipping a form for a marketplace template. The folklore is "form
16
+ creation hangs over the API". That is **wrong, and the imprecision costs a build**: creation
17
+ is fine. The call that hangs is the **read**.
18
+
19
+ | Call | Endpoint | Result |
20
+ |---|---|---|
21
+ | `form-create` | `POST /api/FormTemplate` | ✅ **works** — returns the new form id; the form renders with all its controls |
22
+ | `form-list` | `GET /api/FormTemplate/all/basic` | ✅ works (fast) |
23
+ | `get-customurl-formtemplate-by-id` | `GET /api/CustomUrl/FormTemplate/{id}` | ✅ returns (empty until a CustomUrl is minted) |
24
+ | **`form-get`** | **`GET /api/FormTemplate/{id}`** | ❌ **HANGS** — no response, no error; killed at 90s |
25
+
26
+ ## The consequence: nothing that must READ a form first can run
27
+
28
+ Every surgical/read-modify-write form action reads the form before writing, so they all
29
+ inherit the hang: `form-set-element-event` (wiring a control to `RUN_PROCESS`),
30
+ `form-set-element-config`, `form-get-element`, `form-get-element-events`, `form-set-code`,
31
+ `form-update`, `form-edit`. A wiring dry-run never even reaches its write.
32
+
33
+ **Practical rule:** everything a form needs must be expressed in the **single `form-create`
34
+ call**, because you may not get a second bite at it over the API. Build the complete element
35
+ tree, theme, and (where the builder supports it) events in that one create. If a form must
36
+ be adjusted afterwards, expect to do it in the designer UI.
37
+
38
+ **Do not** try to work around the hang by re-creating the form on every change: each
39
+ `form-create` mints a NEW form id (and any URL you minted points at the old one). Prefer one
40
+ correct create, then the UI.
41
+
42
+ ## Wiring a form's submit to a process, in the UI (the fallback recipe)
43
+
44
+ 1. Open the form in the designer, select the submit button, add an event on **click**:
45
+ **Run process** → pick the process.
46
+ 2. Turn **syncRun ON** ("wait for the process to finish"). With it off, the form fires and
47
+ forgets and no output can ever populate.
48
+ 3. Map **inputs**: each form field → the matching process input variable (file upload →
49
+ the `FileDataModel` input; a file control already holds a *list*, which is what a
50
+ file-typed process input expects).
51
+ 4. Map **outputs** the same way if results are shown back on the form. Design rule: one
52
+ output variable per field, all primitives — mapping one structured object
53
+ attribute-by-attribute is what produces `[object Object]` in every field.
54
+ 5. Publish, then mint the public URL (CustomUrl) if the form should be reachable
55
+ without a login.
56
+
57
+ ## Wire the process INSIDE the create — it works, and it is the only way here
58
+
59
+ Because `form-set-element-event` cannot run (it reads first), declare the trigger in the
60
+ `form-create` config itself. The builder resolves names on both sides, so the config stays
61
+ readable and no GUIDs are hand-written:
62
+
63
+ ```json
64
+ {"type":"button","name":"btn_run","label":"Run","submit":true,
65
+ "events":[{"on":"click","do":"process","processId":"<pid>","syncRun":true,
66
+ "inputs": [{"to":"<process input var>", "from":"<form field name>"}],
67
+ "outputs": [{"to":"<form field name>", "from":"<process output var>"}]}]}
68
+ ```
69
+
70
+ Verify the built DTO before trusting it: every map row's form side must be a 4-segment
71
+ value path (`formId.FIELDS_NS.elementId.valueConfigId`). A row still holding the raw field
72
+ **name** is silently broken - the API accepts it, the designer renders it blank, and the
73
+ field never populates.
74
+
75
+ ### Two builder defects this exposed (both fixed in `dto/form/builder.py`)
76
+
77
+ 1. **Field paths resolved in declaration order.** `ctx['field_paths']` is filled as
78
+ elements are built, so a trigger declared *above* its target fields could not resolve
79
+ them. That is the normal layout for any form that shows results (the submit button sits
80
+ above the results panel), so every output map silently kept raw names. Fixed with a
81
+ second pass (`_resolve_late_field_refs`) that re-resolves event map rows once every path
82
+ is known; declaration order no longer changes the wiring.
83
+ 2. **Controls whose value config is not called `value` never registered a path.** A
84
+ `file-viewer` holds its file in **`src`** (its own empty state reads "Field source not
85
+ set"), while `_VALUE_TYPE` already types it as File. So it received a data-model
86
+ attribute but no field path, and could not be targeted by an output map. Fixed with
87
+ `_VALUE_CONFIG_KEY` / `_value_key()`, used for both path registration and the
88
+ data-model attribute typing, so `src` is typed File rather than String.
89
+
90
+ **Design rule that still applies:** one output variable per field, all primitives. Add a
91
+ small splitter action per display field that returns a plain string, rather than mapping
92
+ one structured object attribute by attribute (which writes `[object Object]` everywhere).
93
+
94
+ ## Building the form in one create — shape that worked
95
+
96
+ `form-create --config-file` with a flat `elements` list; each control is
97
+ `{type,label,name,required,...}` and the submit is `{"type":"button","submit":true}`.
98
+ Types used successfully: `heading`, `paragraph`, `file-upload`, `datetime-input`, `input`,
99
+ `number-input`, `button`. `isPrivate:false` + `publish:true` makes it public and published.
100
+ A control's `name` is also the **URL query-param key** for pre-filling, so pick stable,
101
+ URL-safe names.
@@ -0,0 +1,172 @@
1
+ # Submitting a PROCESIO form programmatically, and why you must
2
+
3
+ How to run a process **through its form** rather than through the process API, using the
4
+ public `FormProcess` endpoints, and the class of defect that only this catches.
5
+
6
+ ## Why the process API is not enough
7
+
8
+ A form and the process behind it are assembled separately, and **nothing in the platform
9
+ asserts that the two agree**. Two failure modes follow, both of which pass every
10
+ process-side assertion ever written:
11
+
12
+ 1. **A submit button wired to nothing.** The form validates, publishes, renders, collects
13
+ every field, and discards all of it. Process-side tests never touch the form, so they
14
+ stay green.
15
+ 2. **An input that is collected, mapped, and never consumed.** The variable exists, the
16
+ form sends it, the engine receives it, and no action reads it. The feature it appears to
17
+ offer silently does nothing, and the value shown to the user is whatever the code
18
+ hardcoded.
19
+
20
+ Both are invisible to an API-only test suite and to a green run. Treat a form-surface
21
+ submission as part of acceptance, not as an extra.
22
+
23
+ ## The call sequence (mirrors the process side, different routes and headers)
24
+
25
+ Every `FormProcess` route is **anonymous** and scoped entirely by the
26
+ `formTemplateWorkspaceId` **header**. Omit it and the API answers
27
+ `Invalid request due to missing or incorrect resource parameters. target: form template`.
28
+
29
+ | Step | Call | Notes |
30
+ |---|---|---|
31
+ | 1 publish | `POST /api/FormProcess/{formTemplateId}/{processTemplateId}/publish` | body = the input payload keyed by **process variable name**; files are staged as **metadata only** `{path:"",size,mimeType,name,id:<client uuid>,hash:""}` |
32
+ | 2 upload | `POST /api/FormProcess/{formTemplateId}/{flowInstanceId}/upload` | `multipart/form-data`, field name **`package`**, headers `flowTemplateId`, `variableName`, `fileId`, `formTemplateWorkspaceId` |
33
+ | 3 launch | `POST /api/FormProcess/{formTemplateId}/{instanceId}/launch?runSynchronous=true&secondsTimeOut=N` | body `{connectionId, flowTemplateId}` |
34
+ | 4 read | `GET /api/FormProcess/{formTemplateId}/{processTemplateId}/{processInstanceId}/variables` | |
35
+
36
+ **The launch route's second path segment is the INSTANCE, not the process template**, even
37
+ though the API reference names it `processTemplateId`. The give-away is that the body
38
+ already carries `flowTemplateId`, which would be redundant otherwise; the process-side
39
+ equivalent (`/api/Projects/instances/{instanceId}/launch`) has the same shape. Verified
40
+ live: launching with the instance in that slot succeeds.
41
+
42
+ **The variables response carries runtime values in `defaultValue`, not `value`.** The
43
+ endpoint returns variable *definitions*. Reading `value` yields `None` for every output and
44
+ looks exactly like "the form produced nothing", which is the same false negative this
45
+ whole exercise exists to prevent. Flatten to `{name: defaultValue}` before asserting.
46
+
47
+ Implemented as the curated action `run-form-with-files` (the generated `<method>-<path>`
48
+ actions cannot reach it: they send JSON only, with no custom headers and no multipart).
49
+
50
+ ## The contract check, as a standard
51
+
52
+ Run this for every card that ships a form. It is three layers, and the third is the one
53
+ that cannot be faked:
54
+
55
+ 1. **Every form input reaches the engine.** Each `inputMap` row's process side resolves to a
56
+ real input variable, and its form side resolves to a **4-segment value path**. A row left
57
+ holding a raw field *name* is accepted by the API, renders blank in the designer, and
58
+ never carries a value.
59
+ 2. **Every engine output reaches a pane.** Any output with no `outputMap` row is either a
60
+ missing pane or a machine-only channel. See the exemption rule below.
61
+ 3. **Every input is consumed by the logic.** Cross-reference each input variable against every
62
+ action's parameter bindings. An input bound by nothing is a **defect, not a spare**. Then
63
+ prove it end to end: submit through the form surface and assert that a value entered on the
64
+ form is visible in the rendered output. A tolerance, a threshold or a label is ideal,
65
+ because a wrong one is invisible in a green run.
66
+
67
+ Layers 1 and 2 read the live DTOs and cost nothing. Layer 3 needs one real submission.
68
+
69
+ ## The named machine channel: how to have an exception without losing the rule
70
+
71
+ A strict rule with no exit becomes a rule people switch off. A rule with a silent exit stops
72
+ being a rule. The way to keep both is a **declared exemption**: a machine-only output is
73
+ listed by name in the checker, so it passes and the pass is visible.
74
+
75
+ ```python
76
+ # Outputs that exist for assertions and API callers, not for a pane.
77
+ # Named explicitly so the exemption shows up rather than being assumed.
78
+ MACHINE_ONLY = {"recon"}
79
+ ```
80
+
81
+ The check then reports `output 'recon' is a declared machine channel, no pane expected`
82
+ instead of either failing a legitimate design or silently skipping it. Three properties make
83
+ this honest, and they generalise to any strict gate:
84
+
85
+ - **It is enumerated, not inferred.** No pattern match on names, no "outputs starting with an
86
+ underscore are internal". Someone had to type the name.
87
+ - **It appears in the output.** The exemption is a line in the report, so a reviewer sees the
88
+ exception was taken and can challenge it.
89
+ - **It is per-artefact and small.** A growing allowlist is itself the signal that the design
90
+ drifted, which a blanket `--skip-outputs` flag would hide.
91
+
92
+ Never widen this to a category ("all Json outputs are machine channels"). The moment the
93
+ exemption is a class rather than a list, a genuinely missing pane joins it unnoticed, and the
94
+ gate goes back to passing the defect it was built to catch.
95
+
96
+ ## A RUN_PROCESS event that never reads its result
97
+
98
+ Two separate settings decide whether a form learns anything from the process it launched, and a
99
+ form can be missing both while looking completely wired in the designer:
100
+
101
+ - **`syncRun: false`** — the event fires and the form moves on. Nothing downstream can see a result.
102
+ - **`outputMap: []`** — even a synchronous run maps nothing back, so the process's output variables
103
+ stay inside the process.
104
+
105
+ With both, the form falls through to its generic `SUBMIT_SUCCESS` message whatever happened, so a
106
+ refusal ("that slot is taken", "invalid email", a rate-limit) is indistinguishable from a booking
107
+ that was written. This is the form-side twin of the `Execute Command` result-set defect
108
+ (PROCESIO-SQL-ACTIONS-NOTES.md): at every layer the failure mode is *the outcome is discarded and
109
+ success is assumed*, and at every layer it is invisible to validation and to a green run.
110
+
111
+ **The shape that works** — three events on one button, in this order:
112
+ 1. `RUN_JAVASCRIPT` — validate, then write the process inputs into `ProcesioForm.variables`.
113
+ 2. `RUN_PROCESS` — `syncRun: true`, `inputMap` from those variables, `outputMap` from the
114
+ process's output variable into a FORM variable.
115
+ 3. `RUN_JAVASCRIPT` — read that form variable and render the real outcome.
116
+
117
+ `form-set-element-event --replace-action RUN_PROCESS` swaps step 2 in place, preserving the other
118
+ events and their order; a plain call appends, which is how step 3 lands last.
119
+
120
+ **A result-set output arrives as a LIST even when it is one row**, so step 3 must take `[0]` (and
121
+ tolerate a non-array). Guard the success test on both `true` and `1` — the same field comes back
122
+ as a SQL bit and as a JSON boolean depending on the path.
123
+
124
+ **Do not hand-escape values in the form's JavaScript.** A `.replace(/'/g, "''")` in a submit
125
+ handler is a sign the process is string-interpolating SQL rather than binding parameters. Fix the
126
+ process (`sql-parameterize`), then delete the escaping: it is not a control (the process endpoint
127
+ is callable directly, without the form) and it corrupts legitimate input.
128
+
129
+ ### Map rows: `isList` is not cosmetic
130
+ Each side of an `inputMap` / `outputMap` row is an object, `{value, isList, path}`. Binding a
131
+ list-valued variable with `isList: false` puts the whole result set into a scalar slot: the form
132
+ receives nothing, and both the API and the designer accept the row without complaint. `path` is
133
+ `{}` on the process side; on the form side it is `{}` for a form VARIABLE and `null` for a form
134
+ FIELD target.
135
+
136
+ ## A `paragraph` renders its `label`. Writing `.value` paints nothing.
137
+
138
+ The single highest-yield form gotcha found so far, because it fails in the direction that looks
139
+ fine: `ProcesioForm.data.fields.SomeParagraph.value = '…'` is accepted, throws nothing, logs
140
+ nothing — and the page keeps its original placeholder text. A handler written that way reports
141
+ nothing at all to the visitor, whatever happened underneath.
142
+
143
+ ```js
144
+ function say(text) { // set BOTH: a field control does read .value
145
+ const m = ProcesioForm.data.fields.BookingMessage;
146
+ m.label = text; m.value = text; m.visible = true;
147
+ }
148
+ ```
149
+
150
+ Verified live both ways on a published form: with only `.value` the DOM text was unchanged after a
151
+ successful run; with `.label` the new text appeared. Assume the same for any control whose text is
152
+ authored as a label (heading, paragraph) rather than typed into by the user.
153
+
154
+ **Test it by reading the DOM, not the handler.** The handler running is not evidence the reader saw
155
+ anything — `document.body.innerText` before and after the click is.
156
+
157
+ ## Driving a published form headlessly, without a compositing browser pane
158
+
159
+ Two facts make a real end-to-end click-through possible even when no pane is displayed and trusted
160
+ mouse events are unavailable:
161
+
162
+ 1. **`element.click()` works on a PROCESIO form button.** The whole event chain fires — the JS
163
+ handlers, the RUN_PROCESS, the result handler. Confirmed by the process instance appearing in
164
+ `list-instances` attributed to the form, and by the row changing in the database.
165
+ 2. **Every control pre-fills from a URL query parameter named after the control** — including
166
+ `visible: false` controls, whose values reach the process even though they are not in the DOM at
167
+ all. That is what makes a hidden-token page (a cancel link) work, and it also lets a test skip
168
+ custom pickers (dropdown, date, slot list) that need trusted events: pass their values on the
169
+ query string instead.
170
+
171
+ So: navigate with the fields on the query string, `.click()` the button, then read
172
+ `document.body.innerText`. That is a genuine test of the deployed form, not a stub.
@@ -0,0 +1,110 @@
1
+ # PROCESIO — HTML to Word (.docx) inside a process
2
+
3
+ How to produce a real Word document from the same HTML that `Generate Document` turns into a
4
+ PDF, and the platform facts that decide the design. The converter is
5
+ [`assets/html2docx/html2docx.js`](assets/html2docx/html2docx.js), guarded by
6
+ `tests/test_html2docx_asset.py`.
7
+
8
+ ## Why the obvious routes fail
9
+
10
+ - **`Generate Document` has no Word output.** Its `Save document as` select offers exactly
11
+ `PDF` (value `1`) and `HTML` (value `2`). There is no DOCX option to switch to.
12
+ - **Saving the HTML bytes as `.doc`/`.docx` does not work.** `String To Base64` -> `Base64 To
13
+ File` with a `.docx` name gives Word a file it either refuses (a `.docx` must be a zip) or
14
+ imports through its HTML importer (`.doc`). That importer ignores most class-based CSS from a
15
+ `<style>` block, so a document styled the way generated HTML usually is (classes, `colgroup`
16
+ widths in %, wrapper padding) comes out with wrong fonts, margins, table widths and spacing,
17
+ while the PDF of the same HTML looks right.
18
+ - The PDF side is not a neutral reference either: the PDF renderer receives the HTML after a
19
+ sanitizer that drops the DOCTYPE (so it renders in **quirks mode**: tables reset their font),
20
+ uses **screen** CSS, ignores `@page`, and shrinks the page to fit. Match its layout rules, not
21
+ its pixels.
22
+
23
+ ## The working shape (verified live)
24
+
25
+ ```
26
+ html (String) -> String To Base64 --\
27
+ >-- Join -> Node (converter) -> Base64 To File -> docx (File)
28
+ htmlFile (File) -> File To Base64 --/
29
+ ```
30
+
31
+ - Inject the HTML into the Node as **base64 inside double quotes** (`var HTML_B64 = "<%0%>";`).
32
+ Base64 has no quote, backslash, backtick or `${`, so it is the one string form that cannot
33
+ break or inject into the script. The converter decodes it.
34
+ - **`String To Base64` encodes UTF-8.** A Romanian contract with diacritics converted through
35
+ the live process produced a `word/document.xml` byte-identical to a local run on the same
36
+ file.
37
+ - Options travel as one **Json** input injected as `[<%1%>][0]`, which is `undefined` when the
38
+ caller sends nothing (a bare null injection is a syntax error, see
39
+ PROCESIO-NODE-CODE-NOTES.md).
40
+ - The Node **returns the .docx as one base64 string** in `Single Result` (500 KB+ works) and
41
+ writes a JSON report with `console.log`, which lands in the Node's **`Stdout`** output
42
+ property (a string, with a trailing newline). A Node has no other second output.
43
+ - A **rule `Decisional` with `IS_NOT_EMPTY` on a File variable** routes correctly: a file
44
+ goes to the first case, an unset file falls through to the next case.
45
+ - **`Stop` accepts one input.** Wiring several branches (success, two `Throw`s) straight into it
46
+ fails backend validation with statusCode `383` "Action has too many input ports.". Converge
47
+ them on a `Join` first.
48
+ - A 200-270 KB contract converts in about 0.2 s inside the Node; set `Timeout` well above that
49
+ anyway (180) for documents with many images.
50
+
51
+ ## What the converter does (so a change keeps the same rules)
52
+
53
+ - Parses HTML, applies a browser default sheet, presentational attributes (`align`, `bgcolor`,
54
+ `border`, `cellpadding`, `width`, `<font>`), every `<style>` block and inline styles with
55
+ normal CSS precedence (specificity, order, `!important`). Media queries are evaluated as
56
+ **screen** at A4 width, like the PDF renderer; `@page` is still read from `@media print`
57
+ blocks, because that is where authors put page setup.
58
+ - **Page margins** = `@page` margins (default 1 cm, the PDF renderer's) **plus** the horizontal
59
+ margin/padding of `body` and of a single wrapper element under it. Folding the wrapper into the
60
+ margins gives an editable Word document instead of every paragraph carrying a left indent.
61
+ - **Line spacing:** a unitless CSS `line-height` L becomes Word "multiple" `L / f`, where `f` is
62
+ the font's normal line height (Arial and Times 1.149, Calibri 1.2207, ...). CSS 1.241 on Arial
63
+ is Word's 1.08, which is what HTML generated from a Word original carries.
64
+ - **Tables:** fixed layout on a twips grid; widths from `<col>`, then cells, then a content
65
+ estimate; `%` widths and margins resolve against the containing content width; negative
66
+ `margin-left` becomes a negative table indent; `rowspan`/`colspan` become `vMerge`/`gridSpan`;
67
+ `thead` rows repeat as header rows; cell padding becomes per-cell margins.
68
+ - Paragraph margins collapse the CSS way (max of adjacent margins), because Word adds spacing
69
+ after and before instead of collapsing them.
70
+ - `page-break-before/after: always` -> `pageBreakBefore` (a 1 pt paragraph carries it in front
71
+ of a table); `page-break-inside: avoid` -> keep-with-next on every paragraph but the last and
72
+ `cantSplit` rows. An empty block with a height becomes an exact-height spacer.
73
+ - Inline backgrounds that match a Word highlight colour (`#FFFF00` ...) become highlights, so
74
+ placeholders stay one click to clear; other colours become run shading.
75
+ - Images: base64 data URIs (PNG, JPEG, GIF, BMP) are embedded with their CSS size. `https`
76
+ images are fetched only when the caller opts in with `fetchImages: true` AND the sandbox
77
+ allows `require('https')`; by default (and always inside the platform sandbox, which blocks
78
+ `require`) a remote image is left as its `alt` text and the report lists a warning. Opt-in is
79
+ the safe default on purpose: the fetch retrieves whatever URL the HTML names, so enabling it
80
+ on untrusted HTML where `require` resolves is a server-side-request-forgery vector.
81
+
82
+ ## Known limits
83
+
84
+ Flex and grid lay out as stacked blocks, floats and absolute positioning stay in flow, inline
85
+ SVG is not drawn, `::before`/`::after` content is ignored, and side-by-side `inline-block` boxes
86
+ stack vertically. Write HTML meant for both PDF and Word with tables for side-by-side layout.
87
+ The converter flags flex, grid, float and inline SVG in the report `warnings`, so the author
88
+ sees why a layout stacked instead of guessing.
89
+
90
+ ## Updating the converter in a live process
91
+
92
+ The Node `Code` is the asset file between a first-line `//` comment and this wrapper:
93
+
94
+ ```js
95
+ var HTML_B64 = "<%0%>"; // bound to the html_b64 variable
96
+ var OPTIONS = [<%1%>][0]; // bound to the options (Json) input
97
+ var res = H2D.convert(HTML_B64, OPTIONS, true);
98
+ function done(r) { try { console.log(JSON.stringify(r.report)); } catch (e) {} return r.base64; }
99
+ return (res && typeof res.then === 'function') ? res.then(done) : done(res);
100
+ ```
101
+
102
+ Rebuild the process with `process-edit` (the builder writes both the runtime and the designer
103
+ copy of the code). Never write a `<%` sequence anywhere in the asset, comments included: the
104
+ platform substitutes it textually. The test enforces this.
105
+
106
+ ## Verifying a result
107
+
108
+ Open the generated file in real Word and export it to PDF, then compare page by page with a
109
+ browser print of the same HTML (headless Chrome `--print-to-pdf`). A `.docx` that only passes a
110
+ zip/XML check can still be one Word refuses or repairs.