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,178 @@
1
+ """Form-level CSS/JS (encrypted Data.code) + per-component styling.
2
+
3
+ Scheme verified live against real exports (2026-06-25): Data.code is JSON {JAVASCRIPT,CSS}
4
+ encrypted CryptoJS-style (AES-256-CBC, EVP_BytesToKey/MD5, Salted__). Tests use an injected
5
+ key (ctx['form_code_key']) so they need no Credential Manager access.
6
+ """
7
+ import uuid
8
+
9
+ import pytest
10
+
11
+ from tools.procesio.dto.form import builder, code_cipher
12
+ from tools.procesio.errors import UsageError
13
+
14
+ KEY = "TESTKEY123456789"
15
+
16
+
17
+ def _ctx():
18
+ return {"new_id": lambda: str(uuid.uuid4()), "form_code_key": KEY}
19
+
20
+
21
+ # ---- cipher ---------------------------------------------------------------
22
+ def test_code_cipher_roundtrip():
23
+ blob = code_cipher.encrypt_code("console.log(1)", "body{color:red}", KEY)
24
+ assert blob.startswith("U2FsdGVkX1") # base64("Salted__")
25
+ out = code_cipher.decrypt_code(blob, KEY)
26
+ assert out == {"JAVASCRIPT": "console.log(1)", "CSS": "body{color:red}"}
27
+
28
+
29
+ def test_code_cipher_wrong_key_fails():
30
+ blob = code_cipher.encrypt_code("x", "y", KEY)
31
+ with pytest.raises(Exception):
32
+ code_cipher.decrypt_code(blob, "WRONGKEY12345678")
33
+
34
+
35
+ # ---- builder: form-level code --------------------------------------------
36
+ def test_build_sets_encrypted_code():
37
+ dto = builder.build(
38
+ {"name": "F", "css": "a{}", "javascript": "b()",
39
+ "elements": [{"type": "input", "label": "X"}]}, _ctx())
40
+ blob = dto["Data"]["code"]
41
+ assert code_cipher.decrypt_code(blob, KEY) == {"JAVASCRIPT": "b()", "CSS": "a{}"}
42
+
43
+
44
+ def test_build_code_object_form():
45
+ dto = builder.build(
46
+ {"name": "F", "code": {"css": "c{}", "javascript": "d()"},
47
+ "elements": [{"type": "input", "label": "X"}]}, _ctx())
48
+ assert code_cipher.decrypt_code(dto["Data"]["code"], KEY)["CSS"] == "c{}"
49
+
50
+
51
+ def test_build_no_code_is_empty_string():
52
+ dto = builder.build({"name": "F", "elements": [{"type": "input", "label": "X"}]}, _ctx())
53
+ assert dto["Data"]["code"] == ""
54
+
55
+
56
+ # ---- builder: per-component style -----------------------------------------
57
+ def test_element_style_sets_enabled_cssproperties():
58
+ dto = builder.build(
59
+ {"name": "F", "elements": [
60
+ {"type": "input", "label": "X", "style": {"--h-input": "50px"}}]}, _ctx())
61
+ el = next(e for e in dto["Data"]["elements"] if e["type"] == "input")
62
+ style = next(c for c in el["configs"] if c["key"] == "style")["value"]
63
+ assert style == [{"label": "Height", "value": "50px",
64
+ "cssVariable": "--h-input", "type": None, "enabled": True}]
65
+
66
+
67
+ def test_element_style_unknown_var_fails_loud():
68
+ with pytest.raises(UsageError):
69
+ builder.build({"name": "F", "elements": [
70
+ {"type": "input", "label": "X", "style": {"--bogus": "1"}}]}, _ctx())
71
+
72
+
73
+ def test_element_style_on_unstylable_type_fails():
74
+ with pytest.raises(UsageError):
75
+ builder.build({"name": "F", "elements": [
76
+ {"type": "heading", "label": "H", "style": {"--x": "y"}}]}, _ctx())
77
+
78
+
79
+ # ---- dynamic vs static tables ---------------------------------------------
80
+ def _table(dynamic):
81
+ spec = {"type": "table", "name": "items", "columns": [
82
+ {"key": "p", "label": "P", "cell": {"type": "input"}}]}
83
+ if dynamic:
84
+ spec["dynamic"] = True
85
+ dto = builder.build({"name": "T", "elements": [spec]}, _ctx())
86
+ return dto["Data"]["elements"]
87
+
88
+
89
+ def test_dynamic_table_uses_dynamic_row_with_add_remove():
90
+ els = _table(dynamic=True)
91
+ rows = [e for e in els if e["type"] == "dynamic-table-row"]
92
+ assert rows, "dynamic table must emit a dynamic-table-row"
93
+ cfg = {c["key"]: c.get("value") for c in rows[0]["configs"]}
94
+ assert cfg.get("canAdd") is True and cfg.get("canRemove") is True
95
+
96
+
97
+ def test_static_table_uses_static_row():
98
+ els = _table(dynamic=False)
99
+ assert any(e["type"] == "static-table-row" for e in els)
100
+ assert not any(e["type"] == "dynamic-table-row" for e in els)
101
+
102
+
103
+ # ---- element alignment properties -----------------------------------------
104
+
105
+ def _style_of(dto, idx=0):
106
+ el = dto["Data"]["elements"][idx]
107
+ return {p["cssVariable"]: p["value"]
108
+ for p in next(c for c in el["configs"] if c["key"] == "style")["value"]}
109
+
110
+
111
+ def test_section_accepts_alignment_vars():
112
+ dto = builder.build(
113
+ {"name": "F", "elements": [
114
+ {"type": "section", "label": "S",
115
+ "style": {"--fd-section": "row", "--jc-section": "center",
116
+ "--ai-section": "stretch"}}]}, _ctx())
117
+ s = _style_of(dto)
118
+ assert s["--fd-section"] == "row" and s["--jc-section"] == "center"
119
+ assert s["--ai-section"] == "stretch"
120
+
121
+
122
+ def test_columns_alignment_suffix():
123
+ dto = builder.build(
124
+ {"name": "F", "elements": [
125
+ {"type": "columns", "label": "C",
126
+ "style": {"--jc-column": "space-between"}}]}, _ctx())
127
+ assert _style_of(dto)["--jc-column"] == "space-between"
128
+
129
+
130
+ def test_alignment_var_wrong_suffix_still_fails_loud():
131
+ # --jc-section is invalid on a columns element (its suffix is 'column').
132
+ with pytest.raises(UsageError):
133
+ builder.build({"name": "F", "elements": [
134
+ {"type": "columns", "label": "C", "style": {"--jc-section": "center"}}]}, _ctx())
135
+
136
+
137
+ # ---- dark theme (ModeProperties on the Colors group) ----------------------
138
+
139
+ def _colors_group(dto):
140
+ for g in dto["Data"]["theme"]:
141
+ if str(g.get("label", "")).strip().lower() == "colors":
142
+ return g
143
+ return None
144
+
145
+
146
+ def _mode_var(dto, mode, cssvar):
147
+ for p in _colors_group(dto)["properties"][mode]:
148
+ if p.get("cssVariable") == cssvar:
149
+ return p["value"]
150
+ return None
151
+
152
+
153
+ def test_dark_mode_puts_modeproperties_on_colors_group():
154
+ dto = builder.build(
155
+ {"name": "F", "dark": True,
156
+ "elements": [{"type": "input", "label": "X"}]}, _ctx())
157
+ colors = _colors_group(dto)
158
+ # Colors group's properties becomes {light, dark}; other groups stay flat lists
159
+ assert isinstance(colors["properties"], dict)
160
+ assert set(colors["properties"]) == {"light", "dark"}
161
+ assert _mode_var(dto, "dark", "--c-primary") == "#4663f5" # DARK_PALETTE default
162
+ others = [g for g in dto["Data"]["theme"] if str(g.get("label")).lower() != "colors"]
163
+ assert all(isinstance(g["properties"], list) for g in others)
164
+
165
+
166
+ def test_dark_override_wins():
167
+ dto = builder.build(
168
+ {"name": "F", "dark": True, "themeDark": {"--c-primary": "#000000"},
169
+ "elements": [{"type": "input", "label": "X"}]}, _ctx())
170
+ assert _mode_var(dto, "dark", "--c-primary") == "#000000"
171
+ # light side keeps the light default
172
+ assert _mode_var(dto, "light", "--c-primary") != "#000000"
173
+
174
+
175
+ def test_no_dark_by_default():
176
+ dto = builder.build({"name": "F", "elements": [{"type": "input", "label": "X"}]}, _ctx())
177
+ assert isinstance(_colors_group(dto)["properties"], list) # flat, no {light,dark}
178
+ assert "themeMode" not in dto["Data"] and "themeDark" not in dto["Data"]
@@ -0,0 +1,99 @@
1
+ """Removing a control is the mirror of splicing one in, and is guarded the same way.
2
+
3
+ The property that makes `form-add-element` safe is that it touches nothing that already exists.
4
+ Delete has to hold the same line: every surviving element keeps its id and its field path, and a
5
+ control something still points at is refused rather than quietly turned into a dangling path -
6
+ which the platform saves without any error, leaving the referring control launching nothing.
7
+ """
8
+ import pytest
9
+
10
+ from tools.procesio.dto.form import addelement
11
+ from tools.procesio.errors import UsageError
12
+
13
+ FORM_ID = "ffffffff-ffff-ffff-ffff-ffffffffffff"
14
+ ROOT = "11111111-1111-1111-1111-111111111111"
15
+
16
+
17
+ def _el(eid, name, parent=None, etype="input", configs=None):
18
+ return {"id": eid, "type": etype, "parentId": parent, "section": "body",
19
+ "configs": (configs or []) + [{"key": "name", "value": name}]}
20
+
21
+
22
+ def _form(elements, attrs=None, events=None):
23
+ return {"id": FORM_ID,
24
+ "data": {"elements": elements,
25
+ "variables": [{"id": ROOT}],
26
+ "events": events or [],
27
+ "dataModel": {"id": ROOT, "name": "form", "attributes": [
28
+ {"id": "fields-ns", "name": "fields",
29
+ "attributes": attrs or []}]}}}
30
+
31
+
32
+ def test_the_control_and_its_model_entry_both_go():
33
+ form = _form([_el("a", "Keep"), _el("b", "Drop")],
34
+ attrs=[{"id": "a", "name": "Keep"}, {"id": "b", "name": "Drop"}])
35
+ data, report = addelement.delete_element(form, "Drop")
36
+ assert [e["id"] for e in data["elements"]] == ["a"]
37
+ assert report["model_attributes_removed"] == 1
38
+ assert [r["name"] for r in report["removed"]] == ["Drop"]
39
+
40
+
41
+ def test_it_can_be_addressed_by_id_as_well_as_by_name():
42
+ form = _form([_el("a", "Keep"), _el("b", "Drop")])
43
+ data, _ = addelement.delete_element(form, "b")
44
+ assert [e["id"] for e in data["elements"]] == ["a"]
45
+
46
+
47
+ def test_a_surviving_control_is_untouched():
48
+ keep = _el("a", "Keep")
49
+ form = _form([keep, _el("b", "Drop")])
50
+ data, _ = addelement.delete_element(form, "Drop")
51
+ assert data["elements"][0] == keep
52
+
53
+
54
+ def test_a_referenced_control_is_refused():
55
+ referring = _el("a", "Keep", configs=[{"key": "onClickEvents",
56
+ "value": {"events": [{"config": {"inputMap": [
57
+ {"right": {"value": f"{FORM_ID}.fields.b"}}]}}]}}])
58
+ form = _form([referring, _el("b", "Drop")])
59
+ with pytest.raises(UsageError) as e:
60
+ addelement.delete_element(form, "Drop")
61
+ assert "still referenced" in str(e.value)
62
+
63
+
64
+ def test_force_deletes_a_referenced_control_and_reports_the_breakage():
65
+ referring = _el("a", "Keep", configs=[{"key": "onClickEvents",
66
+ "value": {"events": [{"config": {"inputMap": [
67
+ {"right": {"value": f"{FORM_ID}.fields.b"}}]}}]}}])
68
+ form = _form([referring, _el("b", "Drop")])
69
+ data, report = addelement.delete_element(form, "Drop", force=True)
70
+ assert [e["id"] for e in data["elements"]] == ["a"]
71
+ assert report["broken_references"] == ["b"]
72
+
73
+
74
+ def test_a_container_with_children_is_refused_then_removed_whole_with_force():
75
+ form = _form([_el("box", "Box", etype="tabs"),
76
+ _el("c1", "Child1", parent="box"),
77
+ _el("c2", "Child2", parent="box")])
78
+ with pytest.raises(UsageError) as e:
79
+ addelement.delete_element(form, "Box")
80
+ assert "contains 2 control" in str(e.value)
81
+
82
+ data, report = addelement.delete_element(form, "Box", force=True)
83
+ assert data["elements"] == []
84
+ assert report["descendants"] == 2
85
+
86
+
87
+ def test_the_container_list_stops_naming_a_removed_child():
88
+ box = _el("box", "Box", etype="tabs", configs=[{"key": "tabs", "value": ["Child1", "Child2"]}])
89
+ form = _form([box, _el("c1", "Child1", parent="box"), _el("c2", "Child2", parent="box")])
90
+ data, _ = addelement.delete_element(form, "Child1")
91
+ listed = next(c["value"] for c in data["elements"][0]["configs"] if c["key"] == "tabs")
92
+ assert listed == ["Child2"]
93
+
94
+
95
+ def test_an_unknown_element_is_refused_with_the_known_names():
96
+ form = _form([_el("a", "Keep")])
97
+ with pytest.raises(UsageError) as e:
98
+ addelement.delete_element(form, "Nope")
99
+ assert "Keep" in str(e.value)
@@ -0,0 +1,141 @@
1
+ """form-get-element / form-set-element-config: surgical rewrite of one element's configs.
2
+
3
+ The invariants worth guarding are the ones whose breach is SILENT on the platform:
4
+ a rewritten config that gets a fresh id breaks every value path pointing at it, and
5
+ a config invented on an element has no data-model attribute behind it, so the
6
+ designer renders raw guids and values never flow. Both must fail loudly here rather
7
+ than produce a form that looks saved and does not work.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import pytest
12
+
13
+ from tools.procesio import main
14
+ from tools.procesio.client import ProcesioClient
15
+ from tools.procesio.errors import UsageError
16
+ from tools.procesio.tests.conftest import FakeResp, FakeSession
17
+
18
+ APIKEY = {"type": "apikey", "key": "N", "value": "V"}
19
+
20
+
21
+ def _call(action, argv, session):
22
+ return main.dispatch(
23
+ action, argv,
24
+ client_builder=lambda prof: ProcesioClient(profile=APIKEY, name="t", session=session))
25
+
26
+
27
+ def _form() -> dict:
28
+ return {
29
+ "id": "F1", "name": "Some form", "isPrivate": False, "type": 1, "status": 1,
30
+ "state": True, "assignees": [], "customUrl": None,
31
+ "data": {
32
+ "code": "",
33
+ "elements": [
34
+ {"id": "e1", "type": "paragraph", "parentId": "s1", "section": "body",
35
+ "configs": [
36
+ {"id": "c-label", "key": "label", "value": "<p>old</p>"},
37
+ {"id": "c-name", "key": "name", "value": "intro1"},
38
+ {"id": "c-visible", "key": "visible", "value": True},
39
+ ]},
40
+ {"id": "e2", "type": "input", "parentId": "s1", "section": "body",
41
+ "configs": [
42
+ {"id": "c2-name", "key": "name", "value": "cnp"},
43
+ {"id": "c2-req", "key": "required", "value": False},
44
+ {"id": "c2-regex", "key": "regex", "value": ""},
45
+ {"id": "c2-input", "key": "onInputEvents", "value": None},
46
+ ]},
47
+ ],
48
+ "theme": [{"label": "Colors"}],
49
+ "dataModel": {"id": "dm"},
50
+ },
51
+ }
52
+
53
+
54
+ def test_get_element_by_name_returns_its_configs():
55
+ s = FakeSession(queue=[FakeResp(200, _form())])
56
+ out = _call("form-get-element", ["--id", "F1", "--element", "intro1"], s)
57
+ assert out["element_id"] == "e1" and out["type"] == "paragraph"
58
+ assert out["configs"]["label"] == "<p>old</p>"
59
+
60
+
61
+ def test_get_element_can_be_narrowed_to_one_key():
62
+ s = FakeSession(queue=[FakeResp(200, _form())])
63
+ out = _call("form-get-element",
64
+ ["--id", "F1", "--element", "cnp", "--key", "regex"], s)
65
+ assert out["configs"] == {"regex": ""}
66
+ assert "required" in out["config_keys"] # the full key list is still reported
67
+
68
+
69
+ def test_set_preserves_the_config_id_and_leaves_every_sibling_untouched():
70
+ """The data model addresses each attribute by the element's OWN config id, so a
71
+ fresh id on a rewritten config silently breaks every value path pointing at it."""
72
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
73
+ out = _call("form-set-element-config",
74
+ ["--id", "F1", "--element", "intro1", "--set", "label=<p>new</p>"], s)
75
+ assert out["updated"] is True
76
+ assert out["previous"] == {"label": "<p>old</p>"}
77
+
78
+ put = s.calls[-1]
79
+ elements = put["json"]["Data"]["elements"]
80
+ label = next(c for c in elements[0]["configs"] if c["key"] == "label")
81
+ assert label["id"] == "c-label" and label["value"] == "<p>new</p>"
82
+ # every sibling element and config byte-identical
83
+ assert elements[1] == _form()["data"]["elements"][1]
84
+ assert put["json"]["Data"]["theme"] == [{"label": "Colors"}]
85
+ assert put["json"]["Data"]["dataModel"] == {"id": "dm"}
86
+
87
+
88
+ def test_scalars_are_parsed_as_json_so_required_stores_a_boolean():
89
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
90
+ _call("form-set-element-config",
91
+ ["--id", "F1", "--element", "cnp",
92
+ "--set", "required=true", "--set", "regex=^[0-9]{13}$"], s)
93
+ configs = {c["key"]: c["value"] for c in s.calls[-1]["json"]["Data"]["elements"][1]["configs"]}
94
+ assert configs["required"] is True # boolean, not the string "true"
95
+ assert configs["regex"] == "^[0-9]{13}$" # not valid JSON -> kept as a string
96
+
97
+
98
+ def test_set_file_carries_a_long_html_label(tmp_path):
99
+ body = tmp_path / "label.html"
100
+ body.write_text("<div>lung</div>", encoding="utf-8")
101
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
102
+ _call("form-set-element-config",
103
+ ["--id", "F1", "--element", "intro1", "--set-file", f"label={body}"], s)
104
+ label = next(c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
105
+ if c["key"] == "label")
106
+ assert label["value"] == "<div>lung</div>"
107
+
108
+
109
+ def test_an_unknown_config_is_refused_before_anything_is_written():
110
+ """Inventing a config would need a matching data-model attribute with the same id;
111
+ without one the designer shows raw guids. Refusing is the honest failure."""
112
+ s = FakeSession(queue=[FakeResp(200, _form())])
113
+ with pytest.raises(UsageError) as e:
114
+ _call("form-set-element-config",
115
+ ["--id", "F1", "--element", "intro1", "--set", "placeholder=x"], s)
116
+ assert "no config placeholder" in str(e.value)
117
+ assert not any(c["method"] == "PUT" for c in s.calls)
118
+
119
+
120
+ def test_event_configs_are_routed_to_the_event_action():
121
+ s = FakeSession(queue=[FakeResp(200, _form())])
122
+ with pytest.raises(UsageError) as e:
123
+ _call("form-set-element-config",
124
+ ["--id", "F1", "--element", "cnp", "--set", 'onInputEvents={"events":[]}'], s)
125
+ assert "form-set-element-event" in str(e.value)
126
+
127
+
128
+ def test_dry_run_reports_the_change_without_writing():
129
+ s = FakeSession(queue=[FakeResp(200, _form())])
130
+ out = _call("form-set-element-config",
131
+ ["--id", "F1", "--element", "intro1",
132
+ "--set", "visible=false", "--dry-run"], s)
133
+ assert out["dry_run"] is True and out["set"] == {"visible": False}
134
+ assert out["elements"] == 2 # the count to watch on every write
135
+ assert not any(c["method"] == "PUT" for c in s.calls)
136
+
137
+
138
+ def test_nothing_to_set_is_a_usage_error():
139
+ s = FakeSession(queue=[])
140
+ with pytest.raises(UsageError):
141
+ _call("form-set-element-config", ["--id", "F1", "--element", "intro1"], s)
@@ -0,0 +1,135 @@
1
+ """RUN_PROCESS input/output map resolution on a form element event (handlers/form_events).
2
+
3
+ The bug this guards: `isList` was hardcoded false on both sides of every map row, and a caller's
4
+ own value was discarded. A list-valued process variable then bound into a scalar slot, so the form
5
+ received nothing from a process that had run perfectly — and there is no error anywhere to read,
6
+ because both the API and the designer accept the row. Every result-set mapping was silently wrong.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import pytest
11
+
12
+ from tools.procesio.errors import UsageError
13
+ from tools.procesio.handlers import form_events as fe
14
+
15
+
16
+ PID = "process-1"
17
+
18
+
19
+ class _Client:
20
+ """Serves one process's variable DTOs, the way GET /api/Projects/{id} does."""
21
+
22
+ def __init__(self, variables):
23
+ self.variables = variables
24
+
25
+ def get(self, path, query=None):
26
+ assert path == f"/api/Projects/{PID}"
27
+ assert query == {"variablesOnly": "true"} # only the variables are read
28
+ return {"flow": {"variables": self.variables}}
29
+
30
+
31
+ def _client() -> _Client:
32
+ return _Client([
33
+ {"id": "var-rows", "name": "bookingResultRaw", "isList": True},
34
+ {"id": "var-name", "name": "clientName", "isList": False},
35
+ ])
36
+
37
+
38
+ def _row(config, side="outputMap", index=0):
39
+ return config[side][index]
40
+
41
+
42
+ def test_a_list_process_variable_maps_as_a_list_on_both_sides():
43
+ config = {"processId": PID,
44
+ "outputMap": [{"id": 0, "left": {"value": "bookingResultRaw"},
45
+ "right": {"value": "form-var"}}]}
46
+
47
+ out = fe._resolve_maps(config, _client())
48
+
49
+ row = _row(out)
50
+ assert row["left"]["isList"] is True
51
+ assert row["right"]["isList"] is True, "the form side holds what the process side produced"
52
+
53
+
54
+ def test_a_scalar_process_variable_still_maps_as_a_scalar():
55
+ config = {"processId": PID,
56
+ "inputMap": [{"id": 0, "left": {"value": "clientName"},
57
+ "right": {"value": "form-var"}}]}
58
+
59
+ out = fe._resolve_maps(config, _client())
60
+
61
+ row = _row(out, "inputMap")
62
+ assert row["left"]["isList"] is False
63
+ assert row["right"]["isList"] is False
64
+
65
+
66
+ def test_a_variable_named_by_guid_resolves_its_list_ness_too():
67
+ config = {"processId": PID,
68
+ "outputMap": [{"id": 0, "left": {"value": "var-rows"},
69
+ "right": {"value": "form-var"}}]}
70
+
71
+ out = fe._resolve_maps(config, _client())
72
+
73
+ assert _row(out)["left"]["value"] == "var-rows"
74
+ assert _row(out)["left"]["isList"] is True
75
+
76
+
77
+ def test_an_explicit_is_list_from_the_caller_wins_over_the_variable():
78
+ """Mapping ONE attribute out of a list is a scalar row against a list variable."""
79
+ config = {"processId": PID,
80
+ "outputMap": [{"id": 0,
81
+ "left": {"value": "bookingResultRaw", "isList": False},
82
+ "right": {"value": "form-var", "isList": False}}]}
83
+
84
+ out = fe._resolve_maps(config, _client())
85
+
86
+ assert _row(out)["left"]["isList"] is False
87
+ assert _row(out)["right"]["isList"] is False
88
+
89
+
90
+ def test_a_variable_name_is_resolved_to_its_guid():
91
+ config = {"processId": PID,
92
+ "inputMap": [{"id": 0, "left": {"value": "clientName"},
93
+ "right": {"value": "form-var"}}]}
94
+
95
+ out = fe._resolve_maps(config, _client())
96
+
97
+ assert _row(out, "inputMap")["left"]["value"] == "var-name"
98
+
99
+
100
+ def test_the_two_sides_keep_the_path_shapes_the_designer_expects():
101
+ config = {"processId": PID,
102
+ "outputMap": [{"id": 0, "left": {"value": "bookingResultRaw"},
103
+ "right": {"value": "form-var"}}]}
104
+
105
+ out = fe._resolve_maps(config, _client())
106
+
107
+ assert _row(out)["left"]["path"] == {}
108
+ assert _row(out)["right"]["path"] is None
109
+
110
+
111
+ def test_an_attribute_path_supplied_by_the_caller_survives():
112
+ config = {"processId": PID,
113
+ "outputMap": [{"id": 0,
114
+ "left": {"value": "bookingResultRaw", "path": {"attributeId": "a1"}},
115
+ "right": {"value": "form-var"}}]}
116
+
117
+ out = fe._resolve_maps(config, _client())
118
+
119
+ assert _row(out)["left"]["path"] == {"attributeId": "a1"}
120
+
121
+
122
+ def test_an_unknown_variable_fails_loudly_before_anything_is_written():
123
+ config = {"processId": PID,
124
+ "inputMap": [{"id": 0, "left": {"value": "nope"}, "right": {"value": "f"}}]}
125
+
126
+ with pytest.raises(UsageError) as e:
127
+ fe._resolve_maps(config, _client())
128
+
129
+ assert "nope" in str(e.value)
130
+ assert "clientName" in str(e.value), "the error must name what IS available"
131
+
132
+
133
+ def test_a_config_without_a_process_id_is_refused():
134
+ with pytest.raises(UsageError):
135
+ fe._resolve_maps({"outputMap": []}, _client())