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,347 @@
1
+ # 06 — Wiring a form control to a process
2
+
3
+ How a control triggers a PROCESIO process, how data goes in, how results come back
4
+ into fields, and the design rule that saves a day of debugging: **one process
5
+ output variable per form field.**
6
+
7
+ ---
8
+
9
+ ## 1. The event
10
+
11
+ A `RUN_PROCESS` event on a control's trigger ([01](01-ANATOMY.md) §6):
12
+
13
+ ```json
14
+ {
15
+ "id": "<guid>",
16
+ "type": "INPUT",
17
+ "action": "RUN_PROCESS",
18
+ "config": {
19
+ "processId": "<process guid>",
20
+ "syncRun": true,
21
+ "inputMap": [ … ],
22
+ "outputMap": [ … ]
23
+ }
24
+ }
25
+ ```
26
+
27
+ **`syncRun: true` holds the line open** until the process finishes — verified live
28
+ across a multi-second external API call. With `syncRun: false` the form fires and
29
+ forgets, so an `outputMap` can never populate anything.
30
+
31
+ **One event per trigger.** Two `RUN_PROCESS` events on the same trigger launch the
32
+ process twice; the second result overwrites the first and the timing is not
33
+ deterministic. When rewiring, use `--replace` rather than appending.
34
+
35
+ ## 2. The map rows — the shape that took three attempts to get right
36
+
37
+ ```json
38
+ {
39
+ "id": 0,
40
+ "left": {"value": "<PROCESS VARIABLE GUID>", "isList": false, "path": {}},
41
+ "right": {"value": "<form value path>", "isList": false, "path": null}
42
+ }
43
+ ```
44
+
45
+ Four rules, each learned the hard way:
46
+
47
+ 1. **The process-variable GUID goes on the LEFT** — in `inputMap` *and* in
48
+ `outputMap`. A variable *name* on the left is accepted by the API, but the
49
+ designer then renders raw guids and the launch 400s.
50
+ 2. **Each side is an OBJECT, not a bare string.** Bare strings are accepted by the
51
+ API and produce a row the designer cannot render.
52
+ 3. **The two sides differ**: the process side carries `path: {}`, the form side
53
+ `path: null`. Discovered by reading a mapping the designer itself had written.
54
+ 4. **`path` carries the attribute chain** when a model-typed variable is mapped one
55
+ attribute at a time. Rebuilding a row without carrying `path` over silently maps
56
+ the whole object into a single text field — the classic `[object Object]`
57
+ in every field.
58
+
59
+ The form side's value is the full field path from [01](01-ANATOMY.md) §5:
60
+
61
+ ```
62
+ {dmRootId}.{FIELDS_NS}.{elementId}.{valueConfigId}
63
+ ```
64
+
65
+ with `FIELDS_NS = 11223344-5566-7788-99aa-aabbccddeeff` (constant on every form).
66
+
67
+ ## 3. Wire it with the tool, not by hand
68
+
69
+ `form-set-element-event` does a surgical read-modify-write: it touches **only** that
70
+ element's event config, resolves variable names to guids, and fails loudly *before
71
+ writing anything* if a name is unknown.
72
+
73
+ ```bash
74
+ python scripts/run-tool.py procesio form-set-element-event \
75
+ --id <form-id> --element <element-name-or-id> \
76
+ --on input --action RUN_PROCESS --replace \
77
+ --config-file event.json --dry-run
78
+ ```
79
+
80
+ Drop `--dry-run` to write. Inspect what is currently wired with:
81
+
82
+ ```bash
83
+ python scripts/run-tool.py procesio form-get-element-events --id <form-id> --element <name>
84
+ ```
85
+
86
+ Because it resolves names, `event.json` can be written readably:
87
+
88
+ ```json
89
+ {"processId": "<guid>",
90
+ "inputMap": [{"left": "input_file", "right": "<form value path>"}],
91
+ "outputMap": [{"left": "o_first_name", "right": "<form value path>"}]}
92
+ ```
93
+
94
+ It also defaults `syncRun` to `true`, so you cannot forget it.
95
+
96
+ ## 3b. Driving a RUN_PROCESS from script: wait out the debounce (measured 2026-10-17)
97
+
98
+ When a custom UI writes a control's value from script (native value setter + `input`
99
+ event) and then clicks the control's RUN_PROCESS button with `element.click()`, the
100
+ process receives the value the field had BEFORE the write unless the script waits first.
101
+ Measured on a public form: a 300 ms wait, with or without a blur, sent the stale value;
102
+ 600, 800 and 1000 ms sent the new one every time. A finer run put the threshold at the form's
103
+ ~500 ms debounce: at 100, 250 and 400 ms 18 of 18 launches got the old value, at 500 and 650 ms
104
+ 11 of 11 got the new one. So write, wait about 560 ms, then click.
105
+ Serialise these calls (one queue), or two writes interleave and each click sends the other's
106
+ value. The click works on a button that is off screen. A process round trip from click to
107
+ the output landing in the field took 0.7 to 1.0 s for a small Node-only flow. It is two
108
+ sequential requests: `POST /api/formProcess/{formId}/{processId}/publish` (creates the instance,
109
+ ~300-470 ms) then `POST /api/formProcess/{formId}/{instanceId}/launch?runSynchronous=true`
110
+ (~670-800 ms for ~260 ms of execution), so roughly 1.1-1.2 s per call whatever the flow does. A
111
+ Node action costs ~56-85 ms of execution each and a Query Store ~16 ms: keep form-facing flows to
112
+ few Nodes (pass one JSON value into SQL and unpack it with `JSON_EXTRACT` rather than one Node
113
+ per column). For a live
114
+ "N results" count while the visitor is still choosing, filter a cached copy in the browser
115
+ and keep the process for the authoritative search and the logging.
116
+
117
+ ## 3c. The wire, request by request (measured on the forms host, 2026-10-22)
118
+
119
+ What a RUN_PROCESS sends, for a runtime that has to follow one run among several:
120
+
121
+ | request | carries |
122
+ |---|---|
123
+ | `POST /api/formProcess/{formId}/{processId}/publish`, body = the input values | answers the process VARIABLE list (inputs echoed as `defaultValue`), **no instance id** |
124
+ | `POST /api/formProcess/{formId}/{instanceId}/launch?runSynchronous=true\|false&secondsTimeOut=300`, body `{"flowTemplateId": processId, "connectionId": …}` | the instance id is minted by the CLIENT and sits in the URL; the answer is `{"instanceId"}`, plus `status` + `variable` (outputs) when synchronous |
125
+ | `GET /api/formProcess/{formId}/{processId}/{instanceId}/variables` (async only, polled) | `{"id", "status", "variables": [{name, defaultValue = the value, …}]}`, final at status 50 (finished) or 40 (finished with errors) |
126
+
127
+ So tie a run to its process by the launch request BODY (`flowTemplateId`) and read the instance
128
+ id from the launch URL; `/variables` carries both ids. A required process input whose form side
129
+ is empty is refused at publish: `HTTP 400 statusCode 373 "Missing required input for variables:
130
+ <name>"`, nothing launches.
131
+
132
+ A File output mapped to a control is fetched ONCE, right after the run, by
133
+ `GET /api/formProcess/download` with no query string: the file is named by request HEADERS
134
+ (`flowtemplateid`, `formtemplateid`, `instanceid`, `variableid`, `workspaceid`, `uploadfilepath` =
135
+ `flow/flow-<processId>/flow-instance-<instanceId>/variable-<variableId>/<fileId>`), cookie auth,
136
+ answer = the bytes with `content-disposition: attachment; filename=…`. A File output that is empty
137
+ still triggers the call with `uploadfilepath: undefined` and gets a 400; harmless, but it shows in
138
+ the console.
139
+
140
+ **A synchronous step keeps the form locked for its whole run.** While a chain runs every button is
141
+ `disabled` ([08](08-PITFALLS.md)); with `syncRun: true` that lasts until the process ends (measured:
142
+ a hidden RUN_PROCESS button stayed `disabled` for the 33 s a document-generating process took, and
143
+ came back the moment it answered). With `syncRun: false` the chain ends at launch, so a hidden poll
144
+ button can run while the async process is still going. A runtime that clicks a hidden button after
145
+ a sync step must wait for `button.disabled === false`, not for a timer.
146
+
147
+ **A list loaded at FORM_LOAD goes stale while the page stays open** (a signer signs, a status
148
+ moves on). To refresh it without a page reload, put the same RUN_PROCESS on a hidden button whose
149
+ output map writes the dynamic row again; the table re-renders from the new value and the selected
150
+ detail stays where it is. Controls set by the chain that OPENED a record (MAPs on its status) do
151
+ not follow the new row by themselves: reopen the record, or tell the user it moved on.
152
+
153
+ **Testing a form runtime without running anything (measured 2026-10-22).** Route
154
+ `**/formProcess/**/launch*` in Playwright, pick the run by the request body's `flowTemplateId`, and
155
+ fulfill it with `{"instanceId": "<any guid>", "status": 50, "variable": {<output name>: <value>},
156
+ "error": []}`. The form maps that answer exactly like a real synchronous one: outputs land in
157
+ their fields and variables, `visible` outputs show their controls, and the chain's MAP conditions
158
+ then run on the faked values. Nothing launches on the server (the publish before it only
159
+ registers the inputs). This is how to rehearse states the test data no longer has; File outputs
160
+ left out simply leave their viewers empty.
161
+
162
+ ## 4. Design rule: **one output variable per field, all primitives**
163
+
164
+ The tempting design is one structured output variable (a data model, or a JSON blob)
165
+ mapped attribute-by-attribute into the fields. Do not. The attribute-path shape on
166
+ the form side of a map row is typed `left: any` in the renderer, so it is **not
167
+ derivable** — you would be guessing, and a wrong guess writes `[object Object]`
168
+ into every field with no error anywhere.
169
+
170
+ The design that works:
171
+
172
+ ```
173
+ File → Base64 → Decisional (branch by applicant type)
174
+ ├── Call API (branch A) → Node: parse → structured result
175
+ └── Call API (branch B) → Node: parse → structured result
176
+ ↓
177
+ Join
178
+ ↓
179
+ one small "splitter" Node per field, each returning a plain string
180
+ ↓
181
+ o_first_name, o_last_name, o_tax_code, … (string outputs)
182
+ ```
183
+
184
+ Each splitter is three lines:
185
+
186
+ ```js
187
+ const o = <%0%>; // the structured result
188
+ return (o && o.field_name != null) ? String(o.field_name) : '';
189
+ ```
190
+
191
+ Then `outputMap` is a flat list of **primitive → field** rows. No paths, nothing to
192
+ guess, and every row is independently debuggable. The extra dozen Node actions cost
193
+ nothing at runtime and buy a wiring you can reason about.
194
+
195
+ **Do not add a hidden "carrier" field to the form** to receive the blob and then
196
+ distribute it in JavaScript. It puts a second copy of the data in the DOM, it needs
197
+ its own gating so it never shows, and the outputMap already populates fields
198
+ natively — which is also the honest completion signal (§6).
199
+
200
+ ## 5. Notes on the process side
201
+
202
+ - **A file input's variable is `FileDataModel`**, not a primitive type. `file` is
203
+ not a type.
204
+ - **`Call API v3` is superseded** — use `Call API`, with `Response Status`,
205
+ `Response Body`, and `Time Out`. The framework's `process-create` refuses
206
+ superseded actions outright.
207
+ - **A `Node` action's `Timeout` must be 60–300.** `30` is rejected by the validation
208
+ gate. `Node` returns its value raw; a `Javascript` action wraps it as
209
+ `{result: v}` — a difference that silently changes every downstream reference.
210
+ - **`Decisional` is a diamond** and fans out any number of branches; they do not
211
+ have to re-converge, but a `Join` is the explicit merge point when they should.
212
+ - Parse defensively at the boundary and return a *diagnosable* object rather than
213
+ throwing:
214
+
215
+ ```js
216
+ const r = <%0%>;
217
+ try {
218
+ const a = r.choices[0].message.tool_calls[0].function.arguments;
219
+ return (typeof a === 'string') ? JSON.parse(a) : a;
220
+ } catch (e) {
221
+ return ({ warning_status: true,
222
+ warning_message: 'Could not read the extraction service response.',
223
+ _err: String(e && e.message) });
224
+ }
225
+ ```
226
+
227
+ A thrown error inside a Node stops the flow and tells the form nothing. A returned
228
+ warning object flows on and can be surfaced to the user.
229
+
230
+ - Carry a **`warning_status` / `warning_message` pair** through to the form. When an
231
+ external model returns mostly nulls (a partially legible document), that is an
232
+ *extraction quality* result, not a wiring failure — and the two are indistinguishable
233
+ from the form unless the process says which it was.
234
+
235
+ ## 6. The form side: detect arrival from the fields themselves
236
+
237
+ ```js
238
+ /* The extraction is done when the platform has written into the fields — the
239
+ outputMap populates them natively, so there is no carrier to read. Detecting the
240
+ values themselves is also the honest signal: it is true exactly when there is
241
+ something worth showing. */
242
+ function extractionArrived() {
243
+ var found = false;
244
+ fields().forEach(function (el) {
245
+ if (found) { return; }
246
+ if (!fieldKey(el)) { return; }
247
+ var f = q('input, textarea', el);
248
+ if (f && String(f.value || '').trim()) { found = true; }
249
+ });
250
+ return found;
251
+ }
252
+ ```
253
+
254
+ ## 7. The full pattern: upload → veil → reveal only what applies
255
+
256
+ ```js
257
+ /* 1. The upload starts the work: raise a HELD veil (the network is silent, so the
258
+ quiet-timer heuristic would lift it immediately). */
259
+ D.addEventListener('change', function (e) {
260
+ var input = e.target;
261
+ if (!input || input.type !== 'file' || !input.files || !input.files.length) { return; }
262
+ if (!input.closest || !input.closest('.form-builder--file-upload')) { return; }
263
+ if (currentStep() !== IDENTITY_STEP) { return; } // other steps just collect documents
264
+ window.__uxExtracting = true;
265
+ showVeil('Reading the document…', true);
266
+ }, true);
267
+
268
+ /* 2. Every refresh pass decides what the step shows. */
269
+ function identityStep(active) {
270
+ if (active !== IDENTITY_STEP) { return; }
271
+ var arrived = extractionArrived();
272
+
273
+ if (arrived && window.__uxExtracting) { // 3. dismiss the held veil
274
+ window.__uxExtracting = false;
275
+ hideVeil();
276
+ }
277
+
278
+ var ready = true;
279
+ fields().forEach(function (el) {
280
+ if (q('input[type=file]', el) || el.querySelector('.form-builder--file-upload')) {
281
+ return; // the upload always stays
282
+ }
283
+ var key = fieldKey(el);
284
+ if (!key) { return; }
285
+
286
+ var group = FIELD_GROUP[key]; // 'a' | 'b' | undefined
287
+ var mine = !group || group === currentApplicantKind();
288
+
289
+ // Hidden until the document has been read, and then only the half that
290
+ // belongs to the chosen applicant type.
291
+ el.classList.toggle('ux-gated', !arrived || !mine);
292
+ if (!arrived) { ready = false; return; }
293
+ if (!mine) { return; }
294
+
295
+ var ok = validate(el, key);
296
+ if (el.offsetParent !== null && !ok) { ready = false; } // only VISIBLE fields gate
297
+ });
298
+
299
+ gateNext(ready); // 4. → appears only when complete
300
+ }
301
+ ```
302
+
303
+ Three details that matter:
304
+
305
+ - **`el.offsetParent !== null`** is the real "is this visible" test. Counting a
306
+ hidden field against readiness makes the next button unreachable forever, with no
307
+ visible cause.
308
+ - **`FIELD_GROUP` decides visibility here as well** as in the form's own logic. The
309
+ form's logic keys off its own state and runs on its own schedule; deciding here
310
+ too means the step never shows the wrong half, not even for the frame between the
311
+ results landing and that logic running.
312
+ - **The upload is exempt from every gate.** It is the only thing on the step before
313
+ the results arrive, and it must stay reachable afterwards so a wrong document can
314
+ be replaced.
315
+
316
+ ## 8. Offer a manual escape
317
+
318
+ Extraction from a photographed document fails sometimes. When the veil's ceiling
319
+ fires, say so and let the person continue by hand — a form that can only be
320
+ completed when a model cooperates is not a form.
321
+
322
+ ```js
323
+ window.UXToast('This is taking longer than usual. You can fill the fields in manually.', 'err');
324
+ ```
325
+
326
+ ## Data store from a form (not an element - an event action)
327
+
328
+ A form talks to a data store through an **event action**, not a dedicated element. On any
329
+ element's `field-events`, add an `Event` with `action: "RUN_DATA_STORE_OPERATION"` and a
330
+ config:
331
+
332
+ ```json
333
+ { "action": "RUN_DATA_STORE_OPERATION",
334
+ "config": {
335
+ "dataStoreId": "<uuid>",
336
+ "operation": "READ", // READ | ADD | UPDATE | DELETE
337
+ "inputMap": [{ "id": 0, "left": "page", "right": "1" },
338
+ { "id": 1, "left": "countPerPage", "right": "1000" }],
339
+ "outputMap": [{ "id": 0, "left": "rows", "right": "<target var/element>" }] } }
340
+ ```
341
+
342
+ Canonical fields: `page`, `countPerPage`, `rows`, `success`. At runtime the form calls
343
+ `api/Form/dataStore/{id}/rows` (scoped to the template's workspace, PRC-5559). For reading
344
+ a data store from a PROCESS (not a form) use the **Query Store** action (see
345
+ `../PROCESIO-CONNECTORS-NOTES.md`). The process-designer data-store node adds the control
346
+ types `data-store-mapper` / `data-store-decisional` (`FeComponentType` 46 / 47) with a
347
+ richer decisional operator set (BETWEEN, IN/BELONGS, IS_EMPTY→IsNull, IS_NOT_EMPTY→IsNotNull).
@@ -0,0 +1,294 @@
1
+ # 07 — Shipping it: tooling, testing, recovery
2
+
3
+ How the CSS and JS get onto a live form without destroying it, how to test before
4
+ you publish, and how to get back when you do not.
5
+
6
+ ---
7
+
8
+ ## 1. Never use `form-edit` to restyle an existing form
9
+
10
+ `form-edit` is a **desired-state** editor: it rebuilds the whole DTO from a config.
11
+ Pointing it at a large hand-authored form to change one thing means re-declaring
12
+ every element — or losing them. On a form with a hundred-plus hand-built elements,
13
+ that is the end of the form.
14
+
15
+ Use the **surgical** actions. Each does a read-modify-write on the live DTO and
16
+ touches exactly one thing:
17
+
18
+ | Action | Touches | Everything else |
19
+ |---|---|---|
20
+ | `form-get-code` | nothing (read) | — |
21
+ | `form-set-code` | `Data.code` only | elements, theme, data model, events byte-identical |
22
+ | `form-get-element-events` | nothing (read) | — |
23
+ | `form-set-element-event` | one element's one event config | every sibling byte-identical |
24
+ | `form-get-element` | nothing (read) | — |
25
+ | `form-set-element-config` | one element's plain configs | every sibling byte-identical |
26
+ | `form-set-element-chains` | the ordered event chains of the listed element triggers, in ONE save | every other element byte-identical; kept events verbatim |
27
+
28
+ Every write path maps the GET's camelCase onto the PUT's PascalCase envelope
29
+ explicitly, so an unexpected extra field is never echoed back.
30
+
31
+ ### `form-set-element-config` — content and per-field rules belong in the DTO
32
+
33
+ `label`, `placeholder`, `required`, `regex`, `visible`, `tooltip`, `defaultValue`.
34
+ Rewriting a banner from the form-level JS instead is a trap worth naming: it is
35
+ invisible in the designer, it has to be re-applied on every render, and it fights the
36
+ runtime's own MutationObserver.
37
+
38
+ ```bash
39
+ # long HTML from a file, so the copy lives under version control
40
+ python scripts/run-tool.py procesio form-set-element-config \
41
+ --id <form-id> --element idhead --set-file label=elements/idhead.html --dry-run
42
+
43
+ # scalars are parsed as JSON when they parse, so this stores a real boolean
44
+ python scripts/run-tool.py procesio form-set-element-config \
45
+ --id <form-id> --element intro1 --set visible=false
46
+ ```
47
+
48
+ Two refusals it makes on purpose, both before writing anything:
49
+
50
+ - **a config the element does not already carry.** Adding one would also need a
51
+ data-model attribute whose id equals the new config's id; without it the designer
52
+ renders raw guids and values never flow ([01](01-ANATOMY.md) §5).
53
+ - **an event config.** Those go through `form-set-element-event`, which resolves
54
+ process-variable names to guids and enforces one event per trigger.
55
+
56
+ Config **ids are preserved** on every rewrite — a fresh id there breaks every value
57
+ path pointing at that attribute.
58
+
59
+ ## 2. The loop
60
+
61
+ **Check the key on each installation before the first write.** `form-set-code` encrypts
62
+ with the key stored for the call's environment (§3), and refuses when there is none
63
+ rather than borrow another installation's. A wrong key stored under the right name still
64
+ gets through: the write succeeds and the form goes blank ([08](08-PITFALLS.md)). So first
65
+ read back the code of a form whose CSS was written in the designer, on the same
66
+ installation:
67
+
68
+ ```bash
69
+ python scripts/run-tool.py procesio form-get-code --id <designer-edited-form> \
70
+ --css-out check.css
71
+ ```
72
+
73
+ If it does not decrypt, stop there: the stored key is wrong for this installation (§3).
74
+
75
+ ```bash
76
+ # 1. Pull the current code down to files
77
+ python scripts/run-tool.py procesio form-get-code --id <form-id> \
78
+ --css-out form.css --js-out form.js
79
+
80
+ # 2. Edit form.css / form.js locally, in a real editor, under version control
81
+
82
+ # 3. Preview the write without performing it
83
+ python scripts/run-tool.py procesio form-set-code --id <form-id> \
84
+ --css-file form.css --js-file form.js --dry-run
85
+
86
+ # 4. Ship
87
+ python scripts/run-tool.py procesio form-set-code --id <form-id> \
88
+ --css-file form.css --js-file form.js
89
+ ```
90
+
91
+ Success looks like:
92
+
93
+ ```json
94
+ {"updated": true, "css_bytes": 24157, "javascript_bytes": 28793, "elements": 135}
95
+ ```
96
+
97
+ **Check `elements` on every write.** It is the count on the DTO you just PUT back.
98
+ If it ever drops, you are not doing what you think you are doing — stop.
99
+
100
+ ### Omitting one side preserves it
101
+
102
+ Passing only `--css-file` keeps the existing JavaScript untouched, and vice versa.
103
+ Restyling never silently drops the behaviour layer.
104
+
105
+ ### Every overwrite is recoverable from the tool output
106
+
107
+ `form-set-code` returns the **previous** decrypted css/js under `previous`. Pipe the
108
+ output to a file when you are doing something risky, and a mistaken overwrite is a
109
+ copy-paste away from being undone:
110
+
111
+ ```bash
112
+ python scripts/run-tool.py procesio form-set-code --id <form-id> \
113
+ --js-file form.js > /tmp/last-write.json
114
+ ```
115
+
116
+ ### A 2xx is not a save: `form-set-code` reads the form back
117
+
118
+ The platform has answered form writes with 2xx while storing nothing: `PUT /api/FormTemplate`
119
+ moved `updatedOn` but left every `Data` field as it was (the code, even `browserTitle`), and
120
+ `POST /api/FormTemplate` and `.../duplicate` returned forms with `data: null` (seen on
121
+ Internal-PROD 2026-10-18, every payload shape, PascalCase and camelCase alike; the designer UI
122
+ saves through the same endpoint, so it is not a client bug). The public page then keeps serving
123
+ the old code, which looks exactly like a CDN cache that never expires.
124
+
125
+ So `form-set-code` re-reads the form after the PUT and returns `verified: true`, or fails with
126
+ **`not_persisted`** (details: `sent_bytes`, `stored_bytes`, `kept_previous`). On that error,
127
+ create a tiny scratch form (`POST /api/FormTemplate` with `data: {elements: []}`) and read it
128
+ back: `data: null` means the platform is not storing form content at all, so stop retrying and
129
+ report it; real data means another editor saved the form between your read and your write.
130
+
131
+ ## 3. Credentials
132
+
133
+ Two different secrets that look alike — both short opaque tokens:
134
+
135
+ | Secret | What it does |
136
+ |---|---|
137
+ | the workspace **API key** (name + value) | gets you **at** the form (auth) |
138
+ | `agents-and-tools:procesio:form-code-key@<environment>` | gets you **into** `Data.code` (AES passphrase), one per installation |
139
+
140
+ ```bash
141
+ python scripts/set-credential.py procesio form-code-key@Internal-QA
142
+ ```
143
+
144
+ The form-code passphrase is **installation-wide**: it decrypts the code blob of every
145
+ form on that installation, and it cannot be cheaply rotated. Treat it accordingly —
146
+ never in a file, never in a chat, never in a log.
147
+
148
+ **One key per installation, stored per environment.** The platform team confirmed it:
149
+ the key is the same on every workspace of an installation and is not guaranteed to
150
+ match on another. An environment is how this tool names an installation, so the key is
151
+ stored as `form-code-key@<environment>`. The bare `form-code-key` still works as the
152
+ default environment's key, the same rule as a credential with no environment binding,
153
+ and the tool never uses it for any other environment. A missing key is an error that
154
+ names the secret to store.
155
+
156
+ **It is not a secret from the people who open a form.** The renderer decrypts
157
+ `Data.code` in the visitor's browser, so the passphrase reaches every browser that loads
158
+ a form, and anyone who can open a form can read its CSS and JavaScript. Keep the key out
159
+ of files, chats and logs as the rules require. Treat the form code itself as public: no
160
+ credentials, no internal names, nothing you would not print on the page.
161
+
162
+ ### Diagnosing a decrypt failure
163
+
164
+ A wrong passphrase and a corrupt blob are indistinguishable at the API layer: both
165
+ surface as a `UnicodeDecodeError` after AES has run and emitted garbage. To tell
166
+ them apart, round-trip `encrypt_code` / `decrypt_code` with a throwaway key. If that
167
+ works, the cipher is fine and the **key** is wrong.
168
+
169
+ ## 4. Test on a replica, not on the live form
170
+
171
+ The most expensive mistake available here is publishing straight to a live process
172
+ or a live public form. Two levels of testing, and both are cheap:
173
+
174
+ **A local HTML replica.** Save a rendered copy of the form, inline your CSS and JS,
175
+ and open it in a browser. Because the installer falls back to `window` when there is
176
+ no parent frame ([02](02-CODE-INJECTION.md) §4), the same file runs unchanged. This
177
+ catches the majority of DOM and timing bugs, and it lets you *measure* a transition
178
+ instead of guessing:
179
+
180
+ **Replicate the whole flow, not one screen.** A single-step mock cannot exercise the
181
+ two things most likely to break — the step gate and whatever bridges the DOM to the
182
+ platform's field model — so those are exactly what nothing tests. A replica worth
183
+ building carries: a fake `window.ProcesioForm.data.fields` with the DTO's own names,
184
+ `required` flags and regexes; the form's own element-event visibility logic; the REAL
185
+ `data-element-id` values; and a step change that **destroys and rebuilds** the controls
186
+ (`box.innerHTML = …`), because that is what makes "state stored on a node" fail here
187
+ the same way it fails live. Give it a harness row of buttons for the states that are
188
+ otherwise unreachable (pick each branch, simulate the process result landing, fill the
189
+ current step) and a `?raf=timeout` switch so it can be driven in a background tab.
190
+
191
+ ```js
192
+ // in the page console — prove the class actually lifts
193
+ setTimeout(() => console.log('at120',
194
+ box.classList.contains('ux-leaving'), getComputedStyle(box).opacity), 120);
195
+ setTimeout(() => console.log('at600',
196
+ box.classList.contains('ux-leaving'), getComputedStyle(box).opacity), 600);
197
+ ```
198
+
199
+ Run the same navigation **twice** and confirm nothing accumulates — a second copy of
200
+ a listener, a class that never clears, a growing node count.
201
+
202
+ **A small public test form on the live renderer**, for runtime mechanics a replica
203
+ cannot reproduce (debounce timing, which chain fires when, the lock during a chain).
204
+ Build the smallest form that exercises the mechanism (`form-create`, a stepper with
205
+ two or three steps, the same `form.js`), give it a CustomUrl + `IsPrivate: false`,
206
+ wire it with the same tool calls you will use on the real form, and drive it
207
+ headless with the `web` tool. A saved session that is an EMPTY storageState
208
+ (`{"cookies": [], "origins": []}`) is an anonymous browser. `eval` steps read live
209
+ state (an input's `.value` property, `disabled`, which step is rendered) and can time
210
+ a click. Delete the form and its CustomUrl afterwards. This is how a login-gated
211
+ production form can still be changed on evidence: the gate blocks the headless run
212
+ on the real form, not on the copy of its mechanism.
213
+
214
+ **A duplicated form is the quickest test bench for a restyle.** `form-duplicate` keeps every
215
+ element id and the data model's root id (the ORIGINAL form id), so every value path and
216
+ event mapping still resolves in the copy (verified 2026-10-22). The copy comes back as a
217
+ draft named `… (Copy)`: publish it (`form-update --status 1 --state true --is-private false`),
218
+ then bend it into each state you need to see. Make the hidden sections visible, put a base64
219
+ PDF in a file viewer's `src` (a raw base64 string renders), drop a load process's
220
+ `outputMap` so it cannot hide what you made visible, or swap a submit button's RUN_PROCESS
221
+ for a MAP_FORM_DATA that shows the success section. A state that real data cannot reach
222
+ (no valid token left, a success that writes to a database) gets tested there, on the real
223
+ renderer, with the exact build you will ship.
224
+
225
+ **A duplicated process**, for anything on the process side. `procesio` can duplicate
226
+ a process; change the copy, run the copy, and promote the change only once it works.
227
+ Editing a live process that a public form is calling means every submission in
228
+ flight is your test.
229
+
230
+ **State plainly what you verified.** "Verified on the local replica" and "verified on
231
+ the live form" are different claims. Do not let one stand in for the other.
232
+
233
+ **Test the code you ship.** If the build minifies or bundles the scripts, point the
234
+ replica at the built files. A replica that loads the sources leaves the shipped code with
235
+ no browser test at all. Static checks are weaker still on built output: one that read
236
+ minified CSS raised a false alarm, and the rendered page, measured with
237
+ `getComputedStyle`, settled it.
238
+
239
+ **Some failures exist only on the live form, signed in.** A replica that draws its own
240
+ select hides a list the live form never hands over, and the first-frame flash needs the
241
+ real renderer (both in [08](08-PITFALLS.md)). Open the live form and log what the page
242
+ does every 50 ms. That is how both were found.
243
+
244
+ ## 5. Keep the source under version control — outside the framework
245
+
246
+ The CSS and JS are the form's real source. `Data.code` is a deployment target, not a
247
+ repository: it is encrypted, it has no history, and it cannot be diffed.
248
+
249
+ Keep the files in the user-data area (`context-state-knowledge/resources/...`), not
250
+ in `tools/` — a specific client's form is user data, and the framework/user-data
251
+ boundary is hard. What belongs in the framework is the **generalized** knowledge:
252
+ this guide.
253
+
254
+ Alongside the CSS and JS, keep the process artifacts that are equally
255
+ un-round-trippable — prompts, request bodies, the process definition — so a rebuild
256
+ does not start from a screenshot.
257
+
258
+ **Build each form from source in every workspace. Do not import it in.** An import keeps
259
+ the form's id ([PROCESIO-API-NOTES](../PROCESIO-API-NOTES.md), *What an API import
260
+ carries*), so one id then lives in several workspaces, and the copies do not fail
261
+ together. Seen once: after a platform change, two imported copies came back empty and
262
+ would not open, while the original kept its content. Rebuilt from source with new ids,
263
+ they were back in minutes. Deleting a form touches only its own workspace, which is what
264
+ makes that repair safe; prove it on a throwaway form before you rely on it. Find forms by
265
+ name, never by a stored id, and let no save write when the read before it came back
266
+ empty. The tool's surgical actions refused in exactly that case.
267
+
268
+ ## 6. Write the reasoning into the file, at the top
269
+
270
+ Both files should open with a header stating **how the thing runs** and **which rules
271
+ must never be broken**, with the symptom attached. This is not decoration: `Data.code`
272
+ carries no history and the next person to open it — including you, in three months —
273
+ has no other way to know.
274
+
275
+ ```css
276
+ /* Two rules this file must never break, both learned on the live form:
277
+ - NO `overflow: hidden` on `.form-builder--form` — it kills page scrolling.
278
+ - NO `transform` on `.form-builder--form` — it makes the card the containing
279
+ block for `position: fixed` descendants, so the renderer's pinned footer
280
+ lands on top of the content. Entrances animate opacity only. */
281
+ ```
282
+
283
+ The test for a good comment here: it names the **symptom** a future reader would
284
+ otherwise chase, not just the rule.
285
+
286
+ ## 7. Before you touch a shared form
287
+
288
+ - Confirm the form id and the workspace, out loud, before the first write.
289
+ - `form-get-code` first, always — even when you are sure the form has no code. The
290
+ output *is* your backup.
291
+ - One change per write when debugging. Two changes in one write means a regression
292
+ has two suspects.
293
+ - After any change to a manifest or a contract, update the manifest in the same
294
+ commit (Hard rule 4) and re-run the tool's tests before publishing.