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,213 @@
1
+ {
2
+ "id": "692c2088-9097-5ffc-a64d-47f858663f4d",
3
+ "category": "fields",
4
+ "type": "textarea",
5
+ "configs": [
6
+ {
7
+ "id": "ea4a2e0e-136e-5910-ac19-23cefe045fa4",
8
+ "key": "label",
9
+ "label": "Label",
10
+ "placeholder": "Add label here",
11
+ "category": "content",
12
+ "subCategory": "general",
13
+ "type": "input",
14
+ "value": "Textarea",
15
+ "exposed": true
16
+ },
17
+ {
18
+ "id": "4add7686-6c85-5267-bc84-c040077eaea5",
19
+ "key": "placeholder",
20
+ "label": "Placeholder",
21
+ "category": "content",
22
+ "subCategory": "general",
23
+ "type": "input",
24
+ "value": "Single line or multi line text area",
25
+ "exposed": true
26
+ },
27
+ {
28
+ "id": "7fa7fc91-25c0-5a9b-bde9-111902d10620",
29
+ "key": "tooltip",
30
+ "label": "Tooltip",
31
+ "placeholder": "Add tooltip here",
32
+ "tooltip": "Tooltip can only be displayed with Label",
33
+ "category": "content",
34
+ "subCategory": "general",
35
+ "type": "input",
36
+ "value": "",
37
+ "exposed": true
38
+ },
39
+ {
40
+ "id": "3f18ce1e-899c-579f-bf8f-78a959ab2cc3",
41
+ "key": "info-text",
42
+ "label": "Info text",
43
+ "placeholder": "Add info text here",
44
+ "category": "content",
45
+ "subCategory": "general",
46
+ "type": "input",
47
+ "value": "",
48
+ "exposed": true
49
+ },
50
+ {
51
+ "id": "c29906d5-2ea0-5da4-9d42-891655a4823d",
52
+ "key": "rows",
53
+ "label": "Rows",
54
+ "placeholder": "Add textarea rows here",
55
+ "category": "content",
56
+ "subCategory": "general",
57
+ "type": "number-input",
58
+ "value": 4,
59
+ "exposed": true
60
+ },
61
+ {
62
+ "id": "a2eb7693-ac0a-5329-9914-879768399f30",
63
+ "key": "defaultValue",
64
+ "label": "Default value",
65
+ "placeholder": "Add default value here",
66
+ "category": "content",
67
+ "subCategory": "general",
68
+ "type": "textarea",
69
+ "value": "",
70
+ "exposed": true,
71
+ "events": [
72
+ "REMAP"
73
+ ]
74
+ },
75
+ {
76
+ "id": "dd7d6dea-ef63-53fd-a690-9f64b69c2ef1",
77
+ "key": "value",
78
+ "label": "Value",
79
+ "category": "content",
80
+ "subCategory": "general",
81
+ "type": "hidden",
82
+ "value": "",
83
+ "exposed": true,
84
+ "events": [
85
+ "EMIT_INPUT"
86
+ ]
87
+ },
88
+ {
89
+ "id": "6b9e8f09-f0ef-5854-9fd2-d513527427c6",
90
+ "key": "readonly",
91
+ "label": "Readonly",
92
+ "category": "content",
93
+ "subCategory": "general",
94
+ "type": "readonly-or-disabled",
95
+ "value": false,
96
+ "exposed": true
97
+ },
98
+ {
99
+ "id": "629cdeaf-7967-5e9f-80e5-81640dbecc79",
100
+ "key": "disabled",
101
+ "label": "Disabled",
102
+ "category": "content",
103
+ "subCategory": "general",
104
+ "type": "hidden",
105
+ "value": false,
106
+ "exposed": true
107
+ },
108
+ {
109
+ "id": "5d77b1d9-b07d-5cf4-aa0b-750046773bc8",
110
+ "key": "visible",
111
+ "label": "Visible",
112
+ "category": "content",
113
+ "subCategory": "general",
114
+ "type": "toggle",
115
+ "value": true,
116
+ "exposed": true
117
+ },
118
+ {
119
+ "id": "6a2a1890-1363-5d87-ad8f-bbc12e5f5621",
120
+ "key": "name",
121
+ "label": "Name",
122
+ "category": "content",
123
+ "subCategory": "general",
124
+ "type": "input",
125
+ "value": "Textarea",
126
+ "hasTopDivider": true,
127
+ "exposed": true,
128
+ "events": [
129
+ "REMAP",
130
+ "EMIT_ELEMENTS_UPDATE"
131
+ ]
132
+ },
133
+ {
134
+ "id": "828dce18-ea46-5c35-98eb-336f99c9914c",
135
+ "key": "id",
136
+ "label": "ID",
137
+ "placeholder": "Add ID here",
138
+ "category": "content",
139
+ "subCategory": "general",
140
+ "type": "copyable-input",
141
+ "value": "textarea",
142
+ "exposed": true
143
+ },
144
+ {
145
+ "id": "898ff157-0e88-5c37-941d-8c55d4e2c220",
146
+ "key": "required",
147
+ "label": "Required",
148
+ "category": "content",
149
+ "subCategory": "validation",
150
+ "type": "toggle",
151
+ "value": false,
152
+ "exposed": true
153
+ },
154
+ {
155
+ "id": "807e7681-87f0-525e-b522-12d217e80764",
156
+ "key": "regex",
157
+ "label": "Regex",
158
+ "placeholder": "Add regex for validation here",
159
+ "category": "content",
160
+ "subCategory": "validation",
161
+ "type": "input",
162
+ "value": "",
163
+ "exposed": true
164
+ },
165
+ {
166
+ "id": "7bae3a4b-f69a-5977-bc39-f4ecd935d6e7",
167
+ "key": "type",
168
+ "label": "",
169
+ "category": "content",
170
+ "subCategory": "general",
171
+ "type": "hidden",
172
+ "value": "textarea"
173
+ },
174
+ {
175
+ "id": "e69b9858-b9c2-57f9-977a-ed2ad0e2794e",
176
+ "key": "onInputEvents",
177
+ "label": "onInput",
178
+ "category": "content",
179
+ "subCategory": "events",
180
+ "type": "field-events",
181
+ "value": null
182
+ },
183
+ {
184
+ "id": "4a947b5f-af98-52b7-afe8-00162f29685a",
185
+ "key": "onFocusEvents",
186
+ "label": "onFocus",
187
+ "category": "content",
188
+ "subCategory": "events",
189
+ "type": "field-events",
190
+ "value": null
191
+ },
192
+ {
193
+ "id": "1aa29a1b-bda4-5b4d-b7ee-00a0a6441388",
194
+ "key": "onBlurEvents",
195
+ "label": "onBlur",
196
+ "category": "content",
197
+ "subCategory": "events",
198
+ "type": "field-events",
199
+ "value": null
200
+ },
201
+ {
202
+ "id": "4ae8796c-47d4-581e-ae4b-9696c5bb1991",
203
+ "key": "style",
204
+ "label": "Style",
205
+ "category": "styling",
206
+ "subCategory": "general",
207
+ "type": "hidden",
208
+ "value": []
209
+ }
210
+ ],
211
+ "parentId": null,
212
+ "section": "body"
213
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "_README": "FALLBACK enum -> string-value map for sync_from_mock.py. The AUTHORITATIVE source is docs_info/form-config-enums.ts (the frontend's real enums, parsed directly); this file is used only if that TS file is absent, and as a manual override for members not in it. ElementType and ElementCategory are NOT here: they are defined inside FormBuilder mock.ts and parsed from it directly (authoritative). The four ElementConfig* enums are imported by the mock from '../config' (not shipped), so their values are resolved here. Members listed below are AUTHORITATIVE (verified against real goldens, or known exceptions). Any member used by the mock but NOT listed here is resolved by the fallback rule and reported as UNVERIFIED -- get the real value from the frontend (see UNVERIFIED-ENUMS-QUESTION.md) and paste it here, then re-run.",
3
+ "_fallback_rule": "MEMBER_NAME.lower().replace('_','-') e.g. SOURCE_TYPE -> source-type",
4
+ "_exceptions_proving_the_rule_is_not_enough": {
5
+ "READONLY_OR_DISABLED_TOGGLE": "value is 'readonly-or-disabled' (the _TOGGLE suffix is dropped)",
6
+ "CONTOLS": "frontend enum identifier is misspelled; value is correctly 'controls'"
7
+ },
8
+ "ElementConfigCategory": {
9
+ "CONTENT": "content",
10
+ "STYLING": "styling"
11
+ },
12
+ "ElementConfigEvent": {
13
+ "REMAP": "REMAP",
14
+ "EMIT_INPUT": "EMIT_INPUT",
15
+ "EMIT_ELEMENTS_UPDATE": "EMIT_ELEMENTS_UPDATE"
16
+ },
17
+ "ElementConfigSubCategory": {
18
+ "GENERAL": "general",
19
+ "VALIDATION": "validation",
20
+ "EVENTS": "events",
21
+ "ACTION": "action",
22
+ "APPROVALS": "approvals",
23
+ "DATA_SOURCE": "data-source",
24
+ "TASK_ASSIGNEE": "task-assignee",
25
+ "CONTOLS": "controls",
26
+ "RULES": "rules"
27
+ },
28
+ "ElementConfigType": {
29
+ "INPUT": "input",
30
+ "NUMBER_INPUT": "number-input",
31
+ "TEXTAREA": "textarea",
32
+ "SELECT": "select",
33
+ "TOGGLE": "toggle",
34
+ "HIDDEN": "hidden",
35
+ "COPYABLE_INPUT": "copyable-input",
36
+ "INPUT_TYPE_SELECT": "input-type-select",
37
+ "READONLY_OR_DISABLED_TOGGLE": "readonly-or-disabled",
38
+ "FIELD_EVENTS": "field-events",
39
+ "TEMPLATE_ONLY": "template-only",
40
+ "BUTTON_SUBMIT_TOGGLE": "button-submit-toggle",
41
+ "CLEARABLE_SELECT": "clearable-select",
42
+ "SOURCE_TYPE": "source-type",
43
+ "SOURCE_VALUE": "source-value",
44
+ "DATETIME_DEFAULT_VALUE": "datetime-default-value",
45
+ "DATE_TIME_MODE_SELECT": "date-time-mode-select",
46
+ "ICON_PICKER": "icon-picker",
47
+ "DROPDOWN_ITEMS": "dropdown-items",
48
+ "USER_SELECT": "user-select",
49
+ "APPROVER_REPLACEMENT": "approver-replacement",
50
+ "ASSIGNEE_REPLACEMENT": "assignee-replacement",
51
+ "UPLOAD_FILE_TYPE_SELECT": "upload-file-type-select",
52
+ "VIEW_FILE_TYPE_SELECT": "view-file-type-select",
53
+ "VIEWER_TYPE_RADIO": "viewer-type-radio",
54
+ "URL_OR_FILE": "url-or-file",
55
+ "URL_TARGET_SELECT": "url-target-select",
56
+ "OPEN_SIDE_PANEL_BUTTON": "open-side-panel-button",
57
+ "FUNCTION": "function",
58
+ "HTML_CODE_EDITOR": "html-code-editor",
59
+ "COLUMN_LIST": "column-list",
60
+ "ROW_LIST": "row-list",
61
+ "TAB_LIST": "tab-list",
62
+ "ROW_CELL_APPROVALS": "row-cell-approvals",
63
+ "RULES_VISIBILITY": "rules-visibility",
64
+ "TABLE_COLUMNS_SOURCE_TYPE": "table-columns-source-type",
65
+ "TABLE_COLUMNS_SOURCE_VALUE": "table-columns-source-value",
66
+ "TABLE_PAGINATION": "table-pagination"
67
+ }
68
+ }
@@ -0,0 +1,284 @@
1
+ """The one definition of a form FIELD VALUE PATH — how it is built, and what makes one valid.
2
+
3
+ A process addresses a form field by a four-segment path:
4
+
5
+ {formDataModelRootId}.{FIELDS_NS}.{elementId}.{valueConfigId}
6
+
7
+ Two places produce such a path and they must not drift: the DTO builder writes them while
8
+ BUILDING a form from a config (it knows every id it just minted), and `form-set-element-event`
9
+ has to check or produce them against a LIVE form it fetched. The builder's rule lived only in
10
+ its own build pass, so the surgical action could not reuse it and simply passed whatever the
11
+ caller sent straight through.
12
+
13
+ Why a wrong path is worth this much code: nothing rejects it. The API accepts the row and
14
+ answers `updated: true`, the designer renders the mapping, and the control silently launches
15
+ nothing — measured across five autonomous builds, every one of which wrote
16
+ `root.fields.<elementId>.value`, substituting the NAMES from the guide's tree diagram for the
17
+ ids printed beside them. There is no error to read, so the only place the mistake can be caught
18
+ is before the write.
19
+ """
20
+ from __future__ import annotations
21
+
22
+ from tools.procesio.errors import UsageError
23
+
24
+ # The platform's "fields" container id. Constant across every form (verified against real
25
+ # production forms); it is not read from the form and must not be.
26
+ FIELDS_NS = "11223344-5566-7788-99aa-aabbccddeeff"
27
+
28
+ # The config key that carries a control's value, where it is not `value`. A `file-viewer` has
29
+ # no `value` config at all — its content lives in `src` (type url-or-file).
30
+ VALUE_CONFIG_KEY = {"file-viewer": "src"}
31
+
32
+ SEGMENTS = 4
33
+
34
+
35
+ def value_key(el_type) -> str:
36
+ """The config key holding this control's field value."""
37
+ return VALUE_CONFIG_KEY.get(el_type, "value")
38
+
39
+
40
+ def build(root_id: str, element_id: str, value_config_id: str) -> str:
41
+ return f"{root_id}.{FIELDS_NS}.{element_id}.{value_config_id}"
42
+
43
+
44
+ def looks_like_path(value) -> bool:
45
+ """A caller that sent a path rather than a field name — right or wrong.
46
+
47
+ Deliberately shape-only: this asks WHICH branch to take, never whether the path is
48
+ correct. Treating "has dots" as "is valid" is exactly the hole that let the invented
49
+ `root.fields.<id>.value` through untouched.
50
+ """
51
+ return isinstance(value, str) and value.count(".") == SEGMENTS - 1
52
+
53
+
54
+ def _config_id(element: dict, key: str):
55
+ for c in element.get("configs") or []:
56
+ if c.get("key") == key:
57
+ return c.get("id")
58
+ return None
59
+
60
+
61
+ def _name_of(element: dict):
62
+ for c in element.get("configs") or []:
63
+ if c.get("key") == "name":
64
+ v = str(c.get("value") or "").strip()
65
+ return v or None
66
+ return None
67
+
68
+
69
+ class LiveForm:
70
+ """The field index of a form as it exists on the server: what its root is, which
71
+ elements it has, and each one's value-config id."""
72
+
73
+ def __init__(self, form: dict):
74
+ data = (form or {}).get("data") or {}
75
+ self.root_id = str(((data.get("dataModel") or {}).get("id")) or "")
76
+ self.elements = data.get("elements") or []
77
+ self.by_id: dict[str, dict] = {}
78
+ self.by_name: dict[str, list[dict]] = {}
79
+ for el in self.elements:
80
+ eid = el.get("id")
81
+ if not eid:
82
+ continue
83
+ self.by_id[str(eid)] = el
84
+ name = _name_of(el)
85
+ if name:
86
+ self.by_name.setdefault(name, []).append(el)
87
+ # Form variables (Offer_ID, isConfirmed…) are mapped by their own id, and the form's
88
+ # data model also carries the platform's `instance` tree (instance.currentUser.email…),
89
+ # addressed as root.<attr id>.<attr id>…; both are as valid on a map row as a field.
90
+ self.variables: dict[str, dict] = {}
91
+ self.variable_ids: dict[str, dict] = {}
92
+ for v in data.get("variables") or []:
93
+ if not v.get("id") or not v.get("name") or v.get("name") == "form":
94
+ continue # `form` is the data-model handle, not a value
95
+ self.variables[str(v["name"])] = v
96
+ self.variable_ids[str(v["id"])] = v
97
+ self.model = data.get("dataModel") or {}
98
+
99
+ def is_variable(self, value) -> bool:
100
+ return isinstance(value, str) and value in self.variable_ids
101
+
102
+ def variable_for(self, value):
103
+ """`@Name`, or a bare name no field carries, or the variable's id -> the variable."""
104
+ if not isinstance(value, str):
105
+ return None
106
+ if value.startswith("@"):
107
+ return self.variables.get(value[1:])
108
+ if value in self.variable_ids:
109
+ return self.variable_ids[value]
110
+ if value not in self.by_name:
111
+ return self.variables.get(value)
112
+ return None
113
+
114
+ def model_path(self, value):
115
+ """A dotted NAME path into the form's data model (instance.currentUser.email) -> its
116
+ id path, or None when the first name is not a top-level attribute of the model."""
117
+ if not isinstance(value, str) or "." not in value or not self.root_id:
118
+ return None
119
+ names = value.split(".")
120
+ attrs, ids = self.model.get("attributes") or [], []
121
+ for i, nm in enumerate(names):
122
+ hit = next((a for a in attrs if a.get("name") == nm), None)
123
+ if hit is None:
124
+ if i == 0:
125
+ return None
126
+ known = ", ".join(sorted(a.get("name", "") for a in attrs)) or "(none)"
127
+ raise UsageError(f"{value!r}: {nm!r} is not an attribute of "
128
+ f"{'.'.join(names[:i])!r}; it has: {known}")
129
+ ids.append(str(hit["id"]))
130
+ attrs = hit.get("attributes") or []
131
+ return ".".join([self.root_id] + ids)
132
+
133
+ def _model_ids_ok(self, path: str) -> bool:
134
+ parts = str(path).split(".")
135
+ if len(parts) < 2 or parts[0] != self.root_id or parts[1] == FIELDS_NS:
136
+ return False
137
+ attrs = self.model.get("attributes") or []
138
+ for pid in parts[1:]:
139
+ hit = next((a for a in attrs if str(a.get("id")) == pid), None)
140
+ if hit is None:
141
+ return False
142
+ attrs = hit.get("attributes") or []
143
+ return True
144
+
145
+ def value_config_id(self, element: dict):
146
+ return _config_id(element, value_key(element.get("type")))
147
+
148
+ def field_names(self) -> list[str]:
149
+ """Names of the elements that can actually carry a value — the only ones a map row
150
+ may point at, so an error message must not offer the others."""
151
+ return sorted(n for n, els in self.by_name.items()
152
+ if any(self.value_config_id(e) for e in els))
153
+
154
+ def path_for_name(self, name: str) -> str:
155
+ els = self.by_name.get(name) or []
156
+ if not els:
157
+ raise UsageError(
158
+ f"{name!r} is not a field on this form. Fields that can carry a value: "
159
+ f"{', '.join(self.field_names()) or '(none)'}")
160
+ if len(els) > 1:
161
+ raise UsageError(
162
+ f"{len(els)} elements are named {name!r}; pass the element id or the full "
163
+ f"value path instead")
164
+ el = els[0]
165
+ vcid = self.value_config_id(el)
166
+ if not vcid:
167
+ raise UsageError(
168
+ f"element {name!r} (type {el.get('type')!r}) has no "
169
+ f"{value_key(el.get('type'))!r} config, so it holds no value and cannot be "
170
+ f"mapped")
171
+ return build(self.root_id, str(el["id"]), str(vcid))
172
+
173
+ def element(self, ref: str) -> dict:
174
+ """One element by id, else by its unique `name` config."""
175
+ if ref in self.by_id:
176
+ return self.by_id[ref]
177
+ els = self.by_name.get(ref) or []
178
+ if len(els) == 1:
179
+ return els[0]
180
+ if not els:
181
+ raise UsageError(f"{ref!r} is not an element on this form (by id or name)")
182
+ raise UsageError(f"{len(els)} elements are named {ref!r}; pass the element id instead")
183
+
184
+ def config_path(self, ref: str, key: str) -> str:
185
+ """The path of ANY config of an element (`disabled`, `visible`, `label`…), not only its
186
+ value. A MAP_FORM_DATA row and a condition address a config the same way a process
187
+ addresses the value: the fourth segment is that config's own id, which the data model
188
+ reuses as the attribute id. Same failure mode as a wrong value path, so same refusal."""
189
+ el = self.element(ref)
190
+ cid = _config_id(el, key)
191
+ if not cid:
192
+ keys = ", ".join(c.get("key", "") for c in el.get("configs") or []
193
+ if not str(c.get("key", "")).startswith("on"))
194
+ raise UsageError(f"element {ref!r} (type {el.get('type')!r}) has no {key!r} config; "
195
+ f"it has: {keys}")
196
+ return build(self.root_id, str(el["id"]), str(cid))
197
+
198
+ def check(self, path: str, where: str) -> None:
199
+ """Raise unless `path` addresses a real value-bearing field of THIS form.
200
+
201
+ Every segment is checked against the live form and the message names the right
202
+ answer: a caller that guessed the shape has no other way to learn it, because the
203
+ platform accepts the wrong one without complaint.
204
+ """
205
+ parts = str(path).split(".")
206
+ problems: list[str] = []
207
+ if len(parts) != SEGMENTS:
208
+ raise UsageError(
209
+ f"{where}: {path!r} is not a form value path. It must have {SEGMENTS} "
210
+ f"segments: {{formDataModelRootId}}.{{FIELDS_NS}}.{{elementId}}."
211
+ f"{{valueConfigId}} — or pass the field NAME instead and it will be "
212
+ f"resolved for you. Fields: {', '.join(self.field_names()) or '(none)'}")
213
+
214
+ root, ns, element_id, value_id = parts
215
+ if root != self.root_id:
216
+ problems.append(f"segment 1 {root!r} must be this form's data-model root "
217
+ f"{self.root_id!r}")
218
+ if ns != FIELDS_NS:
219
+ problems.append(f"segment 2 {ns!r} must be the fields container id {FIELDS_NS!r}")
220
+
221
+ element = self.by_id.get(element_id)
222
+ if element is None:
223
+ problems.append(f"segment 3 {element_id!r} is not an element on this form")
224
+ else:
225
+ expected = self.value_config_id(element)
226
+ own_configs = {str(c.get("id")) for c in element.get("configs") or [] if c.get("id")}
227
+ if value_id in own_configs and value_id != str(expected):
228
+ pass # a config of THIS element (label, visible, src…)
229
+ elif not expected:
230
+ problems.append(
231
+ f"segment 3 {element_id!r} is a {element.get('type')!r}, which has no "
232
+ f"{value_key(element.get('type'))!r} config and holds no value")
233
+ elif value_id != str(expected):
234
+ # The subtle one: four guid-shaped segments, but the value id belongs to a
235
+ # different element. Nothing downstream notices.
236
+ problems.append(f"segment 4 {value_id!r} must be that element's own "
237
+ f"{value_key(element.get('type'))!r} config id {expected!r}")
238
+
239
+ if not problems:
240
+ return
241
+
242
+ hint = ""
243
+ if element is not None and self.value_config_id(element):
244
+ correct = build(self.root_id, element_id, str(self.value_config_id(element)))
245
+ name = _name_of(element)
246
+ hint = f"\n correct path: {correct}"
247
+ if name:
248
+ hint += f"\n or just pass the field name: {name}"
249
+ else:
250
+ hint = ("\n pass the field NAME instead and it will be resolved: "
251
+ + (", ".join(self.field_names()) or "(no value-bearing fields)"))
252
+
253
+ raise UsageError(f"{where}: {path!r} is not a valid value path on this form.\n "
254
+ + "\n ".join(problems) + hint)
255
+
256
+ def resolve(self, value, where: str) -> str:
257
+ """A map row's form side -> a validated value path.
258
+
259
+ Three inputs, three outcomes: a known field NAME is built into its path; a path is
260
+ checked and passed through; anything else is refused with the field list. The middle
261
+ case is the one that matters — it is what every observed failure sent.
262
+ """
263
+ if isinstance(value, str) and value in self.by_name and not value.startswith("@"):
264
+ return self.path_for_name(value)
265
+ var = self.variable_for(value)
266
+ if var is not None:
267
+ return str(var["id"])
268
+ if isinstance(value, str) and self._model_ids_ok(value):
269
+ return value # an id path into the instance tree, already valid
270
+ if isinstance(value, str) and value.count(".") == 1:
271
+ ref, key = value.split(".")
272
+ if ref in self.by_id or ref in self.by_name: # Paragraph9.label, Section3.visible
273
+ return self.config_path(ref, key)
274
+ mp = self.model_path(value)
275
+ if mp is not None:
276
+ return mp
277
+ if looks_like_path(value):
278
+ self.check(value, where)
279
+ return value
280
+ raise UsageError(
281
+ f"{where}: {value!r} is neither a field on this form, a form variable (@name), a "
282
+ f"data-model path (instance.currentUser.email) nor a full value path. "
283
+ f"Fields that can carry a value: {', '.join(self.field_names()) or '(none)'}; "
284
+ f"variables: {', '.join(sorted(self.variables)) or '(none)'}")
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "Reg",
3
+ "browserTitle": "Register",
4
+ "type": "general",
5
+ "elements": [
6
+ {
7
+ "type": "heading",
8
+ "label": "Title"
9
+ },
10
+ {
11
+ "type": "input",
12
+ "label": "Full Name",
13
+ "name": "fullName",
14
+ "required": true,
15
+ "placeholder": "John"
16
+ },
17
+ {
18
+ "type": "select",
19
+ "label": "Country",
20
+ "name": "country",
21
+ "options": [
22
+ "RO",
23
+ "US"
24
+ ]
25
+ },
26
+ {
27
+ "type": "button",
28
+ "label": "Submit",
29
+ "submit": true
30
+ }
31
+ ]
32
+ }