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,346 @@
1
+ # Form Template sub-tool
2
+
3
+ Create/edit/publish a PROCESIO **form**. The layout is a tree of controls in
4
+ `Data.elements`. **Proven live (2026-06-24):** the runtime renders from `elements`
5
+ — the encrypted `Data.code` blob is NOT needed (a form with `code:""` rendered
6
+ fine), so forms are fully buildable server-side.
7
+
8
+ ## Config
9
+
10
+ ```json
11
+ {
12
+ "name": "Registration",
13
+ "type": "general",
14
+ "browserTitle": "Register",
15
+ "elements": [
16
+ {"type": "heading", "label": "Registration Form"},
17
+ {"type": "paragraph","label": "<p>Please fill in your details.</p>"},
18
+ {"type": "input", "label": "Full Name", "name": "fullName", "required": true, "placeholder": "John Doe"},
19
+ {"type": "number-input", "label": "Age", "name": "age"},
20
+ {"type": "select", "label": "Country", "name": "country", "options": ["Romania", "USA"]},
21
+ {"type": "radiobox", "label": "Plan", "name": "plan", "options": ["Free", "Pro"]},
22
+ {"type": "checkbox", "label": "Subscribe", "name": "subscribe"},
23
+ {"type": "textarea", "label": "Comments", "name": "comments"},
24
+ {"type": "section", "label": "Group", "children": [ {"type": "input", "label": "Nested"} ]},
25
+ {"type": "button", "label": "Submit", "submit": true}
26
+ ]
27
+ }
28
+ ```
29
+
30
+ - **elements** — each control: `type` + common props (`label`, `name`, `required`,
31
+ `placeholder`, `tooltip`, `readonly`, `visible`, `default`). `options` for
32
+ select/radiobox/dropdown (strings or `{name,value}`). `children` for containers
33
+ (section/columns/column/tabs/tab). `configs` (object) sets any raw config key.
34
+ - **control types** (from harvested goldens): heading, paragraph, input, textarea,
35
+ number-input, datetime-input, select, dropdown, radiobox, checkbox, button,
36
+ divider, section, columns, column, tabs, tab, table, image, file-upload,
37
+ file-viewer, icon, list, approval, … (see `dto/form/elements/`).
38
+ - **type** — `general` (1) or `usertask` (0). When omitted, a form whose controls carry an
39
+ assignee or approver (or that has an `assignee` control) is built as `usertask`, like the
40
+ designer saves it; otherwise `general`. **publish** — Status PUBLISHED(1)/DRAFT(0).
41
+ - **data model** — the builder writes the same form data model the designer writes for a NEW
42
+ form: top-level `instance, flow, fields, preventFormSubmit, browserTitle` and
43
+ `dataModelAttributeFormatVersion: "1"` (field attributes named exactly as the element name).
44
+ Captured from a designer save on QA, 2026-09-25.
45
+
46
+ ## Events, triggers, tasks, themes (Phase 2)
47
+
48
+ - **events** — per control: `"events":[{"on":"click","do":"js","code":"alert(1)"}]`.
49
+ `on` ∈ click/input/change/focus/blur/hover/ready/open/close/tabchange/rowadded/
50
+ rowdeleted/paginated/stepchange/nextstep/previousstep/beforeapprove/afterapprove/
51
+ beforereject/afterreject/beforeapprovalsubmit/afterapprovalsubmit/messagesfetch/
52
+ messagesent (each fires on a control that has that slot; type/key verified vs
53
+ ui-builder trigger.ts + EventType enum).
54
+ `do` ∈ **map** (`mapping:[{to,value|from}]`), **process** (`processId,syncRun,
55
+ inputs:[{to,from}],outputs`), **js** (`code`), **form** → EventAction.TRIGGER_FORM
56
+ (`formId`,`mapping`).
57
+ - **tasks/assignees** — `assignee`/`assigneeReplacement` on section/tabs/table;
58
+ `approver`/`approverReplacement` on the `approval` control. The form's top-level
59
+ **`Assignees`** list is what the designer shows as the task routing: rows
60
+ `{StepId, OrderId, Type, Users:[{UserId}]}`, `StepId` = the element id (or a dynamic table
61
+ row's approval-step id), `Type 1` = assignee, `Type 2` = approver. It is DERIVED from those
62
+ configs the way the designer's save does (`builder.derive_assignees`): one ASSIGNEE step per
63
+ control with assignee users, then one APPROVER step per approval control and per visible
64
+ dynamic-row approval step, `OrderId` 1, 2, 3… within each list, users as `{userId}` (the
65
+ platform adds the names). `form-create` / `form-edit` write it; `form-add-element`,
66
+ `form-delete-element` and `form-set-element-config` re-derive it when the change touches who
67
+ works or approves a step, and report the before/after. A config-level `assignees` list still
68
+ wins verbatim. Checked against 19 designer-saved forms on QA (2026-10-05): identical lists.
69
+ (Until 2026-10-05 the builder left the list empty and the workaround was to PUT the GET echo
70
+ with `Assignees` added; that is no longer needed.)
71
+ - **theme** — `"theme":{"--c-primary":"#0039e3","--p-form":"24px"}` overrides the
72
+ form theme variables (colors, fonts, spacing, per-control styling). ~190 vars in 18
73
+ groups (see `data_shell.json` / `docs_info/form-theme.ts`).
74
+ - **form CSS / JavaScript** — the designer's "Switch to code" editor:
75
+ `"css":"...", "javascript":"..."` (or `"code":{"css","javascript"}`). Encrypted into
76
+ `Data.code` (CryptoJS AES; key in Credential Manager, one per environment:
77
+ `procesio/form-code-key@<environment>`). Empty →
78
+ `code:""`. See `code_cipher.py` + `FORM-STYLING-NOTES.md`.
79
+ - **per-component style** — on any field/container control:
80
+ `"style":{"--h-input":"50px","--c-input-background":"--c-neutral--50"}`. Only the
81
+ control's CSS-group vars are valid (input/number/datetime/textarea/select → Input group);
82
+ color vars take a theme color variable, not a hex. Stored as enabled CSSProperty[] in the
83
+ element's `style` config.
84
+ - **all properties** — any control config is settable via the named convenience
85
+ keys (label, placeholder, required, options, src, width, …) or the raw `configs`
86
+ passthrough; containers nest via `children` (built FLAT with `parentId`, the
87
+ structure PROCESIO renders).
88
+ - **table** — `{"type":"table","label":"Items","columns":[{"key":"product","label":"Product","cell":{"type":"input"}},{"key":"qty","label":"Qty","cell":{"type":"number-input"}}]}`
89
+ builds the table + a row + the cell controls (wired via `childrenIdPerColumn`).
90
+ Also `section`/`columns`(+`column`)/`tabs`(+`tab`) containers with `children`.
91
+
92
+ ## Submit / status messages (`Data.messages`, verified live 2026-09-30)
93
+
94
+ The screen shown after submit comes from `Data.messages`, a list of
95
+ `{type, title, text, customizable}` seeded from `data_shell.json` in ENGLISH
96
+ (`SUBMIT_SUCCESS` = "Your message has been sent. Thank you for filling out our form!").
97
+ Types: SUBMIT_SUCCESS, SUBMIT_FOR_APPROVAL_SUCCESS, APPROVE_SUCCESS, REJECT_SUCCESS,
98
+ SUBMIT_FAILED, FILES_UPLOAD_FAILED, NOT_FOUND, NOT_ALLOWED, NOT_AUTHORIZED
99
+ (`ui-builder-main/src/js/model/index.ts`). For a non-English form, localize at least
100
+ SUBMIT_SUCCESS and SUBMIT_FAILED: `form-get`, edit the entries, then
101
+ `form-update --data-file` with `{"messages":[...the FULL list...]}` (send the whole list).
102
+
103
+ **Readable public URL.** Besides `forms.procesio.app/{tinyUrl}`, a form's CustomUrl slug is
104
+ served at `forms.procesio.app/{masterSlug}/{workspaceSlug}/{formSlug}`; read the two parent
105
+ slugs with `get-customurl-workspace-master` and `get-customurl-workspace`.
106
+
107
+ ## Form JavaScript: fields are keyed LOWERCASE (critical, 2026-07-27)
108
+
109
+ > **Cause found (2026-09-25, confirmed 2026-10-05).** The re-key below comes from the data
110
+ > model's `dataModelAttributeFormatVersion`. The designer reads a form with no version as the
111
+ > legacy format `"0"` (user-playground `Builder.component.vue`), and under `"0"` its save
112
+ > renames every field attribute to camelCase-of-lowercase (`Form.model.ts::
113
+ > generateFormDataModel`; measured: `RequestText` → `requesttext`, and the 2026-10-01
114
+ > measurements below). Under `"1"` it keeps the name as written. Designer-made forms carry
115
+ > `"1"`; this builder wrote no version until 2026-10-05, which is why API-built forms were
116
+ > re-keyed on their first designer save. **It now writes `"1"`**: measured on QA 2026-10-05,
117
+ > `orderList`, `order_id` and `Customer_First_Name` survived a designer re-publish and form JS
118
+ > read them as written. So `formlint.lint_field_names` warns only for a form WITHOUT the
119
+ > version. Forms already saved as `"0"` keep their re-keyed names, so the case-insensitive
120
+ > lookup below is still the safe way to read fields in a script that may run on such a form.
121
+
122
+ **`ProcesioForm.data.fields` keys are the field name LOWERCASED** (and a UI save re-derives them). JS is case-sensitive, so a camelCase reference like `ProcesioForm.data.fields.locuiesteDetalii` (or `.zonaFormular`, `.actProprietate`) is `undefined` — the event fires but silently does NOTHING (this cost days on Uranus 100: a UI save lowercased the keys and every camelCase visibility/hide/file-wrap toggle broke, while the config still looked perfect). **ALWAYS reference form fields case-insensitively** in any control/FORM_LOAD RUN_JAVASCRIPT. Prelude, then use `fld(name)`:
123
+
124
+ **Corrected 2026-10-01, measured: a designer save re-keys the fields.** A form built through
125
+ the API (`form-create`) keeps its names exactly as written. One save and Publish in the
126
+ designer changed them: a camelCase name came back all lowercase, and a snake_case one came
127
+ back camelCase (`orderList` to `orderlist`, `order_id` to `orderId`). Both fit one rule: split the name on underscores, lowercase the parts, join
128
+ them in camelCase. A name with no separator therefore comes out all lowercase, which is
129
+ what the note above saw. (Two names measured; hyphens and spaces were not tested.) So the
130
+ trap springs late, the first time anyone saves an API-built form in the designer, and a
131
+ lowercase snake_case name is not safe either. Only a single lowercase word survives
132
+ unchanged. Read everything else through a lookup that ignores case AND separators, as
133
+ below. The same save also adds a select's `sourceType` and `sourceValue` to the data
134
+ model. `form-create` left them out until 2026-10-01 and now writes them for a static
135
+ option list (`todo/procesio-form-create-select-source-in-data-model.md`). When a config gives no `name`, the builder now derives a single lowercase word from the label (`Company Name` becomes `companyname`), so an auto-named field survives a designer save unchanged; an explicit name is kept verbatim, and `form-create` / `form-edit` return a `warnings` entry when a name is not a single lowercase word. (Since 2026-10-05 the builder writes `dataModelAttributeFormatVersion: "1"`, under which a designer save keeps names as written, so that warning now fires only for a form without the version; see the note at the top of this section.)
136
+
137
+ ```js
138
+ var F=ProcesioForm.data.fields;var _fl={};for(var _k in F){_fl[_k.toLowerCase().replace(/[_-]/g,'')]=F[_k];}
139
+ function fld(n){return _fl[String(n).toLowerCase().replace(/[_-]/g,'')];}
140
+ var x=fld("locuiesteDetalii"); if(x){ x.visible=need; x.required=need; }
141
+ ```
142
+
143
+ Applies to EVERY field reference: visibility toggles, submit-button hide/show, file-value wrapping, reading another field’s `.value`, etc. (`f.locuieste` only “works” because it has no uppercase letter to lose.)
144
+
145
+ ## Control wiring cookbook (verified live 2026-06-29)
146
+
147
+ - **image** — `src` must be a LIVE url (a 404 shows the alt text as broken "brand"). Use
148
+ `{"type":"image","src":"https://…","alt":"…","width":200}`.
149
+ - **dropdown** — it is an action MENU, not a value field. Populate via
150
+ `configs:{items:[{id:<guid>,icon:"content_copy",label:"Duplicate",type:"BUTTON"},{type:"DIVIDER"}]}`.
151
+ - **file-viewer** — `src` is `URL_OR_FILE` → accepts a plain URL. Preview a doc with
152
+ `{"type":"file-viewer","src":"https://…/x.pdf","configs":{"viewerType":"INLINE","allowedFileTypes":["pdf"],"viewerHeadline":"…"}}`.
153
+ Empty src renders "Field source not set".
154
+ - **multiple file-upload / array-valued controls** — a `file-upload` (or `select`) with `multiple:true`, plus `list`/`table`/`dynamic-table-row`, are ARRAY-valued: the builder types their `value` config **`isList:true` + default `[]`** (helper `_value_is_list`) AND the DM `value` attribute `isList:true`. REQUIRED — else the runtime emits a SINGLE object for one uploaded file and a `List<File>` process input fails AT LAUNCH: `Error generating fileId … item is not an array: StartObject` (statusCode 373). Confirmed by Liza; locked by `test_form_events.py`.
155
+ - **conditional field visibility (show/hide one field based on another's value)** — verified live
156
+ 2026-07-24 (confirmed by Liza). A `RUN_JAVASCRIPT` **INPUT** event on the trigger control that
157
+ toggles the target field's `.visible` AND `.required` together. TWO things that MUST be right,
158
+ or it silently fails:
159
+ 1. **The target field must start REGISTERED.** Set the field `visible:true` in the config so
160
+ PROCESIO instantiates it, then hide it on load with a **form-level `FORM_LOAD`
161
+ `RUN_JAVASCRIPT`** (`ProcesioForm.data.fields.<field>.visible=false; …required=false;`). A
162
+ field that starts `visible:false` is NEVER instantiated → `ProcesioForm.data.fields.<field>`
163
+ is `undefined` → the toggle throws `Cannot set properties of undefined (setting 'visible')`
164
+ and the field can never appear. (This is the whole bug — NOT that hiding "destroys" the
165
+ element; a registered field toggles both ways fine.)
166
+ 2. **A radio/select `.value` is a plain STRING** (the selected option's text, e.g.
167
+ `"Nu, e închiriat…"`), NOT an object — compare it directly, no `typeof v==='object'` /
168
+ `v.value` / `v.label` handling.
169
+ Event code: `var f=ProcesioForm.data.fields; var v=(f.locuieste.value||''); var need=(v.indexOf('Nu')===0); var x=f.locuiesteDetalii; if(x){x.visible=need; x.required=need;}`.
170
+ Guard the read (`var x=…; if(x){…}`). Toggling `.required` with `.visible` keeps a hidden field
171
+ from blocking submit. NOTE: PROCESIO's `rules-visibility` config ("Visibility:" panel) is NOT a
172
+ field-condition rule — it's only user-access (`all`/`task-assignees`/`custom`); use the JS event
173
+ above for value-driven visibility.
174
+ - **chart** — types `bar`/`line`/`combo`/`pie` (+ flags `donut`/`stacked`/`horizontal`/`smooth`).
175
+ Data via `configs`: `categoriesSourceType:"JSON"` + `categoriesSourceValue` = a JSON STRING of
176
+ labels; `seriesSourceType:"JSON"` + `seriesSourceValue` = a JSON STRING. Cartesian series =
177
+ `[{name,data:[..],type?,smooth?,yAxisIndex?}]` (combo sets per-series `type`+`yAxisIndex` for
178
+ dual-axis); pie/donut series = flat `[{name,value}]`. `colors` is a JSON-string array. Canonical
179
+ examples: `docs_info/Exports/charts.procesio`.
180
+ - **side-panel** — set `configs:{buttonText:"…",sidePanelTitle:"…"}`; its `children` render a
181
+ full mini-form inside the slide-over. AVOID `select`/`dropdown` inside a side-panel: their
182
+ pop-up overlay mis-positions and offsets the panel layout (the panel is a fixed/transformed
183
+ container). Use `radiobox`/`checkbox`/`input` (inline) for choices in a side panel.
184
+ - **chat (reply via a process)** — verified live 2026-06-29. The chat renders from its `value`
185
+ array (`Chat.component.vue`: `messages = JSON.stringify(attrs.value)`); a static mount `value`
186
+ does NOT render, but a reactive value-write does. Wire the reply on **`messagesent`**:
187
+ `events:[{"on":"messagesent","do":"process","processId":…,"syncRun":true,"inputs":[{"to":"history","from":"<chatName>"}],"outputs":[{"to":"<chatName>","from":"<msgsVar>"}]}]`.
188
+ On send the chat appends the user message to `value` then fires the event, so `history`
189
+ (<- chat value) already includes it; the process returns the FULL updated array -> written back
190
+ to chat value -> re-renders. The chat value attr is auto-typed json+isList (builder `_VALUE_LIST`).
191
+ Produce the array with a **Node** action (`return msgs;` -> bind `List Result` = a clean array;
192
+ JS `setOutput` wraps `{result}` and won't map cleanly — see process `description.md` Scripting).
193
+ Message schema (team-confirmed): required `_id, content, senderId, roomId, timestamp`(string).
194
+ A bot reply's **`senderId` = `"procesio"`** (baked-in bot user → renders on the other side; user
195
+ messages use the live currentUserId); **`roomId` MUST equal `rooms[0].roomId`** or it's filtered
196
+ out → "No messages"; **do NOT set a `date` field** (it created empty date-separator badges — use
197
+ `timestamp`). The component creates USER messages with `timestamp:""` (empty), so user bubbles
198
+ show no time — since the process returns the whole list, **backfill any empty `timestamp`** (e.g.
199
+ `for (m of msgs) if(!m.timestamp) m.timestamp="HH:MM"`) before returning. **Local time:** the Node
200
+ action runs server-side in UTC, so a raw `new Date()` shows SERVER time, not the user's. Pass the
201
+ browser UTC offset into the process and compute local time: a hidden `input` field set by form JS
202
+ (`-new Date().getTimezoneOffset()` minutes), added to the chat's RUN_PROCESS `inputs` (e.g.
203
+ `{to:"tzOffset", from:"tzoffset"}`), then in Node `const d=new Date(Date.now()+off*60000)` and read
204
+ `d.getUTCHours()/getUTCMinutes()` (correct regardless of server TZ). Optional: `username,
205
+ date, system, avatar, seen`. `onMessagesFetch` fires ONCE on
206
+ mount to load history; `onMessageSent` → process returns the ENTIRE list. Wire the reply on
207
+ `messagesent` only (reusing the reply process on `messagesfetch` stuck the chat on "loading" in
208
+ testing). Set `configs:{userId, rooms:[{roomId,roomName,users}]}`.
209
+ - **CSS stacking gotcha:** never put `animation`/`transform`/`opacity<1`/`filter` on the
210
+ control wrapper `.form-builder--element` — each becomes its own stacking context that traps
211
+ a select/dropdown overlay (the `.multiselect__content-wrapper`, z-index 50) UNDER the later
212
+ sibling controls (it renders transparent / behind, e.g. behind a button). Verify overlay
213
+ stacking with `document.elementFromPoint` (web tool `eval` step).
214
+ - **interactive widgets (5-star rating, char counter, live greeting)** — done in form-level
215
+ JavaScript, NOT a control. The JS runs inside `iframe.trigger-sandbox`, so the form doc is
216
+ `window.parent.document`; build into a control wrapper by id (e.g. `#starIcon`) and keep it
217
+ alive with a small `setInterval` (tabs render lazily). DON'T force a font on `#app *` — it
218
+ turns Material-Icons ligatures (info/close) into literal text; scope fonts to text elements.
219
+ - **The `trigger-sandbox` iframe is TRANSIENT — never leave a listener or timer inside it
220
+ (proven live 2026-08-05).** Form-level JS is executed by injecting it into an
221
+ `iframe.trigger-sandbox` whose `srcdoc` the platform rewrites per run, and the iframe is
222
+ REMOVED from the DOM afterwards. Removing an iframe destroys its JS realm, so every
223
+ `addEventListener` and `setInterval` registered from that code dies with it — while any DOM
224
+ node the code created in the parent document REMAINS. The failure is therefore silent and
225
+ deeply misleading: the widget renders correctly at form load, then freezes at whatever value it
226
+ last showed, with no console error and the node still on screen. It looks like "the widget
227
+ broke on <some user action>" when in truth the action merely coincided with the teardown.
228
+ Confirmed by a controlled A/B: an interval registered inside a transient iframe advanced 0
229
+ ticks after removal, while one injected into the parent kept ticking.
230
+ **The fix — hoist the code into the parent realm.** From the sandbox, append a `<script>` to
231
+ `window.parent.document` whose body is the widget, so the closure, its listeners and its timer
232
+ all belong to the parent window, which outlives the sandbox:
233
+ ```js
234
+ var D = window.parent.document;
235
+ if (D.getElementById("my-widget")) return; // idempotent: the sandbox may re-run
236
+ function widget() { /* runs in the parent; `document` IS the form document */ }
237
+ var s = D.createElement("script");
238
+ s.id = "my-widget";
239
+ s.textContent = "(" + widget.toString() + ")();";
240
+ D.body.appendChild(s);
241
+ ```
242
+ Use `Function.prototype.toString()` rather than a hand-escaped string literal — the widget stays
243
+ readable and there is no quote-escaping to get wrong. Give the injected `<script>` a stable `id`
244
+ and bail out when it already exists, or a sandbox re-run installs a second copy with a second
245
+ interval. Anything that must merely RUN ONCE at load (seeding a value, a one-shot toggle) is
246
+ fine directly in the sandbox; only continuous behaviour needs hoisting.
247
+ The installer pattern itself — parent realm, stable id guard, `fn.toString()` — is
248
+ documented in full in [`../../FORM-DEV-GUIDE/02-CODE-INJECTION.md`](../../FORM-DEV-GUIDE/02-CODE-INJECTION.md)
249
+ sections 3 and 4. What this entry adds is the controlled A/B that MEASURES the
250
+ teardown: 0 ticks after removal inside the sandbox, versus an interval injected into
251
+ the parent that kept running.
252
+ - **The form UI is styled with Vue SCOPED CSS — a hand-built node renders UNSTYLED (2026-08-05).**
253
+ Every platform-rendered element carries a `data-v-<hash>` attribute and the stylesheet is written
254
+ as `.pds-c-message[data-v-<hash>] { display:flex; … }`. A node built with `createElement` has no
255
+ such attribute, so the scoped rules never match it: copying the platform's class list alone is
256
+ NOT enough. The symptom is a widget that works but looks wrong — in the observed case the message
257
+ container fell back to `display:block`, stacking the icon above the text instead of beside it,
258
+ while the identical-looking native node next to it was `flex`. **Never hardcode the hash** (it
259
+ changes on every frontend rebuild). Instead **clone an existing native node of the same kind**
260
+ and overwrite its text — `cloneNode(true)` carries the scope attributes, the exact inner markup
261
+ and the theme, for free:
262
+ ```js
263
+ var tpl = document.querySelector(".pds-c-message-info:not(.my-widget)");
264
+ var node = tpl ? tpl.cloneNode(true) : buildFallback(); // fallback: also set inline display:flex
265
+ node.classList.add("my-widget");
266
+ ```
267
+ Exclude your own node from the template query or the second render clones the clone. Also mirror
268
+ the native inner structure when hand-building: the icon is a `<div class="pds-c-message--icon">`
269
+ WRAPPING an `<i class="material-icons …">`, and the text is a `<div class="pds-c-message--text">`
270
+ — not `<i>`/`<span>` carrying those classes directly.
271
+ **Prefer avoiding the whole problem:** when a control has a config that renders the node natively
272
+ (e.g. a non-empty `info-text`), set it in the designer and have the widget merely rewrite that
273
+ node's text. Two forms that differ only by such a config will otherwise diverge visually while
274
+ running byte-identical JS — which reads as "the same script broke on the other form".
275
+ - **`info-text` is NOT writable from `ProcesioForm.data.fields` (verified live 2026-08-05).**
276
+ The runtime renders it from the element's STATIC config array
277
+ (`Element.component.vue`: `v-if="getConfigValueByKey(element.configs,'info-text')"`), not from
278
+ the reactive field-value object. The field object exposes only `value`, `visible`, `required`,
279
+ `readonly` — so `…fields.<name>.infoText = …` is a silent no-op, and there is no
280
+ `setConfigValue`-style API exposed to form JS. Two consequences: (a) drive any live text
281
+ (character counters, running totals, remaining-quota hints) by writing the **DOM node**, not a
282
+ config; (b) when `info-text` is EMPTY the message component is never rendered at all (`v-if` on
283
+ a truthy value), so there is no node to write into — either set a non-empty `info-text` in the
284
+ designer so the platform renders `.pds-c-message-info`, or create that node yourself. A robust
285
+ widget does both: reuse `host.querySelector('.pds-c-message-info')` if present, else append a
286
+ node carrying the platform's own classes
287
+ (`pds-c-message pds-c-message-info pds-c-message-small pds-c-message-ghost pds-u-m--t--8`)
288
+ so it inherits the theme. **The control's DOM `id` equals its `name` config** and sits on the
289
+ `.pds-c-input-group` wrapper, not on the `<input>`/`<textarea>` — so `getElementById(<name>)`
290
+ then `.querySelector('textarea')` is the reliable way in, and renaming the field breaks the
291
+ selector. Bind updates with a capturing `input` listener filtered to that element (cheap: it
292
+ only acts on the one field) plus a small `setInterval` for lazy/re-rendered containers; guard
293
+ the write with an `if (node.textContent !== next)` so the interval costs nothing when idle.
294
+ A DOM-injected node survives the element's normal re-renders (validation state changes), but it
295
+ is invisible to the designer — it lives only in the form JS.
296
+ - **form JS that handles dropdown/menu item clicks** — use ONE document click listener (clicks
297
+ aren't continuous → no layout thrash/flicker; never a document-wide `input` listener or
298
+ `setInterval` poll). **CRITICAL gotcha (verified 2026-06-29):** to detect WHICH menu item was
299
+ clicked, do NOT substring-match `textContent` up the ancestor chain — an ancestor holds the
300
+ WHOLE menu, so every label (incl. "Clear form") is present and a click ANYWHERE outside the open
301
+ dropdown fires the first-matched action (this CLEARED the form on outside-click). Match only an
302
+ element whose own text contains **exactly one** known label (a single item); ignore any node
303
+ holding >1 (the menu container / page wrapper). Framework inputs are controlled — clear/set via
304
+ the native value setter + `input`+`change` events (`HTMLInputElement.prototype` value setter),
305
+ not `el.value=`. Verify by reproducing: set fields, open the menu, click OUTSIDE → fields must be
306
+ UNCHANGED; then click the real item → it acts.
307
+ - **responsive table (no horizontal scroll)** — default cell inputs are ~fixed-width and the table
308
+ is `table-layout:auto`, so >3 columns overflow. Force fluid equal columns:
309
+ `#app .pds-c-table{width:100%!important;table-layout:fixed}`, `th,td{min-width:0!important;overflow:hidden}`,
310
+ `.pds-c-input-group--field/--wrapper{width:100%!important;min-width:0!important}`,
311
+ `[class*=table][class*=scroll], .form-builder--table{overflow-x:visible!important}`.
312
+
313
+ ## API contract (verified live 2026-06-24)
314
+
315
+ - **Create:** `POST /api/FormTemplate` (`FormTemplateDto`) — client supplies `Id`, returns it.
316
+ - **Get:** `GET /api/FormTemplate/{id}`. **Edit:** `PUT /api/FormTemplate`. **Delete:** `DELETE /api/FormTemplate/{id}`.
317
+ - **Publish:** `Status=1` + `State=true` on the body (or `PATCH /api/FormTemplate/{id}?state=true`).
318
+ - **Public vs private:** DTO field `IsPrivate` (config key `isPrivate`, default false; designer
319
+ "Make form public" toggle = `!isPrivate`). **`isPrivate:false` is necessary but NOT sufficient:**
320
+ a form that **contains an approval control** — or has assignees/approvers — can ONLY be private;
321
+ the platform disables the toggle and keeps it private regardless of the config value (the
322
+ presence of the approval control, not a configured approver, triggers this). To truly make a form
323
+ public, remove any approval control / assignees / approvers. Verify the actual toggle state in
324
+ the designer, not just the DTO field.
325
+ - **Render:** create a CustomUrl — `POST /api/CustomUrl/FormTemplate {Type:3, EntityType:1, EntityId, Url}`
326
+ → `tinyUrl`; open **`https://forms.procesio.app/{tinyUrl}`**. (A bare `/forms/{id}`
327
+ has no workspace context and 404s — the CustomUrl carries the workspace.)
328
+ - **Query-param pre-fill (VALIDATED live, undocumented by PROCESIO):** the public form
329
+ reads URL query parameters and pre-fills any control whose **binding `name`** equals
330
+ the query key. Open `…/{tinyUrl}?<controlName>=<value>` and the control renders with
331
+ that value. Verified 2026-07-22: a form with controls `name:"cod"` + `name:"apartament"`
332
+ opened at `?cod=TEST123&apartament=27` rendered both inputs pre-filled. The match is on
333
+ the control's config `name` (the field/binding name), NOT the DOM `id`/`name` (which are
334
+ empty on the rendered `<input>`). Use this to seed a form from a link (e.g. a per-record
335
+ token). Unmatched params are ignored.
336
+ **Also works on a PRIVATE form** (one with an approval control) opened by a signed-in user: measured
337
+ 2026-10, six `?name=value` params pre-filled their inputs with no console or network errors. Use it
338
+ to hand an approver a link that carries the record's data when the triggering action cannot.
339
+
340
+ ## How it builds (template-merge)
341
+
342
+ Each control clones a captured golden element (`dto/form/elements/<type>.json`) so
343
+ every config field stays valid; the builder assigns fresh ids, pins a clean
344
+ `section`/`parentId` (golden elements were harvested from arbitrary containers),
345
+ forces `visible:true`, resets `required`/placeholders, and overrides the semantic
346
+ configs. theme/messages/dataModel/variables come from `data_shell.json`.
@@ -0,0 +1,259 @@
1
+ {
2
+ "id": "dc5057d1-7bac-5f57-b464-57089ffa4a36",
3
+ "category": "fields",
4
+ "type": "approval",
5
+ "configs": [
6
+ {
7
+ "id": "09f55d0d-e541-5f56-892f-18c0931f5ec3",
8
+ "key": "label",
9
+ "label": "Label",
10
+ "placeholder": "Add label here",
11
+ "category": "content",
12
+ "subCategory": "general",
13
+ "type": "input",
14
+ "value": "Approval step",
15
+ "exposed": true
16
+ },
17
+ {
18
+ "id": "a38f2e9f-cbe1-5c48-ba9d-6229558ddee7",
19
+ "key": "tooltip",
20
+ "label": "Tooltip",
21
+ "placeholder": "Add tooltip here",
22
+ "tooltip": "Tooltip can only be displayed with Label",
23
+ "category": "content",
24
+ "subCategory": "general",
25
+ "type": "input",
26
+ "value": "",
27
+ "exposed": true
28
+ },
29
+ {
30
+ "id": "7e5c5930-1c7d-54d5-8314-ab28390a9e1c",
31
+ "key": "description",
32
+ "label": "Description",
33
+ "placeholder": "Add text here",
34
+ "category": "content",
35
+ "subCategory": "general",
36
+ "type": "input",
37
+ "value": "Please review this submission and approve/reject.",
38
+ "exposed": true
39
+ },
40
+ {
41
+ "id": "a25cc026-4324-512c-9f16-81773fa820dc",
42
+ "key": "info-text",
43
+ "label": "Info text",
44
+ "placeholder": "Add info text here",
45
+ "category": "content",
46
+ "subCategory": "general",
47
+ "type": "input",
48
+ "value": "",
49
+ "exposed": true
50
+ },
51
+ {
52
+ "id": "1701612b-4ee5-5a15-a17e-ee414514c2c1",
53
+ "key": "visible",
54
+ "label": "Visible",
55
+ "category": "content",
56
+ "subCategory": "general",
57
+ "type": "toggle",
58
+ "value": true,
59
+ "exposed": true
60
+ },
61
+ {
62
+ "id": "59e20081-ac77-5378-9a83-ad3099302807",
63
+ "key": "comment",
64
+ "label": "Comment",
65
+ "placeholder": "",
66
+ "category": "content",
67
+ "subCategory": "general",
68
+ "type": "hidden",
69
+ "value": "",
70
+ "exposed": true
71
+ },
72
+ {
73
+ "id": "e32a20e7-5e43-50df-95e3-6b21a10ab948",
74
+ "key": "responseDate",
75
+ "label": "Response date",
76
+ "placeholder": "",
77
+ "category": "content",
78
+ "subCategory": "general",
79
+ "type": "hidden",
80
+ "value": null,
81
+ "exposed": true
82
+ },
83
+ {
84
+ "id": "c3038a05-34b7-5232-8f41-f09f18b8d99b",
85
+ "key": "responseUser",
86
+ "label": "Response user",
87
+ "placeholder": "",
88
+ "category": "content",
89
+ "subCategory": "general",
90
+ "type": "hidden",
91
+ "value": null,
92
+ "exposed": true
93
+ },
94
+ {
95
+ "id": "b9a25636-e5cd-57f9-9bf6-c4100369a34a",
96
+ "key": "response",
97
+ "label": "Response",
98
+ "placeholder": "",
99
+ "category": "content",
100
+ "subCategory": "general",
101
+ "type": "hidden",
102
+ "value": null,
103
+ "exposed": true
104
+ },
105
+ {
106
+ "id": "70a2a842-0f88-5396-85cc-e632f265ada7",
107
+ "key": "name",
108
+ "label": "Name",
109
+ "category": "content",
110
+ "subCategory": "general",
111
+ "type": "copyable-input",
112
+ "value": "Approval",
113
+ "hasTopDivider": true,
114
+ "exposed": true,
115
+ "events": [
116
+ "EMIT_ELEMENTS_UPDATE"
117
+ ]
118
+ },
119
+ {
120
+ "id": "c321b7b1-1f06-5adc-8bf4-0515020392ff",
121
+ "key": "id",
122
+ "label": "ID",
123
+ "placeholder": "Add ID here",
124
+ "category": "content",
125
+ "subCategory": "general",
126
+ "type": "copyable-input",
127
+ "value": "approval",
128
+ "exposed": true
129
+ },
130
+ {
131
+ "id": "e2c20d67-d165-57cc-b234-b9edccee8c32",
132
+ "key": "approver",
133
+ "label": "Approver",
134
+ "placeholder": "Select name",
135
+ "category": "content",
136
+ "subCategory": "approvals",
137
+ "type": "user-select",
138
+ "value": ""
139
+ },
140
+ {
141
+ "id": "1092181b-d9bc-55c5-8614-a49350321c8c",
142
+ "key": "approverReplacement",
143
+ "label": "Approver replacement",
144
+ "category": "content",
145
+ "subCategory": "approvals",
146
+ "type": "approver-replacement",
147
+ "value": null
148
+ },
149
+ {
150
+ "id": "83a53e18-ff68-524c-bb53-905c74792658",
151
+ "key": "additionalApprovers",
152
+ "label": "",
153
+ "category": "content",
154
+ "subCategory": "task-assignee",
155
+ "type": "hidden",
156
+ "value": []
157
+ },
158
+ {
159
+ "id": "1e45aa83-3f52-5fd0-903a-5b74c226af2d",
160
+ "key": "commentRequiredOnApprove",
161
+ "label": "Is comment required on approve",
162
+ "category": "content",
163
+ "subCategory": "validation",
164
+ "type": "required-comment",
165
+ "value": false,
166
+ "exposed": true
167
+ },
168
+ {
169
+ "id": "8c015e51-ef4d-5679-8c17-6d5a1159509f",
170
+ "key": "commentRequiredOnReject",
171
+ "label": "Is comment required on reject",
172
+ "category": "content",
173
+ "subCategory": "validation",
174
+ "type": "hidden",
175
+ "value": false,
176
+ "exposed": true
177
+ },
178
+ {
179
+ "id": "6f2c9b03-c4ae-548c-a5e2-141fe1ff3268",
180
+ "key": "onInputEvents",
181
+ "label": "onInput",
182
+ "category": "content",
183
+ "subCategory": "events",
184
+ "type": "field-events",
185
+ "value": null
186
+ },
187
+ {
188
+ "id": "9e30bc34-e3dd-5ba2-9a1b-d20a7321fb9e",
189
+ "key": "onBeforeApproveEvents",
190
+ "label": "onBeforeApprove",
191
+ "tooltip": "Triggered once Approve button is clicked but before the form is submitted",
192
+ "category": "content",
193
+ "subCategory": "events",
194
+ "type": "field-events",
195
+ "value": null
196
+ },
197
+ {
198
+ "id": "08142bb8-6e86-52fa-91fc-75921e8aa04e",
199
+ "key": "onBeforeRejectEvents",
200
+ "label": "onBeforeReject",
201
+ "tooltip": "Triggered once Reject button is clicked but before the form is submitted",
202
+ "category": "content",
203
+ "subCategory": "events",
204
+ "type": "field-events",
205
+ "value": null
206
+ },
207
+ {
208
+ "id": "06444609-2c4d-5210-b49e-92389213381e",
209
+ "key": "onBeforeApprovalSubmitEvents",
210
+ "label": "onBeforeSubmit",
211
+ "tooltip": "Triggered once any Approval's button is clicked but before the form is submitted",
212
+ "category": "content",
213
+ "subCategory": "events",
214
+ "type": "field-events",
215
+ "value": null
216
+ },
217
+ {
218
+ "id": "fef86e40-fc6c-520c-bd07-6aaab9345173",
219
+ "key": "onAfterApproveEvents",
220
+ "label": "onAfterApprove",
221
+ "tooltip": "Triggered once Approve button is clicked but after the form is submitted",
222
+ "category": "content",
223
+ "subCategory": "events",
224
+ "type": "field-events",
225
+ "value": null
226
+ },
227
+ {
228
+ "id": "772caf56-471e-5c4f-97c0-83da94299e23",
229
+ "key": "onAfterRejectEvents",
230
+ "label": "onAfterReject",
231
+ "tooltip": "Triggered once Reject button is clicked but after the form is submitted",
232
+ "category": "content",
233
+ "subCategory": "events",
234
+ "type": "field-events",
235
+ "value": null
236
+ },
237
+ {
238
+ "id": "2339b4a5-d535-5d8c-9fdd-a2cef89031d7",
239
+ "key": "onAfterApprovalSubmitEvents",
240
+ "label": "onAfterSubmit",
241
+ "tooltip": "Triggered once any Approval's button is clicked but after the form is submitted",
242
+ "category": "content",
243
+ "subCategory": "events",
244
+ "type": "field-events",
245
+ "value": null
246
+ },
247
+ {
248
+ "id": "56060b99-bbd1-54a7-ad23-1ec50d184bfa",
249
+ "key": "style",
250
+ "label": "Style",
251
+ "category": "styling",
252
+ "subCategory": "general",
253
+ "type": "hidden",
254
+ "value": []
255
+ }
256
+ ],
257
+ "parentId": null,
258
+ "section": "body"
259
+ }