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,309 @@
1
+ # 02 — How form-level CSS and JavaScript actually run
2
+
3
+ **This is the prerequisite for everything else.** The execution model is not what
4
+ it looks like from the designer, and code written on the wrong assumption appears
5
+ to work on first load and then quietly stops.
6
+
7
+ ---
8
+
9
+ ## 1. Where the code lives
10
+
11
+ `Data.code` is the designer's "Switch to code" editor. It holds one object:
12
+
13
+ ```json
14
+ {"JAVASCRIPT": "…", "CSS": "…"}
15
+ ```
16
+
17
+ stored **AES-encrypted**: CryptoJS `AES.encrypt(text, passphrase)` — i.e. OpenSSL
18
+ AES-256-CBC, key + IV derived by `EVP_BytesToKey(MD5, 1 iteration)`, serialized as
19
+ `base64("Salted__" + salt + ciphertext)`. The passphrase is a **static key, one per
20
+ installation**, stored in the OS credential store per environment
21
+ (`agents-and-tools:procesio:form-code-key@<environment>`, see
22
+ [07](07-DEPLOY-WORKFLOW.md) §3) and never in a file.
23
+
24
+ There is **no plaintext CSS/JS field on the DTO**. The frontend holds `code` as a
25
+ plaintext `{JAVASCRIPT, CSS}` object in memory; the host webapp does the AES step.
26
+ Confirmed with the platform team: no unencrypted path exists.
27
+
28
+ **`{"JAVASCRIPT": null, "CSS": null}` is a normal decrypt result**, not a corrupt
29
+ blob — it is the designer's initial state, so every form that never opened "Switch
30
+ to code" carries it. Normalize `null → ""` before doing anything involving a length
31
+ or a concatenation.
32
+
33
+ ## 2. The CSS - injected as a `<style>`, SCOPED to the form (changed in v3.0.0, 2026-10)
34
+
35
+ The renderer prepends a `<style>` element inside the form root, and since prod
36
+ user-playground v1.115.0 (ui-builder 0.185.0) it **scopes** the CSS first: every
37
+ selector is rewritten to `sel:where([data-form-css-scope=<id>], ...)`, so a rule
38
+ matches only the form root and what is inside it. The earlier rule here (a style
39
+ element is document-scoped, so page-level selectors work) is no longer true.
40
+
41
+ What no longer matches:
42
+
43
+ - rules for `body`, `html`, `:root`, the host page's chrome and the builder;
44
+ - `:root` custom properties, which therefore no longer reach the form. Declare them
45
+ on a selector for an element inside the form instead;
46
+ - tooltips and date-picker popups, which no longer get the form CSS.
47
+
48
+ What changes on the way in:
49
+
50
+ - comments and CSS the scoper cannot parse are dropped, with no error, so when a
51
+ rule seems to do nothing, check that it survived;
52
+ - `@keyframes` and `@font-face` are moved into a layer.
53
+
54
+ What is still global:
55
+
56
+ - a `<style>` inside a paragraph's or heading's HTML;
57
+ - `@import`;
58
+ - JS that injects a `<style>` into `window.parent.document` (the runtime pattern in
59
+ §4 can do this when a rule genuinely has to reach the page).
60
+
61
+ How the rewrite works (verified live): the **last compound** of every selector gets
62
+ `:where([data-form-css-scope="<formId>"], [data-form-css-scope="<formId>"] *)` appended.
63
+ So `.card {}` becomes `.card:where(...)`, `#app *` becomes `#app :where(...)`, `:root {}`
64
+ becomes `:root:where(...)` and `html, body {}` becomes `html:where(...), body:where(...)`.
65
+ `@keyframes`, `@import` and `@media` wrappers survive, and the rules inside `@media` are
66
+ rewritten the same way. The attribute sits on the form-builder elements
67
+ (`.form-builder-view--content` and `.form-builder--form`).
68
+
69
+ **What breaks: UI the JS renders OUTSIDE the form container.** A full-page app, a modal
70
+ or an overlay appended to `document.body` gets no styles at all, and `:root` variables and
71
+ `html` / `body` rules stop applying, because `<html>` and `<body>` are not inside the
72
+ scope. A form whose UI stays inside the form container is not affected.
73
+
74
+ **The fix (verified live on full-page forms):** before mounting, copy the scope id from
75
+ the form container onto `<html>`. Then `:root:where([attr])` matches and every element on
76
+ the page matches `[attr] *`:
77
+
78
+ ```js
79
+ var host = document.querySelector('[data-form-css-scope]');
80
+ if (host && !document.documentElement.hasAttribute('data-form-css-scope'))
81
+ document.documentElement.setAttribute('data-form-css-scope',
82
+ host.getAttribute('data-form-css-scope'));
83
+ ```
84
+
85
+ Run it inside the same "wait until the form's elements exist" loop the code already
86
+ uses: the attribute only appears once the form has rendered. Setting the attribute only
87
+ on your own mounted root is NOT enough when the CSS uses `:root` variables or `html` /
88
+ `body` rules. `form-set-code` warns when the JS mounts on `document.body`, or the CSS
89
+ styles `:root` / `html` / `body`, without propagating the attribute.
90
+
91
+ The scoping broke forms that mount UI outside the container when it shipped, and a revert
92
+ was under discussion at the time of writing (2026-10-21). The fix above is harmless if the
93
+ scoping is reverted, so apply it regardless; drop the lint only once a revert is in prod.
94
+
95
+ ### Global CSS from the first frame: `@import` of a `data:` stylesheet (verified 2026-10-22)
96
+
97
+ The attribute fix needs the JS, which arrives about a second after the form renders, so
98
+ anything it styles outside the container (the topbar, `html` / `body`) shows unstyled for
99
+ that second. An `@import` survives the scoper with its URL untouched, and the imported
100
+ sheet is **not scoped**. So the few rules that must be right from the first frame go in a
101
+ base64 `data:` import at the top of the form CSS:
102
+
103
+ ```css
104
+ @import url("data:text/css;base64,<base64 of: .pds-c-topbar{display:none!important} html,body{background:#…!important}>");
105
+ ```
106
+
107
+ Measured on a public form: the topbar node never rendered visibly, not even for one
108
+ 100 ms sample. Keep that sheet tiny and generate it in a build step from a readable file.
109
+ Have the runtime check a custom property the import sets (`html{--x-critical:1}`) and
110
+ inject the same rules as a `<style>` when it is missing, so the page still recovers if a
111
+ later release starts dropping data imports.
112
+
113
+ The branding class is also filtered: `js/form-builder/css.ts` replaces that
114
+ literal class string with a random number so it cannot be hidden.
115
+
116
+ ## 3. The JavaScript — the part that surprises everyone
117
+
118
+ > Form-level JS is replayed by the renderer as a **synthetic `RUN_JAVASCRIPT`
119
+ > event**, on mount **and on every re-trigger**, inside a **throwaway sandbox
120
+ > iframe whose window is destroyed and rebuilt each time.**
121
+
122
+ Three consequences, and every one of them has bitten:
123
+
124
+ 1. **Nothing survives the run.** Listeners, `MutationObserver`s, timers, module
125
+ state — all die with the iframe. Code that "worked once and then stopped" is
126
+ almost always this.
127
+ 2. **It runs more than once.** Every re-trigger executes the whole file again.
128
+ Un-guarded code installs a second copy of every handler; symptoms are doubled
129
+ toasts, doubled ripples, doubled process launches.
130
+ 3. **The sandbox is not the page.** `document` inside the sandbox is the iframe's
131
+ own. The real form is in `window.parent.document` — the platform confirms this
132
+ itself: the JS slot's shipped boilerplate reads
133
+ `console.log(window.parent.document); -> to access the DOM`.
134
+
135
+ **Sandbox lifetime (v3.0.0, 2026-10).** At most **5** form-fill sandboxes are live at
136
+ once; one is destroyed after **60 s** with no messages; and a run counts as finished
137
+ after a **100 ms** quiet period. So work a run starts and leaves pending (a
138
+ `setTimeout`, a slow `await`) may outlive the run's own lifetime and be lost with
139
+ its sandbox. Finish the run's work promptly, and put anything long-lived in the
140
+ parent-page runtime of §4.
141
+
142
+ ## 4. The pattern that works: installer + runtime
143
+
144
+ Write **two layers**. The file itself is only an *installer*; the real code is a
145
+ function that gets injected once into the parent document, where it keeps its own
146
+ scope and lives as long as the page does.
147
+
148
+ ```js
149
+ function UX_RUNTIME() {
150
+ if (window.__uxFormRuntime) { return; } // guard #2: the payload
151
+ window.__uxFormRuntime = true;
152
+
153
+ /* …everything: listeners, MutationObserver, timers, state… */
154
+ }
155
+
156
+ /* -- installer: put the runtime in the parent page, exactly once ------------ */
157
+ (function () {
158
+ try {
159
+ var W = window.parent && window.parent !== window ? window.parent : window;
160
+ var D = W.document;
161
+ if (!D || !D.body || D.getElementById('ux-runtime')) { return; } // guard #1
162
+ var s = D.createElement('script');
163
+ s.id = 'ux-runtime';
164
+ s.textContent = '(' + UX_RUNTIME.toString() + ')();';
165
+ D.body.appendChild(s);
166
+ } catch (e) {
167
+ // Cross-origin parent, or no parent at all: nothing to install, and the CSS
168
+ // layer still stands on its own.
169
+ }
170
+ })();
171
+ ```
172
+
173
+ Why each piece is exactly this way:
174
+
175
+ - **`fn.toString()`** carries the source across the boundary with no escaping
176
+ problems. Do not build the payload as a string literal — you will fight quoting
177
+ forever and every edit risks a syntax error you cannot see until runtime.
178
+ - **Two guards, not one.** The DOM id guard stops a second `<script>` from being
179
+ appended; the `window.__uxFormRuntime` flag stops a second *execution* if the
180
+ script somehow runs again. They protect different failures.
181
+ - **`window.parent !== window`** — the same file must also work when it is not
182
+ framed (a preview, a local replica). Falling back to `window` keeps one code
183
+ path for both.
184
+ - **The `try/catch` is deliberate.** A cross-origin parent throws on `.document`.
185
+ There is nothing to do about it and nothing to report: the CSS layer still
186
+ works, so the form degrades rather than breaking.
187
+
188
+ ### The runtime is closure-scoped — that is the point
189
+
190
+ Because the payload runs as one IIFE in the parent document, everything it declares
191
+ is private to it. Expose only what other code genuinely needs, on `window`:
192
+
193
+ ```js
194
+ window.UXToast = function (message, kind) { … }; // callable from element-event JS
195
+ ```
196
+
197
+ ## 5. Idempotency is a property of every function you write, not just the installer
198
+
199
+ The runtime installs once, but **inside** it you are reacting to a DOM that the
200
+ renderer rebuilds constantly. Every function that touches the DOM must be safe to
201
+ run a hundred times. The discipline is: **mark what you have already done, on the
202
+ node.**
203
+
204
+ ```js
205
+ function addHint(el) {
206
+ if (q('.ux-hint', el)) { return; } // already has one
207
+ …
208
+ }
209
+
210
+ function decorateNav() {
211
+ all('.pds-c-button', box).forEach(function (btn) {
212
+ if (btn.getAttribute('data-ux-nav')) { return; } // already swapped
213
+ …
214
+ btn.setAttribute('data-ux-nav', kind);
215
+ });
216
+ }
217
+ ```
218
+
219
+ A `data-*` attribute or the presence of your own injected child is the marker. Do
220
+ **not** keep a `Set` of nodes you have processed: the renderer destroys and
221
+ recreates nodes, so your set fills with corpses while the fresh nodes go
222
+ unprocessed.
223
+
224
+ ## 6. The recompute loop
225
+
226
+ Because controls are recreated rather than hidden, there is no useful "on change"
227
+ event for structure. The working model is: **one idempotent `refresh()` that
228
+ recomputes everything from the current DOM, scheduled on a frame, driven by a
229
+ MutationObserver plus the interaction events.**
230
+
231
+ ```js
232
+ var pending = false;
233
+
234
+ function refresh() {
235
+ pending = false;
236
+ /* recompute EVERYTHING from scratch: step position, gating, hints,
237
+ validation, decorations. No incremental state. */
238
+ }
239
+
240
+ function schedule() {
241
+ if (pending) { return; } // coalesce a burst of mutations into one pass
242
+ pending = true;
243
+ raf(refresh);
244
+ }
245
+
246
+ ['input', 'change', 'click'].forEach(function (t) {
247
+ D.addEventListener(t, schedule, true); // capture: nothing can stop it
248
+ });
249
+
250
+ var mo = new MutationObserver(function () { schedule(); });
251
+
252
+ (function start() {
253
+ var host = q('.form-builder--form-body') || D.body;
254
+ if (!host) { return setTimeout(start, 120); } // the runtime may beat the render
255
+ mo.observe(host, { childList: true, subtree: true, characterData: true });
256
+ schedule();
257
+ })();
258
+ ```
259
+
260
+ Points that matter:
261
+
262
+ - **`raf` + a `pending` flag** collapse a storm of mutations into a single pass. A
263
+ step change fires dozens of mutations; without coalescing you run `refresh()`
264
+ dozens of times per frame.
265
+ - **Capture-phase listeners** (`true`) cannot be blocked by a control that stops
266
+ propagation.
267
+ - **The retry loop in `start()`** exists because the runtime can be installed
268
+ before the form body exists.
269
+ - **`refresh()` is total, not incremental.** It never asks "what changed" — it
270
+ recomputes the whole visible state. This is the only model that survives nodes
271
+ being destroyed underneath you.
272
+
273
+ ## 7. Reaching the platform's own model
274
+
275
+ `window.ProcesioForm` exists at runtime and exposes `.data.fields` — a map of field
276
+ state. It is reachable and occasionally the only way to do something (clearing a
277
+ radio group, for instance, since a radio cannot be un-clicked).
278
+
279
+ **It lives in the trigger sandbox, not on the page.** The sandbox builds it and posts every
280
+ write to the parent (`SET_VARIABLE_VALUE`); `typeof window.ProcesioForm` on the parent page
281
+ is `undefined` (measured 2026-10-22). So a runtime installed in the parent per §4 cannot read
282
+ it: derive state from the DOM there (a signature pad's ink, for instance, by sampling its
283
+ canvas pixels), or read it in element-event JS.
284
+
285
+ Treat it as a **last resort, not an API**: it is internal, undocumented, and can
286
+ change. Guard every access:
287
+
288
+ ```js
289
+ var PF = window.ProcesioForm;
290
+ if (PF && PF.data && PF.data.fields) { … }
291
+ ```
292
+
293
+ **Prefer clicking the real control.** The renderer is Vue-bound: setting
294
+ `input.checked` or `input.value` behind its back styles the control without ever
295
+ updating the form's value, so the field looks filled and submits empty. See
296
+ [04-INTERACTION-RECIPES.md](04-INTERACTION-RECIPES.md) §2.
297
+
298
+ ## 8. Two-layer split: what goes in CSS, what goes in JS
299
+
300
+ | Put it in CSS | Put it in JS |
301
+ |---|---|
302
+ | every animation and transition | deciding *when* a class applies |
303
+ | every visual state (`.is-on`, `.ux-gated`, `.ux-invalid`) | adding and removing those classes |
304
+ | responsive rules, reduced-motion | reading values, validating, mapping |
305
+ | anything that must work if the JS fails | anything requiring knowledge of state |
306
+
307
+ The rule: **JS only ever toggles classes; CSS decides what a class looks like.**
308
+ This keeps the form presentable if the runtime fails to install (cross-origin
309
+ parent, script error) and makes every visual change reviewable in one file.
@@ -0,0 +1,370 @@
1
+ # 03 — The runtime DOM: selectors, structure, and what you may rely on
2
+
3
+ The reference you need open while writing CSS or any `querySelector`. Two selector
4
+ families, two very different levels of trust.
5
+
6
+ ---
7
+
8
+ ## 1. The two families
9
+
10
+ ### `.form-builder--*` — the renderer's own classes. **Trustworthy.**
11
+
12
+ They live in this platform's own SCSS, they are stable, and they are the ones to
13
+ build on.
14
+
15
+ | Selector | What it is |
16
+ |---|---|
17
+ | `.form-builder--form` | the card — the outermost form container |
18
+ | `.form-builder--form-body` | the scrolling body inside the card |
19
+ | `.form-builder--element[data-element-id]` | **one control** — the unit you iterate |
20
+ | `.form-builder--columns` / `--column` | layout containers |
21
+ | `.form-builder--stepper` | the stepper as a whole |
22
+ | `.form-builder--stepper--container` | the **active step's content** |
23
+ | `.form-builder--stepper--nav` / `--nav--item` | the platform's own step indicator |
24
+ | `.form-builder--stepper--buttons` | the nav button bar |
25
+ | `.form-builder--stepper--buttons--next` | the next-button host |
26
+ | `.form-builder--input` / `--select` / `--checkbox` / `--radiobox` / `--file-upload` | control wrappers by type |
27
+ | `.form-builder--file-upload--description` | the dropzone's helper line |
28
+ | `.form-builder--button` | a button control |
29
+
30
+ ### `.pds-c-*` — the design system. **Use with care.**
31
+
32
+ These come from the `@procesio/procesio-design-system` npm package, whose internals
33
+ are **not in this repo**. Only the ones the renderer's own SCSS references are safe;
34
+ anything deeper must be verified against a live render before you rely on it.
35
+
36
+ | Selector | What it is |
37
+ |---|---|
38
+ | `.pds-c-input-group--wrapper` | the box around an input |
39
+ | `.pds-c-input-group--wrapper--focused` | focused state (also use `:focus-within`) |
40
+ | `.pds-c-input-group--wrapper--is-error` | platform validation error state |
41
+ | `.pds-c-input-group--label` | **the field's label** — your primary identification handle |
42
+ | `.pds-c-input-group--message--is-error` | the error message node |
43
+ | `.pds-c-input-group--square` | the checkbox square |
44
+ | `.pds-c-radiobox` / `.pds-c-radiobox--is-checked` | radio dot and its checked state |
45
+ | `.pds-c-button` / `.pds-c-button--solid-primary` / `.pds-c-button--small` | buttons and variants |
46
+ | `.pds-c-step--header--circle` `[--active]` | the platform stepper's circles |
47
+ | `.pds-c-step-connector` | the line between them |
48
+ | `.pds-c-modal--dialog--upload-icon` | the upload glyph |
49
+ | `.form-builder--select .multiselect__tags` / `.multiselect__option--selected` | the select is vue-multiselect underneath |
50
+
51
+ ## 2. Structural facts you can build on
52
+
53
+ **A control is `.form-builder--element[data-element-id]`.** Elements nest (a column
54
+ is also an element), so "a leaf control" is:
55
+
56
+ ```js
57
+ function fields() {
58
+ return all('.form-builder--element[data-element-id]').filter(function (el) {
59
+ return q('input, textarea, select', el) && // has a real control…
60
+ !q('.form-builder--element[data-element-id]', el); // …and is a leaf
61
+ });
62
+ }
63
+ ```
64
+
65
+ **The active step's content is `.form-builder--stepper--container`.** Its direct
66
+ element children are the controls of the current step — that is the handle for
67
+ staggered entrances and for the leave/arrive transition:
68
+
69
+ ```css
70
+ .form-builder--stepper--container > .form-builder--element { … }
71
+ ```
72
+
73
+ **Controls are recreated, not hidden** (`v-if`). So:
74
+ - entrance animations re-fire on every step change — free, and desirable;
75
+ - **exit transitions are impossible** — by the time you would animate it out, the
76
+ node is gone. Animate the *container*, not the departing control ([05](05-STEPPER-AND-MOTION.md) §4);
77
+ - never store state on a node; recompute it ([02](02-CODE-INJECTION.md) §6).
78
+
79
+ ## 3. Identify fields by LABEL, not by id
80
+
81
+ Element ids change whenever a control is rebuilt in the designer. Labels are what
82
+ the form actually promises to the person filling it in, and they change only when
83
+ the meaning changes.
84
+
85
+ ```js
86
+ function norm(s) { // fold diacritics + case + whitespace
87
+ return String(s || '').toLowerCase()
88
+ .replace(/[ăâ]/g, 'a').replace(/[îi]/g, 'i').replace(/[șş]/g, 's')
89
+ .replace(/[țţ]/g, 't').replace(/\s+/g, ' ');
90
+ }
91
+
92
+ var LABELS = [
93
+ ['repciserie', 'id doc representative — series'], // ORDER MATTERS:
94
+ ['ciserie', 'id doc — series'], // the longer, more specific
95
+ ['cnp', 'personal number'], // label must be tested FIRST
96
+ ];
97
+
98
+ function fieldKey(el) {
99
+ var lbl = q('.pds-c-input-group--label', el);
100
+ var n = norm(lbl ? lbl.textContent : el.textContent);
101
+ for (var i = 0; i < LABELS.length; i++) {
102
+ if (n.indexOf(LABELS[i][1]) > -1) { return LABELS[i][0]; }
103
+ }
104
+ return null;
105
+ }
106
+ ```
107
+
108
+ **Order the list from most specific to least.** A substring match on a shorter
109
+ label will swallow the longer one — `'id doc — series'` matches inside
110
+ `'id doc representative — series'`, so the representative's field would be keyed
111
+ wrongly if it came second.
112
+
113
+ Normalize diacritics on **both** sides of every comparison. A form written in
114
+ Romanian will otherwise match `ț` against `t` and fail for no visible reason.
115
+
116
+ ## 4. Detect state from TEXT when class matching is unreliable
117
+
118
+ Step wrappers come from the design-system package, and matching them by class has
119
+ already failed once on a live form. Reading the visible text of the step container
120
+ is more robust, because the banner text is the form's own content:
121
+
122
+ ```js
123
+ var STEPS = [
124
+ { label: 'Applicant type', marks: ['who is requesting'] },
125
+ { label: 'Identification', marks: ['identification details'] },
126
+ ];
127
+
128
+ function currentStep() {
129
+ var host = q('.form-builder--stepper--container') || q('.form-builder--form-body');
130
+ if (!host) { return -1; }
131
+ var text = norm(host.innerText || host.textContent);
132
+ for (var i = 0; i < STEPS.length; i++) {
133
+ for (var j = 0; j < STEPS[i].marks.length; j++) {
134
+ if (text.indexOf(STEPS[i].marks[j]) > -1) { return i; }
135
+ }
136
+ }
137
+ return -1; // unknown — see below
138
+ }
139
+ ```
140
+
141
+ **Return a sentinel for "unknown" and honour it.** When the step cannot be
142
+ identified, leave the indicator exactly as it was rather than guessing. Wrong
143
+ information is worse than a stale frame — a progress bar that jumps to 100% because
144
+ the match failed actively misleads.
145
+
146
+ ## 5. CSS traps specific to this renderer
147
+
148
+ ### A hand-built node renders unstyled: the CSS is Vue-SCOPED
149
+
150
+ Every platform-rendered element carries a `data-v-<hash>` attribute, and the rules are
151
+ written as `.pds-c-message[data-v-<hash>] { … }`. A node built with `createElement` has no
152
+ such attribute, so copying the platform's class list is **not** enough — the scoped rules
153
+ never match it. The symptom is a widget that works but looks wrong.
154
+
155
+ Never hardcode the hash; it changes on every frontend rebuild. Clone an existing native
156
+ node of the same kind instead — `cloneNode(true)` carries the scope attributes, the inner
157
+ markup and the theme for free.
158
+
159
+ Worked example, with the inner-structure details and the "exclude your own node from the
160
+ template query" trap:
161
+ [`../dto/form/description.md`](../dto/form/description.md).
162
+
163
+ ### `overflow: hidden` on `.form-builder--form` kills page scrolling
164
+
165
+ The card is the scroll context. Clipping it makes the page unscrollable and the
166
+ lower half of a long form unreachable. If you need something clipped to the card's
167
+ rounded corners, **paint it as a background** — backgrounds are clipped to
168
+ `border-radius` automatically:
169
+
170
+ ```css
171
+ .form-builder--form {
172
+ background-image: linear-gradient(90deg, #1E67D2 0%, #4FA8F5 50%, #1E67D2 100%);
173
+ background-size: 720px 4px;
174
+ background-repeat: repeat-x; /* MUST tile, see below */
175
+ background-position: 0 0;
176
+ }
177
+ ```
178
+
179
+ ### `transform` on `.form-builder--form` breaks the pinned footer
180
+
181
+ A `transform` on an ancestor makes that ancestor the **containing block** for
182
+ `position: fixed` descendants. The renderer's pinned footer then anchors to the
183
+ card instead of the viewport and lands on top of the content. **Entrance animations
184
+ on the card must animate `opacity` only** — never `transform`, `filter`,
185
+ `perspective`, or `will-change: transform`.
186
+
187
+ ### An animated background must tile
188
+
189
+ Animating `background-position` on a `no-repeat` gradient slides it off-screen and
190
+ the element goes blank for the rest of the cycle. Set `repeat-x`, make the gradient
191
+ start and end on the same colour, and travel **exactly one tile per cycle**:
192
+
193
+ ```css
194
+ @keyframes tide { from { background-position: 0 0; } to { background-position: 720px 0; } }
195
+ ```
196
+
197
+ ### Inline styles on the form's own markup beat your stylesheet
198
+
199
+ If the form author wrote `style="border-left: 4px solid #2578E9"` in an HTML
200
+ paragraph, only `!important` can override it:
201
+
202
+ ```css
203
+ .ux-choice--on [style*="border-left"] { border-left-color: #409920 !important; }
204
+ ```
205
+
206
+ The `[style*="…"]` attribute selector is how you target "whatever element carries
207
+ that inline rule" without knowing its structure.
208
+
209
+ ### An `<img>` icon cannot be recoloured with `color`
210
+
211
+ Icon-font-as-image services (iconify and similar) bake the colour into the URL. A
212
+ CSS `filter` only approximates the target colour and tints the whole glyph.
213
+ **Rewrite the URL parameter instead:**
214
+
215
+ ```js
216
+ var want = on ? '%23409920' : '%232578E9';
217
+ var next = icon.getAttribute('src').replace(/color=%23[0-9A-Fa-f]{6}/, 'color=' + want);
218
+ if (next !== icon.getAttribute('src')) { icon.setAttribute('src', next); }
219
+ ```
220
+
221
+ The equality check keeps the attribute write out of the MutationObserver loop when
222
+ nothing changed — otherwise you feed your own observer.
223
+
224
+ ### The card is often taller than the viewport
225
+
226
+ Centring an overlay indicator *inside* the card can park it below the fold. Use
227
+ `position: sticky` on the inner block so it stays on screen wherever the reader is
228
+ scrolled:
229
+
230
+ ```css
231
+ .ux-veil__inner { position: sticky; top: 40vh; }
232
+ ```
233
+
234
+ ### Platform defaults that fight a redesign (measured 2026-10-22)
235
+
236
+ - **The page scrolls in `.form-builder-view--content`**, not in `body` or `main`. Fixed UI
237
+ you mount on `body` sits above it; give that element the top padding a fixed header needs.
238
+ - **`.form-builder--section--container`** carries a 1px border, a light background, a 4px
239
+ radius and 16px padding even when the section's own `style` config sets none. Reset all
240
+ four, or every redesigned section sits inside a faint grey box.
241
+ - **`.form-builder--button` has a fixed height** (the theme's button height, 40px). Make the
242
+ `<button>` taller and anything you append after it overlaps it; set `height: auto` on the
243
+ wrapper. Its `.pds-c-button--dropdown` sibling is an empty split-button part; hide it.
244
+ - **A paragraph's HTML is rendered through DOMPurify into the live page, next to Bootstrap.**
245
+ Generic class names in authored markup collide with Bootstrap rules: an SVG `<circle
246
+ class="badge">` vanished because `.badge:empty { display: none }`. Prefix every class.
247
+
248
+ ### File viewer (INLINE) and signature pad: what is inside
249
+
250
+ - File viewer: `.form-builder--file-viewer` > `--container` > `--container--viewer` (the
251
+ internal scroller, `max-height` around 640px) > `.vue-pdf-embed`, one `<canvas>` per page.
252
+ While a file loads the container shows `--container--loading`; a bad file shows
253
+ `--container--failed`; no `src` yet shows `--container--empty-message`. "Empty" also shows
254
+ briefly while a process-output file is still being fetched, so wait a few seconds before
255
+ you treat it as final. Count rendered pages by counting the canvases.
256
+ - Signature pad: `.form-builder--signature-pad` > `--canvas-wrapper` > `canvas`, then a
257
+ footer with the platform's Clear button. The pad paints a white background into the canvas,
258
+ so ink = any pixel clearly darker than white (sample a downscaled copy after `pointerup`
259
+ and after Clear). A `ResizeObserver` **clears and redraws** the pad whenever the canvas
260
+ size changes, so never animate the canvas or its wrapper's padding; set the size once.
261
+
262
+ ### Table + dynamic-table-row: what is inside (measured on a live form, 2026-10-22)
263
+
264
+ A table with a dynamic row renders TWO `table.pds-c-table`: the Table control's own (header
265
+ only) and, inside its `tbody`, the dynamic row's table, whose `thead` exists but is
266
+ `display: none` (`--no-header`). Each item of the dynamic row is nested:
267
+ `div.form-builder--table-dynamic-row--container--item[data-row-index]` > `td.form-builder--table-static-row`
268
+ > `tr.form-builder--table-static-row--container` > **`tr.pds-c-table--row`** > `td.pds-c-table--cell`.
269
+ Both of those `tr` are **`display: flex`**, so the cells are flex items, not table cells: widths
270
+ set on `td` act as flex-basis and the header table (a real table) does not line up with them on
271
+ its own. Make the header row flex too (`thead.pds-c-table--header > tr { display: flex }`), give
272
+ `th:nth-child(n)` and the row's `td:nth-child(n)` the same `flex: 0 0 <w>`, let one column take
273
+ the rest (`flex: 1 1 auto; min-width: 0`) in both, and give both rows the same 1px border (the
274
+ header's transparent): the label then sits exactly over its column (measured: every left edge
275
+ and width equal to the pixel). Style the ROW as the card (border, radius, background), not the
276
+ cells.
277
+
278
+ - Helper rows `tr.pds-c-table--row.pds-c-table--row--before/--after` also carry
279
+ `pds-c-table--row`: select data rows with
280
+ `tr.pds-c-table--row:not(.pds-c-table--row--before):not(.pds-c-table--row--after)`, as a
281
+ DESCENDANT (they are not children of `tbody`).
282
+ - Every header cell has the id `th<columnKey>` (`thstatus`, `thid`); map a column by that id in
283
+ the ROW's own table (`tr.closest('table')`). Counting `thead th` under the control counts both
284
+ tables. The first column is the index column when `hasIndexColumn` is on.
285
+ - A cell's text sits in `.form-builder--table-cell > … > .form-builder--table-cell--container--text`;
286
+ `.form-builder--table-cell` is a ~54px block. To relabel a cell the renderer owns (translate a
287
+ status, shorten an id), never rewrite the text node (Vue patches it back): put the label in a
288
+ data attribute on the `td`, hide `.form-builder--table-cell` in that `td`, and paint
289
+ `td[data-x]::after { content: attr(data-x) }`.
290
+ - A control placed in a column (the row's button) renders once per row with the SAME
291
+ `data-element-id`; find "this row's button" from the row.
292
+
293
+ ### File-upload used as a download (process output)
294
+
295
+ `.form-builder--file-upload` > `.pds-c-modal--upload` > `.pds-c-modal--dialog--content` > … >
296
+ `.pds-c-modal--dialog--content--action` (`--first` holds the file name, `--actions--icon` is the
297
+ download icon). With no file the same control shows the upload drop zone instead, which invites
298
+ an upload on a read-only screen: hide it with
299
+ `.form-builder--file-upload:not(:has(.pds-c-modal--dialog--content--action))`.
300
+
301
+ **Driving it from your own download menu (measured 2026-10-22).** The download icon is
302
+ `i.pds-c-modal--dialog--content--action--actions--icon[role=button][aria-label="Download file"]`
303
+ (text `download`; an editable control also has a delete icon next to it, so select by the label,
304
+ never by position). Clicking it makes no request: the platform already holds the file it fetched
305
+ after the run ([06](06-PROCESS-INTEGRATION.md) §3c), wraps it in a `Blob` of the real type
306
+ (`application/pdf`, `…wordprocessingml.document`), calls `URL.createObjectURL` and clicks an
307
+ `<a download="<file name>">` on that `blob:` URL. `element.click()` on the icon works while the
308
+ control's host is `display: none`, so the visible UI can be one custom menu per document while
309
+ the file-upload controls stay rendered (`visible: true`, see [01](01-ANATOMY.md)) and unseen. The
310
+ file name for the menu is the text of `.pds-c-modal--dialog--content--action--first`.
311
+
312
+ **Print from the same file.** There is no print action. Arm a short window, click the PDF
313
+ control's icon, keep the `Blob` your `URL.createObjectURL` wrapper sees with a `pdf` type, and in a
314
+ wrapper of `HTMLAnchorElement.prototype.click` cancel that one `blob:` click (the platform may
315
+ revoke its own URL right after, so make a fresh one from the kept Blob). Load it into a hidden
316
+ same-origin `<iframe>` and call `contentWindow.print()` on load. Measured: in Chrome the frame
317
+ loads as `application/pdf` and `print()` opens the dialog with nothing saved. Where
318
+ `navigator.pdfViewerEnabled === false` (PDF viewing turned off, and Playwright's default
319
+ headless shell) the frame does not render the PDF, it DOWNLOADS it under the blob's GUID, so
320
+ skip the frame there and let the normal download run. Safari and Firefox print such a frame
321
+ blank or refuse it: open the PDF in a new tab instead (inside the click, or the pop-up blocker
322
+ stops it).
323
+
324
+ **A menu inside the kit's document card is clipped** by the card's `overflow: hidden` (it is there
325
+ only for the rounded corners). Put the radius on the bar (top) and on the viewer scroller (bottom)
326
+ and let the card overflow, or the open menu is cut at the card's edge on a phone.
327
+
328
+ ## 6. Responsive and reduced motion
329
+
330
+ Side-by-side columns truncate every label on a phone. Cover both layout modes —
331
+ whichever the renderer uses, the other declaration is inert:
332
+
333
+ ```css
334
+ @media (max-width: 760px) {
335
+ .form-builder--columns { flex-wrap: wrap; grid-template-columns: 1fr; }
336
+ .form-builder--column { flex: 1 1 100%; min-width: 0; }
337
+ }
338
+ ```
339
+
340
+ Honour the motion preference. One block covers the whole layer:
341
+
342
+ ```css
343
+ @media (prefers-reduced-motion: reduce) {
344
+ .form-builder--form *, .form-builder--form *::before, .form-builder--form *::after,
345
+ .ux-toast, .ux-veil, .ux-veil__drop span {
346
+ animation-duration: 1ms !important;
347
+ animation-iteration-count: 1 !important;
348
+ transition-duration: 1ms !important;
349
+ }
350
+ }
351
+ ```
352
+
353
+ ## 7. Use the theme's variables, define your own on the card
354
+
355
+ Declare your design tokens on `.form-builder--form` so they cascade to everything
356
+ you write, and derive them from the theme's existing colours rather than inventing
357
+ new ones (a palette is usually a hard requirement on a client form):
358
+
359
+ ```css
360
+ .form-builder--form {
361
+ --ux-ease: cubic-bezier(0.22, 1, 0.36, 1);
362
+ --ux-fast: 160ms; --ux-mid: 300ms; --ux-slow: 520ms;
363
+ --ux-ink: #123E7E; --ux-accent: #2578E9; --ux-line: #D6E2F0;
364
+ --ux-ring: rgba(37, 120, 233, .16);
365
+ }
366
+ ```
367
+
368
+ The platform's own theme variables (`--c-neutral--500`, `--c-primary`, `--h-input`,
369
+ `--p-form`, `--gap-columns`, …) are available and should be preferred wherever one
370
+ exists — they keep your layer consistent with a theme change made in the designer.