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,600 @@
1
+ # 04 — Interaction recipes
2
+
3
+ Working patterns for the things a professional form actually needs: reading and
4
+ writing values, hiding controls, gating navigation, turning static markup into a
5
+ control, per-field validation, localized messages, feedback. Every snippet here
6
+ runs **inside the runtime payload** described in
7
+ [02-CODE-INJECTION.md](02-CODE-INJECTION.md) and assumes its helpers:
8
+
9
+ ```js
10
+ var D = document;
11
+ function q(s, r) { return (r || D).querySelector(s); }
12
+ function all(s, r) { return Array.prototype.slice.call((r || D).querySelectorAll(s)); }
13
+ ```
14
+
15
+ ---
16
+
17
+ ## 1. Read a field's value
18
+
19
+ ```js
20
+ function isFilled(el) {
21
+ if (q('input[type=checkbox], input[type=radio]', el)) {
22
+ return !!q('input:checked', el);
23
+ }
24
+ var f = q('input, textarea, select', el);
25
+ return !!(f && String(f.value || '').trim());
26
+ }
27
+ ```
28
+
29
+ Checkboxes and radios are checked-state, everything else is `.value`. Always
30
+ `.trim()` — a space is not a value.
31
+
32
+ ## 2. Write a value: **click the control, never set the property**
33
+
34
+ The renderer is Vue-bound. Setting `input.checked = true` or `input.value = 'x'`
35
+ behind Vue's back changes what the user sees and **does not update the form's
36
+ value** — the field looks filled and submits empty. Click the real control:
37
+
38
+ ```js
39
+ function radioFor(kind) {
40
+ var hit = null;
41
+ all('.form-builder--radiobox label').forEach(function (l) {
42
+ if (hit) { return; }
43
+ if (norm(l.textContent).trim() === kind) { hit = l; }
44
+ });
45
+ return hit;
46
+ }
47
+
48
+ var label = radioFor('individual');
49
+ if (label) { label.click(); } // Vue sees this and updates the model
50
+ ```
51
+
52
+ For text inputs, if you genuinely must write programmatically, set the value **and**
53
+ dispatch the events Vue listens for:
54
+
55
+ ```js
56
+ function setText(el, value) {
57
+ var f = q('input, textarea', el);
58
+ if (!f) { return; }
59
+ f.value = value;
60
+ f.dispatchEvent(new Event('input', { bubbles: true }));
61
+ f.dispatchEvent(new Event('change', { bubbles: true }));
62
+ }
63
+ ```
64
+
65
+ Prefer to avoid this entirely. If values come from a process, let the event's
66
+ `outputMap` write them natively — see [06](06-PROCESS-INTEGRATION.md).
67
+
68
+ ### Clearing a radio group
69
+
70
+ A radio cannot be un-clicked. Clear the model where it is reachable, then the DOM:
71
+
72
+ ```js
73
+ function clearChoice() {
74
+ var PF = window.ProcesioForm;
75
+ if (PF && PF.data && PF.data.fields) {
76
+ var f = PF.data.fields;
77
+ for (var k in f) {
78
+ if (norm(k).indexOf('clienttype') > -1 && f[k]) { f[k].value = ''; }
79
+ }
80
+ }
81
+ CHOICES.forEach(function (c) {
82
+ var l = radioFor(c), i = l && q('input', l);
83
+ if (i && i.checked) { i.checked = false; }
84
+ var dot = l && q('.pds-c-radiobox', l);
85
+ if (dot) { dot.classList.remove('pds-c-radiobox--is-checked'); }
86
+ });
87
+ }
88
+ ```
89
+
90
+ **Do not re-dispatch `change` here.** On a Vue-bound group that handler reads the
91
+ option's value and would simply re-select what you just cleared.
92
+
93
+ ## 3. Hide a control — one class, `display: none`
94
+
95
+ ```css
96
+ .ux-gated { display: none !important; }
97
+ ```
98
+
99
+ ```js
100
+ el.classList.toggle('ux-gated', shouldHide);
101
+ ```
102
+
103
+ **`display: none`, not `visibility` or `opacity`.** A control you can still reach
104
+ with Tab but cannot see is a worse bug than a visible one — it traps keyboard users
105
+ in an invisible field. Hide the **whole element wrapper**
106
+ (`b.closest('.form-builder--element')`), not just the inner button, so no empty row
107
+ is left behind.
108
+
109
+ ## 4. Gate a navigation button on a condition
110
+
111
+ Hide the button's host rather than disabling it — a disabled control invites
112
+ clicking; an absent one reads as "not yet".
113
+
114
+ ```js
115
+ function gateNext(ready) {
116
+ var next = q('.ux-nav--next');
117
+ if (!next) { return; }
118
+ var host = next.closest('.form-builder--stepper--buttons--next') || next;
119
+ host.classList.toggle('ux-gated', !ready);
120
+ }
121
+ ```
122
+
123
+ The `|| next` fallback matters: the host wrapper is not guaranteed to exist in
124
+ every renderer version, and falling back to the button itself keeps the behaviour
125
+ correct rather than silently doing nothing.
126
+
127
+ ### Gate the form's own tail buttons on the phase
128
+
129
+ Buttons that belong to a later view (a generated contract, a confirmation screen)
130
+ are often visible on a fresh load because the form's own logic only hides them
131
+ inside a click handler that has never run. Gate them on an observable phase:
132
+
133
+ ```js
134
+ function gateTail() {
135
+ var filling = !!q('.form-builder--stepper'); // stepper on screen = still filling in
136
+ tailButtons().forEach(function (b) {
137
+ var host = b.closest('.form-builder--element') || b;
138
+ host.classList.toggle('ux-gated', filling);
139
+ });
140
+ }
141
+ ```
142
+
143
+ ## 5. Turn static markup into a control (description cards as a selector)
144
+
145
+ The pattern: the radio group is the *real* control but carries no explanation; the
146
+ descriptive cards carry everything and are what people aim at. Make the cards
147
+ clickable, hide the radio group, keep the radio as the source of truth.
148
+
149
+ ```js
150
+ function wireChoiceCards() {
151
+ choiceCards().forEach(function (card) {
152
+ var kind = choiceKind(card.textContent);
153
+
154
+ if (!card.getAttribute('data-ux-choice')) { // idempotent: wire once
155
+ card.setAttribute('data-ux-choice', kind);
156
+ card.setAttribute('role', 'button'); // it is a control now —
157
+ card.setAttribute('tabindex', '0'); // say so, and be reachable
158
+ card.classList.add('ux-choice');
159
+
160
+ var pick = function (e) {
161
+ e.preventDefault();
162
+ if (radioChecked(kind)) { clearChoice(); } // 2nd click deselects
163
+ else { var l = radioFor(kind); if (l) { l.click(); } }
164
+ schedule();
165
+ };
166
+ card.addEventListener('click', pick);
167
+ card.addEventListener('keydown', function (e) {
168
+ if (e.key === 'Enter' || e.key === ' ') { pick(e); }
169
+ });
170
+ }
171
+
172
+ var on = radioChecked(kind); // state read from the RADIO
173
+ card.classList.toggle('ux-choice--on', on);
174
+ card.setAttribute('aria-pressed', on ? 'true' : 'false');
175
+ });
176
+ }
177
+ ```
178
+
179
+ Then hide the raw group: `radioHost.classList.add('ux-gated')`.
180
+
181
+ **The state is always read back from the real control**, never remembered on the
182
+ card. That is what keeps the two in sync when the renderer rebuilds the step.
183
+
184
+ Locating the cards without ids — match on content, and require a discriminator that
185
+ separates the descriptive card from the radio label itself:
186
+
187
+ ```js
188
+ function choiceCards() {
189
+ return all('.form-builder--column .form-builder--element').filter(function (el) {
190
+ if (q('.form-builder--element', el)) { return false; } // leaves only
191
+ var t = norm(el.textContent);
192
+ return !!choiceKind(t) && t.indexOf('i am requesting a contract') > -1;
193
+ });
194
+ }
195
+ ```
196
+
197
+ ## 6. Replace button text with an icon
198
+
199
+ ```js
200
+ var ARROW = {
201
+ next: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" ' +
202
+ 'stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">' +
203
+ '<path d="M5 12h14"/><path d="M12 5l7 7-7 7"/></svg>'
204
+ };
205
+
206
+ function decorateNav() {
207
+ var box = q('.form-builder--stepper--buttons');
208
+ if (!box) { return; }
209
+ all('.pds-c-button', box).forEach(function (btn) {
210
+ if (btn.getAttribute('data-ux-nav')) { return; } // already swapped
211
+ var label = norm(btn.textContent);
212
+ var isPrev = label.indexOf('back') > -1 || btn.classList.contains('pds-c-button--small');
213
+ var isNext = label.indexOf('continue') > -1 ||
214
+ btn.classList.contains('pds-c-button--solid-primary');
215
+ if (!isPrev && !isNext) { return; }
216
+ var kind = isPrev && !isNext ? 'prev' : 'next';
217
+ var name = kind === 'prev' ? 'Back to the previous step' : 'Continue to the next step';
218
+ btn.setAttribute('data-ux-nav', kind);
219
+ btn.classList.add('ux-nav', 'ux-nav--' + kind);
220
+ btn.setAttribute('title', name);
221
+ btn.setAttribute('aria-label', name); // the glyph alone is not a name
222
+ btn.innerHTML = ARROW[kind];
223
+ });
224
+ }
225
+ ```
226
+
227
+ **Identify by text AND by variant class.** Text alone breaks when the form is
228
+ retitled or translated; the class alone breaks when two buttons share a variant.
229
+ Requiring either, and disambiguating when both match, survives both.
230
+
231
+ **`aria-label` is not optional here.** Replacing the only text with a glyph removes
232
+ the button's accessible name; without the label a screen reader announces "button".
233
+
234
+ ## 7. Per-field validation with your own rules
235
+
236
+ The platform validates required/format at its level. Add rules that read as
237
+ *guidance*, in a different colour from the platform's own error so the two never
238
+ compete:
239
+
240
+ ```js
241
+ var RULES = {
242
+ cnp: [/^\d{13}$/, 'The personal number has exactly 13 digits.'],
243
+ ciserie: [/^[A-Za-z]{2}$/, 'The series is exactly 2 letters.'],
244
+ cui: [/^(RO)?\d{2,10}$/i,'The tax code has 2 to 10 digits, with or without RO.'],
245
+ };
246
+
247
+ function validate(el, key) {
248
+ var rule = RULES[key];
249
+ var f = q('input, textarea', el);
250
+ var v = String((f && f.value) || '').trim();
251
+ var bad = !!(rule && v && !rule[0].test(v)); // empty is NOT invalid — that's "required"
252
+ el.classList.toggle('ux-invalid', bad);
253
+
254
+ var msg = q('.ux-rule', el);
255
+ if (bad && !msg) {
256
+ msg = D.createElement('small');
257
+ msg.className = 'ux-rule';
258
+ msg.textContent = rule[1];
259
+ el.appendChild(msg);
260
+ } else if (!bad && msg) {
261
+ msg.parentNode.removeChild(msg);
262
+ }
263
+ return !bad && !!v; // "ok" = present AND well-formed
264
+ }
265
+ ```
266
+
267
+ An empty value is a *required* problem, not a *format* problem — flagging it as
268
+ malformed while the user is still typing is hostile. Note the create/remove pair:
269
+ the function is idempotent, so it can run on every keystroke.
270
+
271
+ ```css
272
+ .ux-invalid .pds-c-input-group--wrapper {
273
+ border-color: #C77700 !important;
274
+ box-shadow: inset 3px 0 0 #C77700 !important; /* amber: present but malformed */
275
+ }
276
+ ```
277
+
278
+ ## 8. Localize the platform's validation copy
279
+
280
+ The control library emits English. Rewrite the messages in place:
281
+
282
+ ```js
283
+ var MSG = [
284
+ [/^\s*this field is required\.?\s*$/i, 'Acest câmp este obligatoriu.'],
285
+ [/^\s*invalid email\.?\s*$/i, 'Adresă de e-mail invalidă.'],
286
+ [/^\s*this field is invalid\.?\s*$/i, 'Valoare invalidă.'],
287
+ ];
288
+
289
+ function localize() {
290
+ all('.pds-c-input-group--message--is-error, [class*="message"][class*="error"]')
291
+ .forEach(function (n) {
292
+ var t = n.textContent;
293
+ for (var i = 0; i < MSG.length; i++) {
294
+ if (MSG[i][0].test(t)) { n.textContent = MSG[i][1]; return; }
295
+ }
296
+ });
297
+ }
298
+ ```
299
+
300
+ **Anchored regexes** (`^…$`), so a message that merely *contains* the English
301
+ phrase is not mangled. Rewriting `textContent` (not `innerHTML`) keeps it safe.
302
+ This runs inside `refresh()`, so a message re-rendered by the platform is
303
+ re-localized on the next pass.
304
+
305
+ ## 9. Per-field helper text
306
+
307
+ ```js
308
+ var HINTS = [
309
+ ['personal number', 'Exactly <b>13 digits</b>, as printed on the ID document.'],
310
+ ['e-mail', 'You will receive the <b>confirmation</b> here.'],
311
+ ];
312
+
313
+ function addHint(el) {
314
+ if (q('.ux-hint', el)) { return; } // idempotent
315
+ var lbl = q('.pds-c-input-group--label', el);
316
+ var text = hintFor(lbl ? lbl.textContent : el.textContent);
317
+ if (!text) { return; }
318
+ var s = D.createElement('small');
319
+ s.className = 'ux-hint';
320
+ s.innerHTML = text; // your own literals — safe
321
+ el.appendChild(s);
322
+ }
323
+ ```
324
+
325
+ `innerHTML` is acceptable **only** because the string is your own literal. Never
326
+ build one from a field value or a process result.
327
+
328
+ ## 10. Completion feedback
329
+
330
+ ```js
331
+ fields().forEach(function (el) { el.classList.toggle('ux-filled', isFilled(el)); });
332
+ ```
333
+
334
+ ```css
335
+ .form-builder--element.ux-filled
336
+ .pds-c-input-group--wrapper:not(.pds-c-input-group--wrapper--is-error) {
337
+ border-color: rgba(64, 153, 32, .45);
338
+ box-shadow: inset 3px 0 0 rgba(64, 153, 32, .5); /* INSET: cannot overhang a column */
339
+ }
340
+ ```
341
+
342
+ Use an **inset** shadow. An outer glow overhangs the column boundary and collides
343
+ with the neighbouring field on a two-column layout.
344
+
345
+ ## 11. A toast the rest of the form can call
346
+
347
+ ```js
348
+ window.UXToast = function (message, kind) {
349
+ var t = D.createElement('div');
350
+ t.className = 'ux-toast' + (kind ? ' ux-toast--' + kind : '');
351
+ t.textContent = message;
352
+ D.body.appendChild(t);
353
+ raf(function () { t.classList.add('ux-toast--in'); }); // next frame: transition runs
354
+ setTimeout(function () {
355
+ t.classList.remove('ux-toast--in');
356
+ setTimeout(function () { if (t.parentNode) { t.parentNode.removeChild(t); } }, 400);
357
+ }, 4200);
358
+ };
359
+ ```
360
+
361
+ The `raf` before adding the class is what makes the entrance animate: a class set
362
+ in the same frame as the insertion produces no transition. Exposing it on `window`
363
+ lets per-element event JS ([01](01-ANATOMY.md) §6) call it too.
364
+
365
+ ## 12. Ripple on any button
366
+
367
+ ```js
368
+ D.addEventListener('pointerdown', function (e) {
369
+ var btn = e.target && e.target.closest && e.target.closest('.pds-c-button');
370
+ if (!btn) { return; }
371
+ var r = btn.getBoundingClientRect();
372
+ var size = Math.max(r.width, r.height);
373
+ var ink = D.createElement('span');
374
+ ink.className = 'ux-ripple';
375
+ ink.style.width = ink.style.height = size + 'px';
376
+ ink.style.left = (e.clientX - r.left - size / 2) + 'px';
377
+ ink.style.top = (e.clientY - r.top - size / 2) + 'px';
378
+ btn.appendChild(ink);
379
+ setTimeout(function () { if (ink.parentNode) { ink.parentNode.removeChild(ink); } }, 620);
380
+ }, true);
381
+ ```
382
+
383
+ One delegated listener covers every button that will ever exist, including ones the
384
+ renderer has not created yet. The button needs `position: relative; overflow: hidden`.
385
+
386
+ ## 13. Drag state on a file dropzone
387
+
388
+ ```js
389
+ ['dragenter', 'dragover'].forEach(function (t) {
390
+ D.addEventListener(t, function (e) {
391
+ var z = e.target && e.target.closest && e.target.closest('.form-builder--file-upload');
392
+ if (z) { z.classList.add('ux-drag'); }
393
+ }, true);
394
+ });
395
+
396
+ ['dragleave', 'drop'].forEach(function (t) {
397
+ D.addEventListener(t, function () {
398
+ all('.form-builder--file-upload.ux-drag').forEach(function (z) {
399
+ z.classList.remove('ux-drag');
400
+ });
401
+ }, true);
402
+ });
403
+ ```
404
+
405
+ The clear pass sweeps **all** zones rather than the event's target: `dragleave`
406
+ fires on children too, and targeted removal leaves zones stuck in the drag state.
407
+
408
+ ## 14. Scroll to the top of the card on a step change
409
+
410
+ ```js
411
+ if (active > -1 && active !== lastStep) {
412
+ if (lastStep > -1) { // not on first paint
413
+ var card = q('.form-builder--form');
414
+ if (card && card.scrollIntoView) {
415
+ card.scrollIntoView({ behavior: 'smooth', block: 'start' });
416
+ }
417
+ }
418
+ lastStep = active;
419
+ }
420
+ ```
421
+
422
+ Guarding on `lastStep > -1` stops the page from scrolling itself on the initial
423
+ render, which reads as the page fighting the user.
424
+
425
+ ## 15. Gate a button whose click runs a chain of events
426
+
427
+ A button's `onClickEvents` is an ordered chain (e.g. `RUN_JAVASCRIPT` →
428
+ `RUN_PROCESS` → `MAP_FORM_DATA` → `RUN_JAVASCRIPT`). A validation placed in the
429
+ first `RUN_JAVASCRIPT` **cannot stop the rest of the chain** — a throw or `return`
430
+ there ends only that block; the process still launches. Two layers:
431
+
432
+ 1. **Capture-phase guard in the runtime** (form-level JS, injected per §4 of
433
+ `02-CODE-INJECTION.md`): `document.addEventListener('click', fn, true)`, match
434
+ the button by `closest('[id="<button-id>"]')`, and on invalid state call
435
+ `preventDefault()` + `stopImmediatePropagation()` + `stopPropagation()`.
436
+ Document capture runs before the Vue handler on the button, so **no** event of
437
+ the chain fires. Expose the rules as one `check()` on `window`.
438
+ 2. **Gate inside the chain's last block** (the one that navigates): re-run the same
439
+ `check()` and `throw` before `nextButton.click()`. This is the fallback when the
440
+ runtime did not load; the rules still live in one place.
441
+
442
+ Same trick for a checkbox that must not be ticked: intercept its click in capture
443
+ phase and `preventDefault()`. Do not rely on `input.disabled` alone — a Vue
444
+ re-render of the row can reset it. To untick a checkbox programmatically, `click()`
445
+ it (setting `.checked = false` does not reach the Vue model).
446
+
447
+ Checkboxes inside a `dynamic-table-row` repeat the same DOM `id` on every row —
448
+ select them with `querySelectorAll('[id="<id>"]')` and read the row's other
449
+ columns from the enclosing row's cells, in `tableColumnsSourceValue` order
450
+ (the cell markup is not yet confirmed on a live render — check it before relying
451
+ on the column index).
452
+
453
+ ## 16. One click from a JS decision to a no-code reaction: the trigger field
454
+
455
+ The common wish: a JS validator decides, and on success the no-code layer locks the
456
+ step's fields, swaps Validate for Modify, reveals the next step and moves to it, all
457
+ from **one** click. The obvious chain (`JS validator` → `MAP_FORM_DATA when
458
+ <flag> EQUALS 1`) does not do that. Verified on a live form, three renderer facts
459
+ decide the design:
460
+
461
+ 1. **An `input`/`number-input` value reaches the form model 500 ms after the DOM
462
+ write** (`Element.component.vue`, `onInputDebounced`). A MAP condition later in
463
+ the same chain reads the value from before the JS ran, so the first click never
464
+ passes. That is why these forms end up with "validate twice, then confirm".
465
+ 2. **A field's own `onInputEvents` chain fires when that value lands**, including
466
+ a value written by JS through the native setter, and its conditions see the
467
+ new value. This is the hand-off point.
468
+ 3. **While a button's chain runs, the whole form is locked** (every element is
469
+ `disabled`), so JS cannot click another form button mid-chain. The stepper's
470
+ own Next/Previous are not form elements and still work.
471
+
472
+ The pattern that follows, measured at about 0.8 s from click to the next step:
473
+
474
+ ```
475
+ Validate click: loader.show → validator (writes flag "1"/"0") → request(flag, branch)
476
+ request(...): if flag is "1": remember a pending request, write the clicked
477
+ button's branch ("person", "company"…) into a hidden text
478
+ input `step-flow-branch`, then increment a hidden number-input
479
+ `step-flow-trigger` (native setter + input/change/blur, branch first)
480
+ trigger onInput: MAP when <flag step N> EQUALS 1 AND step-flow-branch EQUALS <branch>
481
+ → lock step N, Validate hidden, Modify shown, step N+1 visible
482
+ (one MAP per step and branch; only the clicked one matches)
483
+ → JS advance(): only with a pending request: click Next, reset
484
+ scroll, hide the loader
485
+ Modify click: MAP (unconditional): unlock step N, flag N = 0, swap the buttons,
486
+ hide steps N+1…, and reset them (unlock, flags 0, Validate shown)
487
+ ```
488
+
489
+ Rules that keep it safe:
490
+
491
+ - **Only `request()` writes the trigger field.** Do not use the flag fields as
492
+ triggers. A MAP that writes a field fires that field's `onInput` chain
493
+ immediately, with no debounce. The Modify MAP and any reset would then start a
494
+ second chain in parallel, and the two chains' JS blocks share one sandbox iframe.
495
+ - **The trigger always changes** (increment it): a flag still at `1` from an
496
+ earlier pass would not change and would not fire anything.
497
+ - **`advance()` moves on only with a pending request**, and a watchdog (a few
498
+ seconds) hides the loader if the trigger chain never comes.
499
+ - **The button states its branch; never infer it from a Boolean form variable.**
500
+ When a step has variants (person / company, electricity / gas), the Validate
501
+ button that was clicked IS the branch, so it writes it. Measured live, a
502
+ condition on a Boolean form variable is not reliable here:
503
+
504
+ | variable holds | `IS_TRUE` | `IS_FALSE` |
505
+ |---|---|---|
506
+ | the text `"false"` / `"False"` (the designer's default) | **passes** | fails |
507
+ | `null` | fails | passes |
508
+
509
+ Any non-empty text counts as true. Variables that a render process fills later
510
+ still hold that text until the process result lands, and on a form with two
511
+ variants both "IS_TRUE" branches ran: two lock MAPs fought over which Modify
512
+ button to show, and the wrong one then unlocked the other variant's fields.
513
+ `formlint` (every `form-update` / `form-add-element`) and
514
+ `form-set-element-chains` now warn about this condition.
515
+ - **Previous needs no handler.** A MAP-set `disabled`/`visible` survives the
516
+ renderer destroying and rebuilding the step, so a step you come back to is still
517
+ locked and still shows Modify. The stepper's own Next stays available there,
518
+ because the following step is visible.
519
+ - **A hidden step drops out of the stepper**, and Next exists only while a later
520
+ step is visible. Hiding steps N+1… on Modify therefore removes Next until step
521
+ N is validated again.
522
+
523
+ Wire the chains with `form-set-element-chains` (a plan of ordered events per
524
+ element). It keeps the existing validator blocks by id and builds the MAP blocks
525
+ and conditions from element and variable names. Prove the mechanism on a small
526
+ public copy of the flow before touching a live form. [07](07-DEPLOY-WORKFLOW.md) §4
527
+ has the recipe.
528
+
529
+ ## An interactive map (Leaflet) inside a form page
530
+
531
+ A slippy map works in a form page that is drawn by injected code (the installer
532
+ pattern in 02-CODE-INJECTION). Load the library from a CDN at runtime, the same
533
+ way as any other viewer: a `<link>` for `leaflet.css` added to the parent
534
+ document's head, then the script through the runtime's script loader. Nothing
535
+ needs to ship inside the form's own code, which matters because the code budget
536
+ per form is finite.
537
+
538
+ Rules that each cost a debugging round:
539
+
540
+ - **Measure the container before every camera move.** The form host shows the
541
+ page only after its own bootstrap, so a map created during build reads its
542
+ container as 0 x 0. Leaflet caches that size, and the first `flyTo` /
543
+ `flyToBounds` computes the zoom from it: the map lands at maximum zoom
544
+ somewhere in the ocean. Call `map.invalidateSize(false)` at the start of every
545
+ programmatic move, retry later if the size is still 0, and keep a
546
+ `ResizeObserver` on the container that calls `invalidateSize`.
547
+ - **Listen for `moveend` as well as `zoomend`.** An `invalidateSize` that lands
548
+ during a fly animation can stop it without a `zoomend`, so layers that are
549
+ toggled by zoom never appear. Bind the zoom-dependent logic to
550
+ `'zoomend moveend'` and run it once after the map is built.
551
+ - **Do not let the page reset size map tiles.** A rule such as
552
+ `img { max-width: 100% }` scoped to the page root breaks tile layout. Exempt the
553
+ map container: `#root .map img { max-width: none; max-height: none; }`.
554
+ - **Contain the map's stacking.** Leaflet panes use z-index 400 and up, and any
555
+ card positioned over the map needs more. Without a stacking context on the map
556
+ section those layers rise above the page's own modals. Give the section
557
+ `position: relative; z-index: 0; isolation: isolate`.
558
+ - **The page root is the scroller, so keep wheel zoom off until the map is
559
+ clicked** (`scrollWheelZoom: false`, enabled on the first map click), or
560
+ scrolling the page zooms the map instead. On touch devices, disable one-finger
561
+ dragging and drive the map with buttons, or it traps page scrolling.
562
+ - **Keep map objects on the map's own state, not on the data object.** When the
563
+ page renders from a cached copy first and then from fresh data, the fresh object
564
+ replaces the cached one. Markers stored on the old objects (for example
565
+ `amenity.marker`) silently stop updating. Copy the list into the map's own
566
+ state when the map is built.
567
+ - **Free satellite tiles without a key:** Esri World Imagery
568
+ (`server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}`)
569
+ plus the `Reference/World_Boundaries_and_Places` overlay for place names. The
570
+ attribution ("Imagery © Esri, Maxar, Earthstar Geographics") must stay visible.
571
+ - **Page-specific CSS.** When only one page of a multi-page app uses the map,
572
+ ship its stylesheet with that page alone. Concatenate a per-page CSS file at
573
+ build time instead of growing the shared stylesheet that every page carries.
574
+
575
+ ## A static location map (Google Maps embed, no key) in paragraph content
576
+
577
+ For "show where we are" with one pin, an embed is enough. No library is needed.
578
+ Verified 2026-10-22:
579
+
580
+ - **Paragraph HTML cannot carry the `<iframe>`.** The renderer passes paragraph HTML
581
+ through DOMPurify, which drops iframes. Author a placeholder in the paragraph
582
+ (`<div class="x-map" data-map="<query>">` with a plain "open in Google Maps" link
583
+ inside as the fallback) and let the runtime insert the iframe.
584
+ - **Keyless URL:** `https://www.google.com/maps?q=<query>&z=16&hl=<lang>&output=embed`.
585
+ It redirects to `/maps/embed?...`, which sends no `X-Frame-Options` and no
586
+ `frame-ancestors`, so it frames fine. The forms host itself sends no CSP.
587
+ - **What the query decides.** A bare street address can come back with no pin at all.
588
+ "<Business name>, <street and number>, <city>" pins the business listing, labelled
589
+ with its name. In a frame about 260px tall Google leaves out the place card, which
590
+ would otherwise show the public rating; taller frames show it.
591
+ - **Mount it lazily.** Wait until the placeholder is near the screen, and skip it while
592
+ a loader is measuring network progress. Content inside a closed `<details>` still
593
+ reports client rects in Chrome, so check `el.closest('details:not([open])')`, not
594
+ only `getClientRects()`. Re-check on the `toggle` event (listen in the capture phase,
595
+ because it does not bubble).
596
+ - **Fade it in on the iframe's `load` event**, and add the loaded class on a timer as
597
+ well, so a blocked request never leaves a shimmer running forever. The pin sits at the
598
+ frame's centre, so an overlay pulse at `50% 50%` lands on the pin tip.
599
+ - **Directions link:** `https://www.google.com/maps/dir/?api=1&destination=<query>`.
600
+