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,376 @@
1
+ """form-set-element-event: wire one element's trigger without touching the rest.
2
+
3
+ Two invariants matter. First, the one form_code also guards — rewiring must never
4
+ rewrite the element tree. Second, the documented RUN_PROCESS trap: the PROCESS
5
+ VARIABLE GUID belongs on the LEFT of inputMap/outputMap. A name there is accepted
6
+ by the API, but the designer then renders raw guids and the launch 400s, so names
7
+ must resolve before the write and an unknown one must fail before anything is sent.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import json
12
+
13
+ import pytest
14
+
15
+ from tools.procesio import main
16
+ from tools.procesio.dto.form import fieldpath
17
+ from tools.procesio.client import ProcesioClient
18
+ from tools.procesio.errors import UsageError
19
+ from tools.procesio.tests.conftest import FakeResp, FakeSession
20
+
21
+ APIKEY = {"type": "apikey", "key": "N", "value": "V"}
22
+
23
+
24
+ def _call(action, argv, session):
25
+ return main.dispatch(
26
+ action, argv,
27
+ client_builder=lambda prof: ProcesioClient(profile=APIKEY, name="t", session=session))
28
+
29
+
30
+ NS = fieldpath.FIELDS_NS
31
+
32
+ # A realistic live form: every value-bearing control carries the `value` config whose id is
33
+ # the fourth segment of that field's path. The earlier fixture omitted them and mapped to
34
+ # invented strings like "root.upload.val", which passed only because nothing checked — the
35
+ # same permissiveness that let five autonomous builds write a path the platform accepts and
36
+ # the runtime ignores.
37
+ def _form(event_value=None):
38
+ return {
39
+ "id": "F1", "name": "Some form", "isPrivate": False, "type": 1, "status": 1,
40
+ "state": True, "assignees": [], "customUrl": None,
41
+ "data": {
42
+ "code": "", "theme": [{"label": "Colors"}], "dataModel": {"id": "dm"},
43
+ "elements": [
44
+ {"id": "E1", "type": "file-upload", "configs": [
45
+ {"key": "name", "value": "doccipf"},
46
+ {"key": "value", "id": "vc-E1"},
47
+ {"key": "onInputEvents", "value": event_value},
48
+ ]},
49
+ {"id": "E2", "type": "input", "configs": [
50
+ {"key": "name", "value": "nume"},
51
+ {"key": "value", "id": "vc-E2"},
52
+ ]},
53
+ ],
54
+ },
55
+ }
56
+
57
+
58
+ def _live(form):
59
+ return fieldpath.LiveForm(form)
60
+
61
+
62
+ PATH_E1 = f"dm.{NS}.E1.vc-E1"
63
+ PATH_E2 = f"dm.{NS}.E2.vc-E2"
64
+
65
+ _PROCESS = {"flow": {"id": "P1", "variables": [
66
+ {"id": "v-file", "name": "fisier"}, {"id": "v-nume", "name": "nume_extras"}]}}
67
+
68
+ # Mapped by field NAME — the calling convention the action now resolves for you.
69
+ _CFG = {"processId": "P1",
70
+ "inputMap": [{"left": "fisier", "right": "doccipf"}],
71
+ "outputMap": [{"left": "nume_extras", "right": "nume"}]}
72
+
73
+
74
+ def test_variable_names_resolve_to_guids_and_only_that_element_changes():
75
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
76
+ out = _call("form-set-element-event",
77
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
78
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
79
+
80
+ put = s.calls[-1]
81
+ assert put["method"] == "PUT" and put["url"].endswith("/api/FormTemplate")
82
+ els = put["json"]["Data"]["elements"]
83
+ assert els[1] == _form()["data"]["elements"][1] # sibling untouched
84
+ ev = [c for c in els[0]["configs"] if c["key"] == "onInputEvents"][0]["value"]["events"][0]
85
+ assert ev["action"] == "RUN_PROCESS" and ev["type"] == "INPUT"
86
+ # Each side is the designer's OBJECT shape, not a bare string; the process
87
+ # side carries path {} and the form side path null.
88
+ assert ev["config"]["inputMap"][0]["left"] == {
89
+ "value": "v-file", "isList": False, "path": {}} # NAME -> GUID
90
+ assert ev["config"]["outputMap"][0]["left"] == {
91
+ "value": "v-nume", "isList": False, "path": {}}
92
+ # The form side is resolved too: a field NAME becomes its four-segment value path.
93
+ assert ev["config"]["inputMap"][0]["right"] == {
94
+ "value": PATH_E1, "isList": False, "path": None}
95
+ assert ev["config"]["outputMap"][0]["right"] == {
96
+ "value": PATH_E2, "isList": False, "path": None}
97
+ assert ev["config"]["syncRun"] is True
98
+ # the canonical RUN_PROCESS keys the designer needs are backfilled from a minimal config
99
+ assert ev["config"]["areConditionsConfigured"] is True
100
+ assert ev["config"]["conditions"] == [] and ev["config"]["mapLatestTriggerOnly"] is False
101
+ assert out["updated"] is True and out["previous_events"] == []
102
+
103
+
104
+ def test_unknown_variable_name_fails_before_any_write():
105
+ bad = {"processId": "P1", "inputMap": [{"left": "nu_exista", "right": "doccipf"}],
106
+ "outputMap": []}
107
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
108
+ with pytest.raises(UsageError, match="neither a variable id nor a variable name"):
109
+ _call("form-set-element-event",
110
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
111
+ "--action", "RUN_PROCESS", "--config", json.dumps(bad)], s)
112
+ assert all(c["method"] == "GET" for c in s.calls)
113
+
114
+
115
+ def test_a_null_event_slot_means_no_handler_not_an_error():
116
+ """A fresh element carries the trigger key with a null value — seen on a real
117
+ file-upload control, which is exactly what this action is meant to wire."""
118
+ s = FakeSession(queue=[FakeResp(200, _form(None)), FakeResp(200, _PROCESS),
119
+ FakeResp(200, {})])
120
+ out = _call("form-set-element-event",
121
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
122
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
123
+ assert out["updated"] is True and out["event_count"] == 1
124
+
125
+
126
+ def test_append_versus_replace_and_previous_is_returned():
127
+ existing = {"debounce": 0, "events": [{"id": "old", "type": "INPUT",
128
+ "action": "RUN_JAVASCRIPT", "config": {"code": "x"}}]}
129
+ for flags, expected in ((["--replace"], 1), ([], 2)):
130
+ s = FakeSession(queue=[FakeResp(200, _form(existing)), FakeResp(200, _PROCESS),
131
+ FakeResp(200, {})])
132
+ out = _call("form-set-element-event",
133
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
134
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)] + flags, s)
135
+ assert out["event_count"] == expected
136
+ assert out["previous_events"][0]["id"] == "old" # recoverable either way
137
+
138
+
139
+ def test_dry_run_writes_nothing():
140
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
141
+ out = _call("form-set-element-event",
142
+ ["--id", "F1", "--element", "doccipf", "--on", "input", "--action",
143
+ "RUN_PROCESS", "--config", json.dumps(_CFG), "--dry-run"], s)
144
+ assert out["dry_run"] is True
145
+ assert all(c["method"] == "GET" for c in s.calls)
146
+
147
+
148
+ def test_lookup_by_id_and_a_helpful_miss():
149
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
150
+ out = _call("form-set-element-event",
151
+ ["--id", "F1", "--element", "E1", "--on", "input",
152
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
153
+ assert out["elementId"] == "E1"
154
+
155
+ s = FakeSession(queue=[FakeResp(200, _form())])
156
+ with pytest.raises(UsageError, match="no element with id or name"):
157
+ _call("form-set-element-event",
158
+ ["--id", "F1", "--element", "nope", "--on", "input",
159
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
160
+
161
+
162
+ def test_trigger_the_element_cannot_raise_is_rejected():
163
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
164
+ with pytest.raises(UsageError, match="cannot raise that trigger"):
165
+ _call("form-set-element-event",
166
+ ["--id", "F1", "--element", "doccipf", "--on", "click",
167
+ "--action", "RUN_PROCESS", "--config", json.dumps(_CFG)], s)
168
+
169
+
170
+ def test_trigger_names_come_from_the_builders_verified_maps():
171
+ """Re-deriving the trigger->type map here would let it drift from the builder's,
172
+ and a wrong event type is silently accepted by the API."""
173
+ from tools.procesio.dto.form import builder
174
+ from tools.procesio.handlers import form_events
175
+ for friendly in ("input", "click", "stepchange", "paginated"):
176
+ assert form_events._resolve_trigger(friendly) == (
177
+ builder._EVENT_KEY[friendly], builder._EVENT_TYPE[friendly])
178
+ with pytest.raises(UsageError, match="unknown trigger"):
179
+ form_events._resolve_trigger("not-a-trigger")
180
+
181
+
182
+ def test_get_element_events_reports_by_trigger():
183
+ existing = {"debounce": 0, "events": [{"id": "e", "action": "RUN_JAVASCRIPT"}]}
184
+ s = FakeSession(queue=[FakeResp(200, _form(existing))])
185
+ out = _call("form-get-element-events", ["--id", "F1", "--element", "doccipf"], s)
186
+ assert out["type"] == "file-upload"
187
+ assert out["events"]["onInputEvents"][0]["id"] == "e"
188
+
189
+
190
+ def test_map_rows_use_the_designers_object_shape_and_survive_a_round_trip():
191
+ """Bare strings are accepted by the API but the designer cannot render the row —
192
+ found by reading a mapping the designer itself had written."""
193
+ already = {"processId": "P1",
194
+ "inputMap": [{"id": 0,
195
+ "left": {"value": "v-file", "isList": False, "path": {}},
196
+ "right": {"value": PATH_E1, "isList": False, "path": None}}],
197
+ "outputMap": []}
198
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
199
+ _call("form-set-element-event",
200
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
201
+ "--action", "RUN_PROCESS", "--config", json.dumps(already)], s)
202
+ row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
203
+ if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["inputMap"][0]
204
+ assert row["left"] == {"value": "v-file", "isList": False, "path": {}}
205
+ assert row["right"] == {"value": PATH_E1, "isList": False, "path": None}
206
+
207
+
208
+ # -- RUN_DATA_STORE_OPERATION (DataStore form trigger) ----------------------
209
+
210
+ def test_datastore_trigger_writes_event_and_leaves_tree():
211
+ # No process fetch and no concurrency refetch (form has no updatedOn) -> GET, PUT.
212
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
213
+ out = _call("form-set-element-event",
214
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
215
+ "--action", "RUN_DATA_STORE_OPERATION",
216
+ "--data-store-id", "DS9", "--operation", "read"], s)
217
+ put = s.calls[-1]
218
+ assert put["method"] == "PUT" and put["url"].endswith("/api/FormTemplate")
219
+ els = put["json"]["Data"]["elements"]
220
+ assert els[1] == _form()["data"]["elements"][1] # sibling untouched
221
+ ev = [c for c in els[0]["configs"] if c["key"] == "onInputEvents"][0]["value"]["events"][0]
222
+ assert ev["action"] == "RUN_DATA_STORE_OPERATION" and ev["type"] == "INPUT"
223
+ cfg = ev["config"]
224
+ assert cfg["dataStoreId"] == "DS9" and cfg["operation"] == "READ" # name upper-cased
225
+ assert cfg["inputMap"] == [] and cfg["outputMap"] == []
226
+ assert cfg["filters"] == [] and cfg["areFiltersConfigured"] is False
227
+ assert out["updated"] is True
228
+
229
+
230
+ def test_datastore_trigger_requires_datastore_id():
231
+ s = FakeSession(queue=[FakeResp(200, _form())])
232
+ with pytest.raises(UsageError, match="dataStoreId"):
233
+ _call("form-set-element-event",
234
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
235
+ "--action", "RUN_DATA_STORE_OPERATION", "--operation", "READ"], s)
236
+
237
+
238
+ def test_datastore_trigger_add_operation_omits_filters():
239
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
240
+ _call("form-set-element-event",
241
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
242
+ "--action", "RUN_DATA_STORE_OPERATION",
243
+ "--data-store-id", "DS9", "--operation", "ADD"], s)
244
+ cfg = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
245
+ if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]
246
+ assert "filters" not in cfg # ADD does not support filters
247
+
248
+
249
+ def test_builder_trigger_datastore_branch():
250
+ from tools.procesio.dto.form.builder import _trigger
251
+ got = _trigger({"do": "datastore", "dataStoreId": "D1", "operation": "READ",
252
+ "inputs": [{"left": "page", "right": "root.p.val"}],
253
+ "filters": [{"displayName": "S", "operator": 1}]}, {})
254
+ assert got["action"] == "RUN_DATA_STORE_OPERATION"
255
+ assert got["config"]["dataStoreId"] == "D1"
256
+ assert got["config"]["inputMap"] == [{"id": 0, "left": "page", "right": "root.p.val"}]
257
+ assert got["config"]["areFiltersConfigured"] is True
258
+
259
+
260
+ # -- the form side of a map row: resolved, or refused -----------------------
261
+ #
262
+ # A wrong value path is the one mistake nothing downstream reports: the API answers
263
+ # `updated: true`, the designer renders the mapping, and clicking the control launches
264
+ # nothing. Measured across five autonomous builds, every one wrote
265
+ # `root.fields.<elementId>.value` — the NAMES from the guide's tree diagram substituted for
266
+ # the ids printed beside them. Since the platform will not object, the write is the last
267
+ # place the mistake can be caught.
268
+
269
+ def test_an_invented_value_path_is_refused_before_any_write():
270
+ bad = {"processId": "P1",
271
+ "inputMap": [{"left": "fisier", "right": "root.fields.E1.value"}],
272
+ "outputMap": []}
273
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
274
+ with pytest.raises(UsageError) as e:
275
+ _call("form-set-element-event",
276
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
277
+ "--action", "RUN_PROCESS", "--config", json.dumps(bad)], s)
278
+ assert all(c["method"] == "GET" for c in s.calls), "nothing may be written"
279
+ msg = str(e.value)
280
+ assert "segment 1 'root'" in msg and "segment 2 'fields'" in msg
281
+ assert PATH_E1 in msg, "the message must carry the correct path"
282
+ assert "doccipf" in msg, "…and the field name that would have worked"
283
+
284
+
285
+ def test_a_correct_value_path_passes_through_untouched():
286
+ """Back-compat for a caller that builds the path itself — but on validity, not on
287
+ the presence of dots."""
288
+ ok = {"processId": "P1",
289
+ "inputMap": [{"left": "fisier", "right": PATH_E1}], "outputMap": []}
290
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS), FakeResp(200, {})])
291
+ _call("form-set-element-event",
292
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
293
+ "--action", "RUN_PROCESS", "--config", json.dumps(ok)], s)
294
+ row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
295
+ if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["inputMap"][0]
296
+ assert row["right"]["value"] == PATH_E1
297
+
298
+
299
+ def test_a_value_config_id_borrowed_from_another_element_is_refused():
300
+ """The subtle one: four id-shaped segments, correct root and namespace, but the value
301
+ id belongs to a DIFFERENT element. Nothing downstream notices."""
302
+ crossed = {"processId": "P1",
303
+ "inputMap": [{"left": "fisier", "right": f"dm.{NS}.E1.vc-E2"}],
304
+ "outputMap": []}
305
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
306
+ with pytest.raises(UsageError, match="must be that element's own"):
307
+ _call("form-set-element-event",
308
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
309
+ "--action", "RUN_PROCESS", "--config", json.dumps(crossed)], s)
310
+ assert all(c["method"] == "GET" for c in s.calls)
311
+
312
+
313
+ def test_a_path_pointing_at_no_element_of_this_form_is_refused():
314
+ stray = {"processId": "P1",
315
+ "inputMap": [{"left": "fisier", "right": f"dm.{NS}.E9.vc-E9"}], "outputMap": []}
316
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
317
+ with pytest.raises(UsageError, match="is not an element on this form"):
318
+ _call("form-set-element-event",
319
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
320
+ "--action", "RUN_PROCESS", "--config", json.dumps(stray)], s)
321
+
322
+
323
+ def test_neither_a_field_name_nor_a_path_lists_the_fields():
324
+ junk = {"processId": "P1",
325
+ "inputMap": [{"left": "fisier", "right": "campul-meu"}], "outputMap": []}
326
+ s = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, _PROCESS)])
327
+ with pytest.raises(UsageError) as e:
328
+ _call("form-set-element-event",
329
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
330
+ "--action", "RUN_PROCESS", "--config", json.dumps(junk)], s)
331
+ assert "doccipf" in str(e.value) and "nume" in str(e.value)
332
+
333
+
334
+ def test_a_control_that_holds_no_value_cannot_be_mapped():
335
+ form = _form()
336
+ form["data"]["elements"].append(
337
+ {"id": "E3", "type": "heading", "configs": [{"key": "name", "value": "titlu"}]})
338
+ cfg = {"processId": "P1",
339
+ "inputMap": [{"left": "fisier", "right": "titlu"}], "outputMap": []}
340
+ s = FakeSession(queue=[FakeResp(200, form), FakeResp(200, _PROCESS)])
341
+ with pytest.raises(UsageError) as e:
342
+ _call("form-set-element-event",
343
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
344
+ "--action", "RUN_PROCESS", "--config", json.dumps(cfg)], s)
345
+ # The name IS on the form, so the refusal says why that control cannot hold a value —
346
+ # more use than a generic "not a field" would be.
347
+ assert "has no 'value' config" in str(e.value) and "heading" in str(e.value)
348
+ # …and it is not offered as a destination anywhere.
349
+ assert "titlu" not in _live(form).field_names()
350
+
351
+
352
+ def test_a_file_viewer_maps_through_its_src_config():
353
+ """The one control whose value config is not named `value` — kept in the shared rule so
354
+ the builder and this action cannot disagree about it."""
355
+ form = _form()
356
+ form["data"]["elements"].append(
357
+ {"id": "E4", "type": "file-viewer", "configs": [
358
+ {"key": "name", "value": "previzualizare"}, {"key": "src", "id": "vc-E4"}]})
359
+ cfg = {"processId": "P1", "inputMap": [],
360
+ "outputMap": [{"left": "nume_extras", "right": "previzualizare"}]}
361
+ s = FakeSession(queue=[FakeResp(200, form), FakeResp(200, _PROCESS), FakeResp(200, {})])
362
+ _call("form-set-element-event",
363
+ ["--id", "F1", "--element", "doccipf", "--on", "input",
364
+ "--action", "RUN_PROCESS", "--config", json.dumps(cfg)], s)
365
+ row = [c for c in s.calls[-1]["json"]["Data"]["elements"][0]["configs"]
366
+ if c["key"] == "onInputEvents"][0]["value"]["events"][0]["config"]["outputMap"][0]
367
+ assert row["right"]["value"] == f"dm.{NS}.E4.vc-E4"
368
+
369
+
370
+ def test_the_builder_and_the_event_editor_share_one_path_rule():
371
+ """Two places produce these paths. A second copy of the rule would be a rule nothing
372
+ enforces, and the platform accepts a wrong path without any error."""
373
+ from tools.procesio.dto.form import builder
374
+ assert builder._FIELDS_NS is fieldpath.FIELDS_NS
375
+ assert builder._value_key is fieldpath.value_key
376
+ assert builder._VALUE_CONFIG_KEY is fieldpath.VALUE_CONFIG_KEY
@@ -0,0 +1,86 @@
1
+ """form-set-element-event: safe replace (O8).
2
+
3
+ An element commonly carries [RUN_PROCESS, RUN_JAVASCRIPT] on one click trigger.
4
+ --replace-action replaces only one action's events and keeps the rest in order;
5
+ bare --replace wipes everything and must warn."""
6
+ from __future__ import annotations
7
+
8
+ from tools.procesio import main
9
+ from tools.procesio.client import ProcesioClient
10
+ from tools.procesio.tests.conftest import FakeResp, FakeSession
11
+
12
+
13
+ def _builder(session):
14
+ return lambda prof: ProcesioClient(
15
+ profile={"type": "apikey", "key": "N", "value": "V"}, name="t", session=session)
16
+
17
+
18
+ def _form():
19
+ """A button whose click trigger already carries two events (a process run and a
20
+ JS handler), in that order."""
21
+ return {
22
+ "id": "F1", "name": "F", "type": 0, "status": 1, "state": True,
23
+ "data": {"elements": [
24
+ {"id": "btn", "type": "button", "configs": [
25
+ {"key": "name", "value": "btn"},
26
+ {"key": "onClickEvents", "value": {"debounce": 0, "events": [
27
+ {"id": "ev-proc", "type": "onClick", "action": "RUN_PROCESS",
28
+ "config": {"processId": "p"}},
29
+ {"id": "ev-js", "type": "onClick", "action": "RUN_JAVASCRIPT",
30
+ "config": {"code": "old"}},
31
+ ]}},
32
+ ]},
33
+ ]},
34
+ }
35
+
36
+
37
+ def _events_in_put(sess):
38
+ put = sess.calls[-1]
39
+ assert put["method"] == "PUT"
40
+ assert put["url"].endswith("/api/FormTemplate")
41
+ els = put["json"]["Data"]["elements"]
42
+ cfg = next(c for c in els[0]["configs"] if c["key"] == "onClickEvents")
43
+ return cfg["value"]["events"]
44
+
45
+
46
+ def test_replace_action_preserves_other_events_and_order():
47
+ # GET (fetch) then PUT; no concurrency token on the form -> no extra refetch.
48
+ sess = FakeSession(queue=[FakeResp(200, _form()), FakeResp(200, {})])
49
+ main.dispatch(
50
+ "form-set-element-event",
51
+ ["--id", "F1", "--element", "btn", "--on", "click",
52
+ "--action", "RUN_JAVASCRIPT", "--config", '{"code": "new"}',
53
+ "--replace-action", "RUN_JAVASCRIPT"],
54
+ client_builder=_builder(sess))
55
+ events = _events_in_put(sess)
56
+ assert [e["action"] for e in events] == ["RUN_PROCESS", "RUN_JAVASCRIPT"]
57
+ assert events[0]["id"] == "ev-proc" # the process event survived, in place
58
+ assert events[1]["id"] != "ev-js" # the JS event was replaced
59
+
60
+
61
+ def test_bare_replace_warns_when_discarding_multiple():
62
+ sess = FakeSession(queue=[FakeResp(200, _form())])
63
+ out = main.dispatch(
64
+ "form-set-element-event",
65
+ ["--id", "F1", "--element", "btn", "--on", "click",
66
+ "--action", "RUN_JAVASCRIPT", "--config", '{"code": "new"}',
67
+ "--replace", "--dry-run"],
68
+ client_builder=_builder(sess))
69
+ assert out["event_count"] == 1 # everything replaced
70
+ assert "warning" in out
71
+ assert "RUN_PROCESS" in out["warning"] and "--replace-action" in out["warning"]
72
+
73
+
74
+ def test_replace_and_replace_action_are_mutually_exclusive():
75
+ from tools.procesio import errors
76
+ sess = FakeSession(queue=[FakeResp(200, _form())])
77
+ try:
78
+ main.dispatch(
79
+ "form-set-element-event",
80
+ ["--id", "F1", "--element", "btn", "--on", "click",
81
+ "--action", "RUN_JAVASCRIPT", "--config", '{"code": "x"}',
82
+ "--replace", "--replace-action", "RUN_JAVASCRIPT"],
83
+ client_builder=_builder(sess))
84
+ assert False, "expected UsageError"
85
+ except errors.UsageError as e:
86
+ assert "not both" in str(e)
@@ -0,0 +1,92 @@
1
+ """Control events -> element event configs. Event type/key/action values VERIFIED
2
+ 2026-06-25 against ui-builder source (trigger.ts, FieldEvents.component.vue, EventType /
3
+ EventAction enums in model/config/events). Guards the bugs fixed there (open/close=
4
+ SIDE_PANEL_*, step*=STEPPER_*, message*=CHAT_*, form=TRIGGER_FORM not RUN_FORM)."""
5
+ import uuid
6
+
7
+ import pytest
8
+
9
+ from tools.procesio.dto.form import builder
10
+ from tools.procesio.errors import UsageError
11
+
12
+
13
+ def _build(el):
14
+ dto = builder.build({"name": "E", "elements": [el]},
15
+ {"new_id": lambda: str(uuid.uuid4())})
16
+ return dto["Data"]["elements"]
17
+
18
+
19
+ def _event(els, el_type, cfg_key):
20
+ el = next(e for e in els if e["type"] == el_type)
21
+ return next(c for c in el["configs"] if c["key"] == cfg_key)["value"]
22
+
23
+
24
+ def test_click_js_event():
25
+ els = _build({"type": "button", "label": "B",
26
+ "events": [{"on": "click", "do": "js", "code": "x()"}]})
27
+ ev = _event(els, "button", "onClickEvents")
28
+ assert ev["events"][0]["type"] == "CLICK"
29
+ assert ev["events"][0]["action"] == "RUN_JAVASCRIPT"
30
+ assert ev["events"][0]["config"] == {"code": "x()"}
31
+ assert ev["debounce"] == 0
32
+
33
+
34
+ def test_side_panel_open_close_types():
35
+ els = _build({"type": "side-panel", "label": "SP", "events": [
36
+ {"on": "open", "do": "js", "code": "o()"},
37
+ {"on": "close", "do": "js", "code": "c()"}]})
38
+ assert _event(els, "side-panel", "onOpenEvents")["events"][0]["type"] == "SIDE_PANEL_OPEN"
39
+ assert _event(els, "side-panel", "onCloseEvents")["events"][0]["type"] == "SIDE_PANEL_CLOSE"
40
+
41
+
42
+ def test_stepper_step_event_type():
43
+ els = _build({"type": "stepper", "label": "S",
44
+ "events": [{"on": "stepchange", "do": "js", "code": "s()"}]})
45
+ assert _event(els, "stepper", "onStepChangeEvents")["events"][0]["type"] == "STEPPER_STEP_CHANGE"
46
+
47
+
48
+ def test_process_event_shape():
49
+ els = _build({"type": "input", "label": "I", "events": [
50
+ {"on": "input", "do": "process", "processId": "p1", "syncRun": True}]})
51
+ ev = _event(els, "input", "onInputEvents")["events"][0]
52
+ assert ev["type"] == "INPUT" and ev["action"] == "RUN_PROCESS"
53
+ assert ev["config"]["processId"] == "p1" and ev["config"]["syncRun"] is True
54
+ assert "inputMap" in ev["config"] and "outputMap" in ev["config"]
55
+
56
+
57
+ def test_trigger_form_action():
58
+ els = _build({"type": "button", "label": "B",
59
+ "events": [{"on": "click", "do": "form", "formId": "f1"}]})
60
+ ev = _event(els, "button", "onClickEvents")["events"][0]
61
+ assert ev["action"] == "TRIGGER_FORM" # not RUN_FORM
62
+ assert ev["config"]["formId"] == "f1" and "mapping" in ev["config"]
63
+
64
+
65
+ def test_unknown_event_fails_loud():
66
+ with pytest.raises(UsageError):
67
+ _build({"type": "input", "label": "I", "events": [{"on": "nope", "do": "js"}]})
68
+
69
+
70
+ def _value_cfg(els, el_type):
71
+ el = next(e for e in els if e["type"] == el_type)
72
+ return next(c for c in el["configs"] if c["key"] == "value")
73
+
74
+
75
+ def test_multiple_file_upload_value_is_array():
76
+ # a multiple file-upload is array-valued: its value config must default to [] + isList=True
77
+ # (else the form sends a single object and a List<File> process input fails at launch).
78
+ els = _build({"type": "file-upload", "name": "docs", "multiple": True})
79
+ v = _value_cfg(els, "file-upload")
80
+ assert v["value"] == [] and v["isList"] is True
81
+
82
+
83
+ def test_single_file_upload_value_not_array():
84
+ els = _build({"type": "file-upload", "name": "doc"}) # multiple defaults false
85
+ v = _value_cfg(els, "file-upload")
86
+ assert v["value"] != [] and not v.get("isList")
87
+
88
+
89
+ def test_list_control_value_is_array():
90
+ els = _build({"type": "list", "name": "rows"})
91
+ v = _value_cfg(els, "list")
92
+ assert v["value"] == [] and v["isList"] is True