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,142 @@
1
+ # PROCESIO form styling — RESOLVED & implemented (2026-06-25)
2
+
3
+ All four styling surfaces are now understood (verified against the ui-builder frontend
4
+ source in `docs_info/ui-builder-main`) and buildable via `builder.py`.
5
+
6
+ > **Building a real form?** This file is the reference for the four *surfaces*. The
7
+ > full development guide — execution model, DOM contract, interaction recipes,
8
+ > custom steppers and motion, process wiring, deployment, and the pitfall catalogue —
9
+ > is [`tools/procesio/FORM-DEV-GUIDE/`](../../FORM-DEV-GUIDE/00-INDEX.md). Those files
10
+ > are written to be attached as chat context.
11
+
12
+ ## 1. Form Theme — ✅ implemented
13
+ `Data.theme`: 18 sections, ~190 CSS variables (`{label,types,properties:[{type,label,
14
+ value,cssVariable}]}`). Pass `theme:{"--c-primary":"#0039e3","--h-input":"44px"}`;
15
+ `_apply_theme` overrides by `cssVariable`. Form-wide, by control type. Defaults =
16
+ `docs_info/form-theme.ts` `getDefaultTheme()` (== `data_shell.json` theme).
17
+
18
+ ## 2. Element event JavaScript — ✅ implemented
19
+ Per-control onClick/onInput/etc → `{action:"RUN_JAVASCRIPT", config:{code}}` (plaintext)
20
+ in the element's event config. `events:[{on:"click",do:"js",code:"..."}]`.
21
+
22
+ ## 3. Per-component styling — ✅ implemented
23
+ Each element has a `{key:"style", category:"styling"}` config whose value is a
24
+ `CSSProperty[]` (`{label,value,cssVariable,type,enabled}`). The runtime
25
+ (`useThemable.themeStyle`) applies ONLY `enabled:true` props, overriding
26
+ `style[cssVariable]=value` (wrapping in `var(value)` when `type==css-variable-select`).
27
+ Build it by passing per-element `style:{cssVariable:value}`:
28
+ ```json
29
+ {"type":"input","label":"Name","style":{"--h-input":"50px","--c-input-background":"--c-neutral--50"}}
30
+ ```
31
+ - Valid vars = the element type's CSS group (frontend `getCssGroupByElementType`: FIRST
32
+ theme group whose `types` include the type — so input/number/datetime/textarea/select all
33
+ use the **Input** group). Unknown var → hard error (lists valid ones). Non-stylable types
34
+ (heading, paragraph, divider, image…) → error.
35
+ - For `css-variable-select` vars (colors) pass a theme color VARIABLE (e.g. `--c-neutral--50`),
36
+ NOT a hex — the runtime emits `var(<value>)`. Plain vars (height/padding) take raw values.
37
+ - Builder: `_apply_element_style` + `_style_props_for` (reads groups from `data_shell.json`).
38
+
39
+ ## 4. Form-level CSS + JavaScript ("Switch to code") — ✅ implemented
40
+ Stored encrypted in `Data.code`. **Scheme (verified by decrypting real exports):**
41
+ `code = AES_encrypt( JSON.stringify({"JAVASCRIPT":js,"CSS":css}) )` using CryptoJS
42
+ `AES.encrypt(text, passphrase)` = OpenSSL AES-256-CBC, key+IV via EVP_BytesToKey(MD5,1),
43
+ output `base64("Salted__"+salt+ct)`. Passphrase = a static key.
44
+ - **Key is in Credential Manager**, one per installation, stored per environment as
45
+ `agents-and-tools:procesio:form-code-key@<environment>` (the bare `form-code-key` is
46
+ the default environment's; `tools/procesio/form_code_keys.py`) — NEVER in any file
47
+ (Hard rule 1). Declared in `tool.yaml` secrets.
48
+ - Build via `css:"..."` / `javascript:"..."` (or `code:{css,javascript}`) on the form
49
+ config. Empty → `code:""` (forms render fine without it). Impl: `code_cipher.py`
50
+ (`encrypt_code`/`decrypt_code`) + `builder._build_code`.
51
+ - The frontend itself only holds `code` as a plaintext `{JAVASCRIPT,CSS}` object and runs
52
+ the JS as a RUN_JAVASCRIPT form event at render; the host webapp does the AES step. There
53
+ is NO plaintext css/js field on the DTO (team confirmed: no unencrypted path).
54
+
55
+ ## 5. Restyling an EXISTING form — use `form-set-code`, never `form-edit`
56
+ `form-edit` is a desired-state editor: it rebuilds the whole DTO from a config, so
57
+ pointing it at a large hand-authored form to change one field means re-declaring every
58
+ element or losing them. Use the surgical pair instead (handlers/form_code.py):
59
+ `form-get-code --id <id>` (decrypt) / `form-set-code --id <id> --css-file … --js-file …`
60
+ (GET → swap `Data.code` → PUT the same DTO back). Only `Data.code` changes; omitting one
61
+ of css/js preserves that side; the overwritten code comes back under `previous`, so a
62
+ mistaken overwrite is recoverable from the tool output alone.
63
+ - `PUT /api/FormTemplate` wants the PascalCase envelope (`Id/Name/IsPrivate/Type/Status/
64
+ State/Assignees/Data/CustomUrl`) while the GET returns it camelCase — map explicitly.
65
+
66
+ - **`{"JAVASCRIPT": null, "CSS": null}` is a NORMAL decrypt result, not a corrupt blob.**
67
+ The designer seeds both slots to null, so that is what every form that never opened
68
+ "Switch to code" carries — and a form can also carry a JS slot holding only the
69
+ designer's boilerplate comment. Normalize null → `""` before doing anything with a
70
+ length or a concatenation (`_decode` does; a `len(None)` crash here was a real bug).
71
+ - **A wrong passphrase and a corrupt blob are indistinguishable at the API layer**: both
72
+ surface as a `UnicodeDecodeError` after AES runs and emits garbage. Diagnose by
73
+ round-tripping `encrypt_code`/`decrypt_code` with a throwaway key — if that works, the
74
+ blob is fine and the KEY is wrong. Note also that the workspace API key (name + value)
75
+ and the form-code passphrase are DIFFERENT secrets that look alike (short opaque
76
+ tokens); the API key gets you *at* the form, the passphrase gets you *into* `Data.code`.
77
+
78
+ ## 6. What the CSS and the JS can actually reach at runtime
79
+ - **CSS is injected as a `<style>` PREPENDED INSIDE the form root, and SCOPED to it**
80
+ (changed in v3.0.0, 2026-10; before, it styled the whole document and page-level
81
+ selectors worked). Every selector is rewritten to
82
+ `sel:where([data-form-css-scope=<id>], ...)`, matching the form root and its
83
+ descendants only. So rules for `body`, `:root`, `html`, the host chrome and the builder
84
+ match nothing, `:root` custom properties no longer reach the form, and tooltips and
85
+ date-picker popups no longer get the form CSS. Comments and unparsable CSS are dropped;
86
+ `@keyframes` / `@font-face` are moved into a layer. Still global: a `<style>` inside
87
+ paragraph/heading HTML, `@import`, and JS that injects a `<style>` into
88
+ `window.parent.document`. JS that renders UI OUTSIDE the form container (appended to
89
+ `document.body`, a modal or overlay, a full-page app) gets no styles, and `:root` /
90
+ `html` / `body` rules stop applying: before mounting, copy the container's
91
+ `data-form-css-scope` value onto `<html>` (inside the wait-for-render loop). Full rules
92
+ and the snippet in `tools/procesio/FORM-DEV-GUIDE/02-CODE-INJECTION.md` §2.
93
+ - **The branding class is also filtered** (`js/form-builder/css.ts` replaces that literal
94
+ string with a random number so it cannot be hidden).
95
+ - **Form-level JS is replayed as a synthetic RUN_JAVASCRIPT event on mount and on every
96
+ re-trigger, inside a throwaway sandbox iframe whose window is destroyed and rebuilt each
97
+ time.** So anything that must OUTLIVE one run (listeners, MutationObservers, timers)
98
+ cannot live in that scope — it dies with the iframe. The pattern that works: from the
99
+ sandbox, inject a `<script>` ONCE into `window.parent.document`, carrying the real
100
+ runtime (`'(' + fn.toString() + ')();'` avoids escaping). Guard both layers with a
101
+ flag — the installer re-runs, and a second copy means doubled handlers. The platform
102
+ confirms the reach itself: the JS slot's shipped boilerplate reads
103
+ `console.log(window.parent.document); -> to access the DOM`.
104
+ - **Controls are re-created, not hidden**: `Element.component.vue` renders under `v-if`,
105
+ so toggling `visible` removes the node from the DOM. Entrance animations therefore fire
106
+ on every step change (good), but exit transitions are impossible (the node is gone), and
107
+ any state you attach to a node must be recomputed from a MutationObserver.
108
+ - **Runtime selectors** are two families: `.form-builder--*` (the renderer's own, e.g.
109
+ `--form`, `--form-body`, `--element[data-element-id]`, `--stepper--nav--item`,
110
+ `--stepper--container`, `--stepper--buttons`, `--input`, `--select`, `--checkbox`,
111
+ `--radiobox`, `--file-upload`, `--columns`, `--column`) and `.pds-c-*` from the design
112
+ system (`--input-group--wrapper` / `--wrapper--focused` / `--wrapper--is-error`,
113
+ `--input-group--label`, `--input-group--message--is-error`, `--input-group--square`,
114
+ `pds-c-radiobox--is-checked`, `pds-c-button--solid-primary`, `pds-c-step--header--circle`
115
+ `[--active]`, `pds-c-step-connector`). The `pds-c-*` INTERNALS are not in this repo
116
+ (they ship in `@procesio/procesio-design-system`), so only the ones the renderer's own
117
+ SCSS references are safe to target — anything deeper must be checked against a live
118
+ render first.
119
+
120
+ ## Source of truth
121
+ `docs_info/ui-builder-main` is the actual frontend repo. Confirmed: its
122
+ `src/js/model/element/mock.ts` is byte-identical to `FormBuilder mock.ts` (our goldens come
123
+ from it), and its `src/js/model/config/index.ts` enums match `form-config-enums.ts` exactly.
124
+
125
+ ## Dark theme + element alignment (2026-08)
126
+
127
+ **Dark theme.** A form carries both a light and a dark palette, swapped at runtime by
128
+ `themeMode`/`activeThemeMode` (getPaletteStyleSheet injects the active one). The 16-var
129
+ `DARK_PALETTE` (builder `_DARK_PALETTE`): `--c-primary` #4663f5, `--c-primary-variant`
130
+ #8aa0ff, `--c-error` #ff6b6b, `--c-success` #32d583, `--c-info` #53b1fd, and the neutrals
131
+ inverted `--c-neutral--900` #f8fafd … `--c-neutral--0` #141922. Opt in via config
132
+ `themeMode`/`themeDark`; default forms stay light-only. The exact DTO persistence key for
133
+ the dark palette is best-effort (`themeMode`/`themeDark` in Data) pending live confirmation.
134
+
135
+ **Element alignment.** Container elements accept three flex vars in their per-control
136
+ `style`, keyed by an element SCOPE suffix: `--fd-<scope>` (flex-direction / "Inner
137
+ direction"), `--jc-<scope>` (justify-content / "Inner main axis"), `--ai-<scope>`
138
+ (align-items / "Inner cross axis"). Scopes: section, list-item, column, step, tab,
139
+ side-panel (element types section, list, columns, stepper, tabs, side-panel). The builder
140
+ accepts them additively today (`_alignment_props`); when the golden `data_shell.json` is
141
+ refreshed from the launched `form-theme.ts` the golden's native definition (proper dropdown
142
+ type + option list) wins.
@@ -0,0 +1,72 @@
1
+ # Form-control goldens: generated from the FormBuilder mock (DO NOT hand-edit)
2
+
3
+ `elements/<type>.json` (the per-control "goldens" the builder clones) are **generated**
4
+ from the FormBuilder source of truth `docs_info/FormBuilder mock.ts` by
5
+ `sync_from_mock.py`. Do not edit them by hand — your change will be overwritten on the
6
+ next sync. Change the mock (or `enum_map.json`) and re-run instead.
7
+
8
+ ## The sync mechanism — `sync_from_mock.py`
9
+ ```
10
+ python tools/procesio/dto/form/sync_from_mock.py # dry-run: what would change + unverified enums
11
+ python tools/procesio/dto/form/sync_from_mock.py --write # regenerate all elements/*.json
12
+ python tools/procesio/dto/form/sync_from_mock.py --check # exit 1 if goldens != mock (CI guard)
13
+ ```
14
+ **When a new mock.ts arrives** (new control, changed control, new feature): drop it in
15
+ `docs_info/FormBuilder mock.ts`, run `--write`, eyeball the change list + the
16
+ "UNVERIFIED enum members" section, run the tests. That's the whole loop.
17
+
18
+ What it guarantees:
19
+ - **complete** — one golden per control the FormBuilder ships (33), incl. ones that
20
+ could never be harvested (chart, chat, assignee, signature-pad, stepper, step).
21
+ - **exact** — config keys, **render order** (= designer properties-panel order),
22
+ `type`/`category`/`subCategory`/`exposed`/`events` all come straight from the mock.
23
+ - **deterministic / repeatable** — same mock in → byte-identical files out (ids are
24
+ `uuid5`; the builder reassigns ids at build time so their values are cosmetic).
25
+ - **sound** — before writing it re-checks every regenerated golden against the previous
26
+ on-disk one and ABORTS if any *resolved enum value* of a shared config changed
27
+ (catches a wrong enum mapping). Adding keys a stale golden lacked is allowed.
28
+
29
+ ## Enum resolution — authoritative, no guessing
30
+ The mock references config metadata via enums imported from `../config`. Resolution
31
+ precedence (highest first):
32
+ 1. `docs_info/form-config-enums.ts` — the frontend's actual enum definitions (provided
33
+ verbatim by the team 2026-06-25). Parsed directly → every member is authoritative.
34
+ 2. `enum_map.json` — committed fallback / manual override (used only for a member not
35
+ in the TS file).
36
+ 3. rule `MEMBER → lower, '_'→'-'` — last resort, flagged **UNVERIFIED**.
37
+
38
+ `ElementType` and `ElementCategory` are defined **inside** the mock → parsed from it.
39
+
40
+ With the TS file present, **0 members are unverified**. Confirmed oddities the rule
41
+ alone would get wrong (now in the TS file): `READONLY_OR_DISABLED_TOGGLE →
42
+ "readonly-or-disabled"` (suffix dropped) and the misspelled `CONTOLS → "controls"`.
43
+
44
+ **When the frontend changes a config enum:** paste the updated enum into
45
+ `docs_info/form-config-enums.ts` and re-run `--write`. That's the whole enum-upkeep
46
+ story — no manual map editing.
47
+
48
+ ## TEMPLATE_ONLY configs are intentionally excluded (DECISION — confirmed 2026-06-25)
49
+ Configs typed `TEMPLATE_ONLY` (templateLabel, variation, palette-only duplicates) live
50
+ only in the builder palette, never in an instantiated/saved control — so the generator
51
+ drops them. The golden mirrors **what the toolbar produces**, which is what the builder
52
+ must send. Their absence is correct, not drift. Do NOT re-add them: a real saved control
53
+ has none, and shipping them risks the platform's on-save compiler mishandling the element
54
+ and creates phantom data-model attributes. (To override anyway, the only change is to stop
55
+ skipping `type == "template-only"` in `sync_from_mock.py`.)
56
+
57
+ ## Builder coupling (don't break these)
58
+ `builder._set_config` overrides a key **only if it already exists** in the golden — a
59
+ missing key = silent no-op. That's why golden completeness matters and why we generate
60
+ from the mock. Builder-critical keys verified present: `childrenIdPerColumn`, `rows`,
61
+ `columns`, `tabs`, `tableColumnsSourceType/Value`, canonical `value`
62
+ (`exposed:true` + `events:["EMIT_INPUT"]`).
63
+
64
+ ## Files
65
+ - `sync_from_mock.py` — the generator (this mechanism).
66
+ - `../../docs_info/form-config-enums.ts` — AUTHORITATIVE frontend enum definitions
67
+ (parsed directly). Update this when the frontend changes a config enum.
68
+ - `enum_map.json` — committed fallback used only if the TS file is absent.
69
+ - `capture_goldens.py` — OLD harvest-from-exports approach, superseded by the above
70
+ (kept for reference / cross-checking against real saved forms).
71
+ - `elements.bak.premock/` — backup of the pre-sync harvested goldens (safe to delete
72
+ once you're happy: `rm -r elements.bak.premock`).
@@ -0,0 +1,80 @@
1
+ # Form `RUN_PROCESS` synchronous result notes
2
+
3
+ These notes cover native form output mapping after a synchronous process event. They
4
+ are based on the form builder contract plus a live browser/process/ledger field trace
5
+ on 2026-09-05. The trace is historical and not a public proof packet; publication
6
+ of these notes does not reverify the deployed browser/runtime. Confirm compatibility
7
+ with the target runtime before relying on this response shape.
8
+
9
+ ## Mapping direction
10
+
11
+ The form builder resolves both input and output mappings with the process variable on
12
+ the left and the form field value path on the right:
13
+
14
+ - input spec `{to: processVariable, from: formField}`;
15
+ - output spec `{to: formField, from: processVariable}`.
16
+
17
+ The process side must resolve to the stable process-variable GUID. Re-fetch and compare
18
+ mappings after any process edit that could replace variable IDs.
19
+
20
+ ## Native synchronous writer contract
21
+
22
+ A successful synchronous process execution is not sufficient for visible output-map
23
+ updates. The form runtime's native writer consumes a process-variable collection from
24
+ the launch response's `content.variable` path. When the process custom response is an
25
+ arbitrary business object without a compatible `variable` member, the process can:
26
+
27
+ - finish successfully;
28
+ - write its database/data-store side effect;
29
+ - return a useful object to an API caller;
30
+ - yet leave the form's mapped result fields unchanged.
31
+
32
+ For a process shared by form, CLI, and subprocess callers, use a compatibility envelope
33
+ rather than replacing the established response:
34
+
35
+ ```json
36
+ {
37
+ "decision": "<existing top-level field>",
38
+ "summary": "<existing top-level field>",
39
+ "next_action": "<existing top-level field>",
40
+ "duplicate": false,
41
+ "response": {"<optional complete original response>": "..."},
42
+ "variable": ["<exact live process-variable instance objects>"]
43
+ }
44
+ ```
45
+
46
+ The example is structural, not a DTO to copy literally. Through an approved protected
47
+ inspection, establish the exact entry shape, IDs, value encoding, list flags and types
48
+ expected by the deployed runtime. Do not return the entire instance variable array:
49
+ only expose outputs the form caller is authorized to see, never credentials or internal
50
+ state. Keep existing permitted business fields at their established top-level paths.
51
+
52
+ Point the process custom response at the compatibility envelope and keep the ordinary
53
+ process outputs present. Bind any Node/Javascript Error output and set a nonzero timeout.
54
+
55
+ ## Proof standard
56
+
57
+ A native output-mapping claim passes only when one real form interaction:
58
+
59
+ 1. opens the published form in a clean browser context;
60
+ 2. submits or clicks exactly once with a stable business key;
61
+ 3. observes the real launch response;
62
+ 4. updates the mapped fields automatically through the platform event path;
63
+ 5. shows the expected decision and non-empty next action;
64
+ 6. reconciles the exact process instance and storage side effect;
65
+ 7. has no unexplained console, page, network, or response errors.
66
+
67
+ Do not call the SPA writer manually, patch result fields in the DOM, replay the request,
68
+ or feed an older instance into the writer as proof. Those techniques may diagnose the
69
+ expected shape, but they do not verify the native form path.
70
+
71
+ ## Secret and compatibility rules
72
+
73
+ - Never store an access token as a form default or in plaintext form code.
74
+ - Exclude secrets before screenshot, log or response capture; masking afterward cannot
75
+ undo an earlier disclosure.
76
+ - Snapshot process variable IDs and the old custom-response shape before editing.
77
+ - Re-fetch dependent forms and subprocess mappings after the edit.
78
+ - Preserve direct CLI/subprocess response semantics; additive envelopes are safer than
79
+ replacing an established response object.
80
+ - Count the form-triggered process and every awaited/nested child in execution budgets.
@@ -0,0 +1,277 @@
1
+ """Add one or more controls to a LIVE form, without disturbing anything already on it.
2
+
3
+ The gap this fills: `form-create` speaks an authoring config and `form-edit` rebuilds a whole form
4
+ from one, so neither can add a control to a form that was hand-built in the designer — the two
5
+ shapes are different languages (an authoring config has no element ids at all, see
6
+ PROCESIO-API-NOTES.md "form-create takes an AUTHORING CONFIG"). Every other form action here is
7
+ surgical; adding a control was the missing verb, and without it a new admin button meant
8
+ hand-writing a stored element DTO.
9
+
10
+ What makes a splice safe rather than a rebuild: PROCESIO backs each control with a data-model
11
+ sub-model whose id IS the element id, and whose attribute ids ARE that element's own config ids
12
+ (see `_build_data_model` in builder.py). New controls therefore contribute new sub-models and touch
13
+ nothing else — which is the whole point, because a RUN_PROCESS/MAP trigger references a field by the
14
+ path `root.fields.elementId.valueAttrId`. Regenerating the live model would silently break every
15
+ mapping already on the form, so this never rebuilds it; it appends to it.
16
+
17
+ Pure: takes the form as GET returns it, returns a NEW `Data` dict. The caller validates and PUTs.
18
+ """
19
+ from __future__ import annotations
20
+
21
+ import copy
22
+ import json
23
+ import re
24
+ import uuid
25
+
26
+ from tools.procesio.dto.form import builder
27
+ from tools.procesio.errors import UsageError
28
+
29
+
30
+ def _new_id(_ctx=None) -> str:
31
+ return str(uuid.uuid4())
32
+
33
+
34
+ def _name_of(element: dict) -> str | None:
35
+ for c in element.get("configs") or []:
36
+ if c.get("key") == "name":
37
+ return c.get("value")
38
+ return None
39
+
40
+
41
+ def _sub_model(element: dict, fields_ns: str, ctx: dict) -> dict:
42
+ """The `fields` sub-model for one control — element id, config ids, same as a full build.
43
+
44
+ Mirrors `builder._build_data_model`'s per-element branch. It is duplicated rather than shared
45
+ because that function rebuilds the WHOLE model from the shell, which is exactly what a splice
46
+ must not do to a designer-built form.
47
+ """
48
+ eid = element["id"]
49
+ name = _name_of(element) or eid
50
+ sub = {"id": eid, "dataTypeId": eid, "name": name, "displayName": name,
51
+ "isDataModel": True, "isList": False, "isProcesio": False,
52
+ "isPublic": False, "parentDataTypeId": fields_ns, "jsonProperty": None,
53
+ "attributes": []}
54
+ for c in element.get("configs") or []:
55
+ shape = builder._dm_shape(element, c) # the same rule form-create applies
56
+ if shape is None:
57
+ continue
58
+ sub["attributes"].append(
59
+ builder._dm_attr(builder._attr_name(c["key"]), c.get("id") or _new_id(ctx),
60
+ shape[0], eid, shape[1]))
61
+ return sub
62
+
63
+
64
+ # container type -> the config holding the ordered NAMES of the children it renders.
65
+ _LIST_CONFIG = {"tabs": "tabs", "table": "rows", "stepper": "steps"}
66
+
67
+
68
+ def unreachable_in_row(elements: list, parent_id: str | None) -> str | None:
69
+ """Warn when a control is being placed where no process map can read it.
70
+
71
+ A control inside a table row exists once per row, so a map reads it through the ROW - a
72
+ five-segment path ending at the child element, via the row's `$.fields` model attribute. A row
73
+ that was itself spliced in has no `$.fields`: this function builds a sub-model from an element's
74
+ own configs, and there is no way to add one afterwards that the runtime will honour. The control
75
+ then displays fine, accepts typing, and sends nothing, which looks like a broken save rather
76
+ than a control in the wrong place.
77
+
78
+ Returns the warning text, or None when the placement is fine.
79
+ """
80
+ if not parent_id:
81
+ return None
82
+ by_id = {e.get("id"): e for e in elements}
83
+ node = by_id.get(parent_id)
84
+ seen = set()
85
+ while node is not None and node.get("id") not in seen:
86
+ seen.add(node.get("id"))
87
+ if node.get("type") == "dynamic-table-row":
88
+ name = _name_of(node) or node.get("id")
89
+ return (f"placed inside the table row {name!r}: a control there exists once per row, so "
90
+ f"a RUN_PROCESS map reading its own field path gets nothing. Address it through "
91
+ f"the row (formId.fieldsNs.rowId.$fieldsAttrId.childId), or - if that row has no "
92
+ f"'$.fields' attribute, which is the case for any row that was itself spliced in "
93
+ f"- put the control outside the row and copy the value out from the row's "
94
+ f"'$.item' when the panel opens.")
95
+ node = by_id.get(node.get("parentId"))
96
+ return None
97
+
98
+
99
+ def _resolve_parent(elements: list, parent: str | None) -> str | None:
100
+ if not parent:
101
+ return None
102
+ for el in elements:
103
+ if el.get("id") == parent or _name_of(el) == parent:
104
+ return el["id"]
105
+ known = ", ".join(sorted(n for n in (_name_of(e) for e in elements) if n))
106
+ raise UsageError(f"parent element not found: {parent!r}. Known element names: {known}")
107
+
108
+
109
+ def add_elements(form: dict, specs: list, *, parent: str | None = None) -> dict:
110
+ """Return a NEW `Data` with `specs` (authoring-config elements) appended.
111
+
112
+ `parent` places them inside an existing container, by element name or id; omitted, they land at
113
+ the top level. A duplicate control NAME is refused: the designer resolves a field path back to a
114
+ name, so two controls sharing one make every reference to it ambiguous.
115
+ """
116
+ if not specs:
117
+ raise UsageError("nothing to add: pass at least one element spec")
118
+
119
+ data = copy.deepcopy(form.get("data") or form.get("Data") or {})
120
+ elements = data.get("elements") or []
121
+ existing_names = {n for n in (_name_of(e) for e in elements) if n}
122
+
123
+ parent_id = _resolve_parent(elements, parent)
124
+
125
+ # The field-name resolver walks from the form handle variable into Data.dataModel, so the model
126
+ # root, the field-path root and variables[0].id must be the SAME id (builder.build guards this
127
+ # on a full build). On a splice we adopt the LIVE id rather than deriving a new one.
128
+ handle = (data.get("variables") or [{}])[0]
129
+ root_id = data.get("dataModel", {}).get("id") or handle.get("id")
130
+ if not root_id:
131
+ raise UsageError("form has no dataModel root id; refusing to guess one")
132
+
133
+ ctx = {"form_id": form.get("id") or form.get("Id"), "dm_root_id": root_id,
134
+ "field_paths": {}, "value_attr_ids": {}, "new_id": _new_id,
135
+ "parent_id": parent_id}
136
+
137
+ added: list = []
138
+ for spec in specs:
139
+ name = spec.get("name") or builder._field_slug(spec.get("label") or spec.get("type") or "")
140
+ if name in existing_names:
141
+ raise UsageError(
142
+ f"the form already has a control named {name!r}; two controls with one name make "
143
+ f"every field reference to it ambiguous")
144
+ existing_names.add(name)
145
+ builder._build_element(spec, dict(ctx), added)
146
+
147
+ data["elements"] = elements + added
148
+
149
+ # A container does not draw a child just because the child points at it: `tabs` lists its tab
150
+ # NAMES and `table` lists its row names, and a spliced child that is missing from that list
151
+ # exists, saves, lints clean, and never appears on screen. Registering it here is the whole
152
+ # difference between a control that is there and one that only looks like it is.
153
+ if parent_id:
154
+ container = next((e for e in elements if e.get("id") == parent_id), None)
155
+ if container is not None:
156
+ key = _LIST_CONFIG.get(container.get("type"))
157
+ if key:
158
+ for c in container.get("configs") or []:
159
+ if c.get("key") == key:
160
+ listed = list(c.get("value") or [])
161
+ for el in added:
162
+ nm = _name_of(el)
163
+ if el.get("parentId") == parent_id and nm and nm not in listed:
164
+ listed.append(nm)
165
+ c["value"] = listed
166
+
167
+ model = data.setdefault("dataModel", {"id": root_id, "name": "form", "attributes": []})
168
+ attrs = model.setdefault("attributes", [])
169
+ fields = next((a for a in attrs if a.get("name") == "fields"), None)
170
+ if fields is None:
171
+ fields = {"id": builder._FIELDS_NS, "dataTypeId": builder._FIELDS_NS, "name": "fields",
172
+ "displayName": "fields", "isDataModel": True, "isList": False,
173
+ "isProcesio": False, "isPublic": True, "parentDataTypeId": root_id,
174
+ "jsonProperty": None, "attributes": []}
175
+ attrs.append(fields)
176
+ fields.setdefault("attributes", []).extend(
177
+ _sub_model(el, fields["id"], ctx) for el in added)
178
+
179
+ return data
180
+
181
+
182
+ def _descendants(elements: list, root_id: str) -> list:
183
+ """Every element under `root_id`, however deep."""
184
+ out, frontier = [], {root_id}
185
+ while frontier:
186
+ kids = [e for e in elements if e.get("parentId") in frontier and e not in out]
187
+ if not kids:
188
+ break
189
+ out += kids
190
+ frontier = {k["id"] for k in kids}
191
+ return out
192
+
193
+
194
+ def _references_to(data: dict, doomed_ids: set) -> list:
195
+ """Where the rest of the form still points at one of `doomed_ids`.
196
+
197
+ A field VALUE PATH carries the element id, so a RUN_PROCESS input/output map, a visibility
198
+ condition or another control's event all show up as the id appearing outside the element
199
+ itself. Searching by id is exact; a reference made by NAME cannot be found this way, which
200
+ is why the report says so rather than implying the list is exhaustive.
201
+ """
202
+ survivors = {"elements": [e for e in (data.get("elements") or [])
203
+ if e.get("id") not in doomed_ids],
204
+ "events": data.get("events"), "variables": data.get("variables")}
205
+ blob = json.dumps(survivors, ensure_ascii=False)
206
+ # Matched as a WHOLE token: a field path joins ids with dots, so an id must not be found
207
+ # merely because it is a substring of a longer one.
208
+ return sorted(i for i in doomed_ids
209
+ if re.search(r"(?<![0-9A-Za-z-])%s(?![0-9A-Za-z-])" % re.escape(i), blob))
210
+
211
+
212
+ def delete_element(form: dict, element: str, *, force: bool = False) -> tuple[dict, dict]:
213
+ """Return (a NEW `Data` without `element`, report). The mirror of `add_elements`.
214
+
215
+ Removes the control from `Data.elements` AND its entry from the form's data model, leaving
216
+ every other element's id and field path untouched - the property that makes a splice safe
217
+ and is equally required here. A control that something still references is REFUSED unless
218
+ `force`, because a dangling field path is saved without any error and the control that
219
+ pointed at it then silently launches nothing.
220
+ """
221
+ data = copy.deepcopy(form.get("data") or form.get("Data") or {})
222
+ elements = data.get("elements") or []
223
+ target = next((e for e in elements
224
+ if e.get("id") == element or _name_of(e) == element), None)
225
+ if target is None:
226
+ known = ", ".join(sorted(n for n in (_name_of(e) for e in elements) if n)[:20])
227
+ raise UsageError(f"no element with id or name {element!r} on this form; known: {known}")
228
+
229
+ kids = _descendants(elements, target["id"])
230
+ if kids and not force:
231
+ raise UsageError(
232
+ f"{_name_of(target) or target['id']!r} contains {len(kids)} control(s) "
233
+ f"({', '.join(str(_name_of(k) or k['id']) for k in kids[:6])}); delete those first, "
234
+ f"or pass --force to remove the whole subtree")
235
+
236
+ doomed = [target] + kids
237
+ doomed_ids = {e["id"] for e in doomed}
238
+ refs = _references_to(data, doomed_ids)
239
+ if refs and not force:
240
+ raise UsageError(
241
+ f"{_name_of(target) or target['id']!r} is still referenced by the form "
242
+ f"({len(refs)} id reference(s) outside the control itself: an event, a process "
243
+ f"input/output map or a visibility condition). Re-point or remove those first, or "
244
+ f"pass --force to delete anyway and break them")
245
+
246
+ data["elements"] = [e for e in elements if e["id"] not in doomed_ids]
247
+
248
+ # Un-register from a container's own list, the reverse of the splice.
249
+ for container in data["elements"]:
250
+ key = _LIST_CONFIG.get(container.get("type"))
251
+ if not key:
252
+ continue
253
+ for c in container.get("configs") or []:
254
+ if c.get("key") == key and isinstance(c.get("value"), list):
255
+ gone = {_name_of(e) for e in doomed}
256
+ c["value"] = [n for n in c["value"] if n not in gone]
257
+
258
+ # And from the data model, so the form stops advertising a field it no longer draws.
259
+ removed_attrs = 0
260
+ fields = next((a for a in (data.get("dataModel", {}).get("attributes") or [])
261
+ if a.get("name") == "fields"), None)
262
+ if fields:
263
+ before = len(fields.get("attributes") or [])
264
+ fields["attributes"] = [a for a in (fields.get("attributes") or [])
265
+ if a.get("id") not in doomed_ids]
266
+ removed_attrs = before - len(fields["attributes"])
267
+
268
+ report = {
269
+ "removed": [{"id": e["id"], "type": e.get("type"), "name": _name_of(e)} for e in doomed],
270
+ "descendants": len(kids),
271
+ "model_attributes_removed": removed_attrs,
272
+ "broken_references": refs if force else [],
273
+ "element_count": len(data["elements"]),
274
+ "note": ("references are found by element id; one made by NAME cannot be detected that "
275
+ "way, so check a condition that names the control"),
276
+ }
277
+ return data, report