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,275 @@
1
+ """Full data-model (DataType) lifecycle actions beyond create/edit.
2
+
3
+ Mirrors how the PROCESIO UI works with data models (HAR-verified, see the
4
+ `procesio-datatype-create` memory note):
5
+
6
+ - `datatype-create` / `datatype-edit` (dto_actions) build a model attribute-by-attribute
7
+ via POST /api/dataTypes/attribute/{id} — the path that COMPILES attributes into the
8
+ runtime model and keeps referenced sub-models REUSABLE in other models.
9
+ - `datatype-create` with `fromJson` infers a model from a JSON sample; its nested inner
10
+ models are created PRIVATE (NOT reusable in other models) until promoted.
11
+ - `datatype-change-to-public` promotes a private inner model to PUBLIC (reusable).
12
+ - `datatype-clone` clones an inner model.
13
+ - `datatype-add-attribute` / `-edit-attribute` / `-delete-attribute` operate on one attr.
14
+ - `datatype-get` / `datatype-delete` read / remove a model.
15
+
16
+ JSON in / JSON out; impure (live client). The v1.19 surface is /api/DataTypes/*.
17
+ """
18
+ from __future__ import annotations
19
+
20
+ import argparse
21
+ import re
22
+
23
+ from tools.procesio.actiondef import ActionDef
24
+ from tools.procesio.dto import refdata
25
+ from tools.procesio.errors import UsageError
26
+ from tools.procesio.handlers.common import add_profile_arg
27
+
28
+ _GUID = re.compile(r"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-"
29
+ r"[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")
30
+
31
+
32
+ def _bool_opt(s) -> bool:
33
+ return str(s).strip().lower() in ("1", "true", "yes", "y", "on")
34
+
35
+
36
+ def _resolve_data_type(client, value: str) -> str:
37
+ """Resolve a data-type reference to its id: a primitive name (string/integer/…),
38
+ an existing model name (looked up live), or a guid (used as-is)."""
39
+ v = (value or "").strip()
40
+ if not v:
41
+ raise UsageError("--data-type is required")
42
+ if _GUID.match(v):
43
+ return v
44
+ try:
45
+ return refdata.primitive_type_id(v)
46
+ except KeyError:
47
+ pass
48
+ r = client.get("/api/DataTypes", {"pageNumber": 1, "pageItemCount": 1000,
49
+ "includeProcesioEntries": True, "includeExternalEntries": True})
50
+ items = r.get("pageItems") if isinstance(r, dict) else r
51
+ for it in items or []:
52
+ if (it.get("name") or it.get("Name") or "").strip().lower() == v.lower():
53
+ return it.get("id") or it.get("Id")
54
+ raise UsageError(f"unknown data type {value!r} (not a primitive, a guid, or an existing model name)")
55
+
56
+
57
+ def _attr_summary(model: dict) -> list:
58
+ return [{"id": a.get("id"), "name": a.get("name"), "dataTypeId": a.get("dataTypeId"),
59
+ "isList": a.get("isList"), "isDataModel": a.get("isDataModel"),
60
+ "inlinedChildren": len(a.get("attributes") or [])}
61
+ for a in (model.get("attributes") or [])]
62
+
63
+
64
+ # -- model get / delete -------------------------------------------------------
65
+
66
+ def get_datatype(client, args) -> dict:
67
+ return {"result": client.get(f"/api/DataTypes/{args.id}")}
68
+
69
+
70
+ def delete_datatype(client, args) -> dict:
71
+ client.request("DELETE", f"/api/DataTypes/{args.id}")
72
+ return {"deleted": True, "id": args.id}
73
+
74
+
75
+ # -- attribute add / edit / delete -------------------------------------------
76
+
77
+ def _store_built_on_model(client, model_id: str):
78
+ """Best-effort: the id of a data store whose data-model IS `model_id`, else None.
79
+
80
+ B-048 cluster 4a reported that adding an attribute to such a model DESTROYS the store
81
+ (both POSTs return ok, then columns read `[]` and rows go unreadable). Re-tested on a
82
+ real from-data-model store (2026-09) it did NOT reproduce, so the caller only WARNS on a
83
+ match, never refuses. The store's own data-model id (a from-data-model store gets a COPY
84
+ model, distinct from the source) is what matches here — verified live against
85
+ `GET /api/DataStore/{id}/data-model`. Fail-OPEN: any read error/unknown shape -> None,
86
+ so a transient hiccup never even warns.
87
+ """
88
+ try:
89
+ listing = client.get("/api/DataStore") or {}
90
+ except Exception: # noqa: BLE001 - advisory guard, never fatal
91
+ return None
92
+ stores = listing if isinstance(listing, list) else (
93
+ listing.get("data") or listing.get("pageItems") or listing.get("items") or [])
94
+ for s in stores if isinstance(stores, list) else []:
95
+ sid = (s.get("id") or s.get("dataStoreId")) if isinstance(s, dict) else None
96
+ if not sid:
97
+ continue
98
+ try:
99
+ dm = client.get(f"/api/DataStore/{sid}/data-model") or {}
100
+ except Exception: # noqa: BLE001
101
+ continue
102
+ mid = dm.get("id") or dm.get("dataTypeId") or (dm.get("dataModel") or {}).get("id")
103
+ if mid and str(mid) == str(model_id):
104
+ return sid
105
+ return None
106
+
107
+
108
+ def add_attribute(client, args) -> dict:
109
+ """Add ONE attribute via POST /api/dataTypes/attribute/{id} — the only path that
110
+ COMPILES the attribute into the runtime model (and inlines a referenced child model
111
+ + links its parentIds). --data-type accepts a primitive name, an existing model name,
112
+ or a guid; --is-list makes it a list of that type.
113
+
114
+ WARNS (non-blocking) when the model backs a data store: B-048 cluster 4a reported that
115
+ such an add DESTROYS the store, but re-testing on a real from-data-model store (2026-09)
116
+ did NOT reproduce it — the store kept its columns and rows — so this is a caution, not a
117
+ refusal. --force suppresses the warning."""
118
+ warning = None
119
+ if not getattr(args, "force", False):
120
+ store = _store_built_on_model(client, args.id)
121
+ if store:
122
+ warning = (
123
+ f"model {args.id} backs data store {store}. B-048 cluster 4a reported that "
124
+ f"adding an attribute to a store-backing model DESTROYS the store (columns "
125
+ f"read [], rows unreadable), but a real from-data-model store re-tested "
126
+ f"2026-09 SURVIVED this exact add, so treat it as a caution rather than a "
127
+ f"certainty: re-read the store (datastore-get / get-rows) and confirm its "
128
+ f"columns and rows afterwards. --force suppresses this warning.")
129
+ dtid = _resolve_data_type(client, args.data_type)
130
+ payload = {"id": None, "name": args.name,
131
+ "displayName": args.display_name or args.name, "dataTypeId": dtid,
132
+ "isList": bool(args.is_list), "jsonProperty": args.json_property or args.name,
133
+ "parentDataTypeId": args.id}
134
+ if args.hidden:
135
+ payload["hidden"] = True
136
+ if args.public:
137
+ payload["isPublic"] = True
138
+ client.post(f"/api/DataTypes/attribute/{args.id}", payload)
139
+ model = client.get(f"/api/DataTypes/{args.id}")
140
+ out = {"added": True, "model": args.id, "attribute": args.name,
141
+ "attributes": _attr_summary(model)}
142
+ if warning:
143
+ out["warning"] = warning
144
+ return out
145
+
146
+
147
+ def edit_attribute(client, args) -> dict:
148
+ """Edit an existing attribute via PUT /api/dataTypes/attribute/{id} (full object).
149
+ --attribute is the attribute id or its current name; only the flags you pass change."""
150
+ model = client.get(f"/api/DataTypes/{args.id}")
151
+ attr = next((a for a in (model.get("attributes") or [])
152
+ if a.get("id") == args.attribute
153
+ or (a.get("name") or "").lower() == str(args.attribute).lower()), None)
154
+ if not attr:
155
+ raise UsageError(f"model {args.id} has no attribute {args.attribute!r}")
156
+ if args.name:
157
+ attr["name"] = args.name
158
+ if args.display_name:
159
+ attr["displayName"] = args.display_name
160
+ if args.data_type:
161
+ attr["dataTypeId"] = _resolve_data_type(client, args.data_type)
162
+ if args.is_list is not None:
163
+ attr["isList"] = bool(args.is_list)
164
+ if args.json_property:
165
+ attr["jsonProperty"] = args.json_property
166
+ if args.hidden is not None:
167
+ attr["hidden"] = bool(args.hidden)
168
+ if args.public is not None:
169
+ attr["isPublic"] = bool(args.public)
170
+ client.put(f"/api/DataTypes/attribute/{args.id}", attr)
171
+ return {"edited": True, "model": args.id, "attribute": attr.get("name"),
172
+ "attributes": _attr_summary(client.get(f"/api/DataTypes/{args.id}"))}
173
+
174
+
175
+ def delete_attribute(client, args) -> dict:
176
+ model = client.get(f"/api/DataTypes/{args.id}")
177
+ attr = next((a for a in (model.get("attributes") or [])
178
+ if a.get("id") == args.attribute
179
+ or (a.get("name") or "").lower() == str(args.attribute).lower()), None)
180
+ if not attr:
181
+ raise UsageError(f"model {args.id} has no attribute {args.attribute!r}")
182
+ client.request("DELETE", f"/api/DataTypes/attribute/{args.id}/{attr.get('id')}")
183
+ return {"deleted": True, "model": args.id, "attribute": attr.get("name")}
184
+
185
+
186
+ # -- promote private inner model / clone -------------------------------------
187
+
188
+ def change_to_public(client, args) -> dict:
189
+ """Promote a PRIVATE inner data model (one created by `fromJson`) to PUBLIC so it can
190
+ be reused in other models. --root-id = the top/root model id, --id = the inner id."""
191
+ client.post("/api/DataTypes/changeToPublic",
192
+ {"rootDataTypeId": args.root_id, "dataTypeId": args.id})
193
+ return {"changedToPublic": True, "rootDataTypeId": args.root_id, "dataTypeId": args.id,
194
+ "result": client.get(f"/api/DataTypes/{args.id}")}
195
+
196
+
197
+ def clone_datatype(client, args) -> dict:
198
+ """Clone an inner data model. --root-id = the top/root model id, --id = the inner id."""
199
+ resp = client.post("/api/DataTypes/clone",
200
+ {"rootDataTypeId": args.root_id, "dataTypeId": args.id})
201
+ return {"cloned": True, "rootDataTypeId": args.root_id, "dataTypeId": args.id, "result": resp}
202
+
203
+
204
+ # -- argparse -----------------------------------------------------------------
205
+
206
+ def _id_args(p: argparse.ArgumentParser) -> None:
207
+ add_profile_arg(p)
208
+ p.add_argument("--id", required=True, help="data model id")
209
+
210
+
211
+ def _add_attr_args(p: argparse.ArgumentParser) -> None:
212
+ add_profile_arg(p)
213
+ p.add_argument("--id", required=True, help="parent model id")
214
+ p.add_argument("--name", required=True, help="attribute name")
215
+ p.add_argument("--data-type", dest="data_type", required=True,
216
+ help="primitive name (string/integer/…), an existing model name, or a guid")
217
+ p.add_argument("--is-list", dest="is_list", action="store_true",
218
+ help="attribute holds a list of the type")
219
+ p.add_argument("--display-name", dest="display_name")
220
+ p.add_argument("--json-property", dest="json_property", help="JSON key (defaults to name)")
221
+ p.add_argument("--hidden", action="store_true")
222
+ p.add_argument("--public", action="store_true", help="mark the attribute isPublic")
223
+ p.add_argument("--force", action="store_true",
224
+ help="suppress the store-backing caution (B-048 cluster 4a)")
225
+
226
+
227
+ def _edit_attr_args(p: argparse.ArgumentParser) -> None:
228
+ add_profile_arg(p)
229
+ p.add_argument("--id", required=True, help="parent model id")
230
+ p.add_argument("--attribute", required=True, help="attribute id or current name")
231
+ p.add_argument("--name")
232
+ p.add_argument("--display-name", dest="display_name")
233
+ p.add_argument("--data-type", dest="data_type", help="new type (primitive/model/guid)")
234
+ p.add_argument("--json-property", dest="json_property")
235
+ p.add_argument("--is-list", dest="is_list", type=_bool_opt, default=None,
236
+ help="true/false (omit to leave unchanged)")
237
+ p.add_argument("--hidden", type=_bool_opt, default=None, help="true/false")
238
+ p.add_argument("--public", type=_bool_opt, default=None, help="isPublic true/false")
239
+
240
+
241
+ def _del_attr_args(p: argparse.ArgumentParser) -> None:
242
+ add_profile_arg(p)
243
+ p.add_argument("--id", required=True, help="parent model id")
244
+ p.add_argument("--attribute", required=True, help="attribute id or current name")
245
+
246
+
247
+ def _promote_args(p: argparse.ArgumentParser) -> None:
248
+ add_profile_arg(p)
249
+ p.add_argument("--root-id", dest="root_id", required=True, help="root/top model id")
250
+ p.add_argument("--id", required=True, help="inner model id to promote/clone")
251
+
252
+
253
+ ACTIONS = {
254
+ "datatype-get": ActionDef(
255
+ func=get_datatype, add_args=_id_args, needs_client=True,
256
+ description="Get a data model with its attributes (GET /api/DataTypes/{id})."),
257
+ "datatype-delete": ActionDef(
258
+ func=delete_datatype, add_args=_id_args, needs_client=True,
259
+ description="Delete a data model (DELETE /api/DataTypes/{id})."),
260
+ "datatype-add-attribute": ActionDef(
261
+ func=add_attribute, add_args=_add_attr_args, needs_client=True,
262
+ description="Add one attribute to a model — compiles it; a model-typed attr inlines the child + keeps it reusable."),
263
+ "datatype-edit-attribute": ActionDef(
264
+ func=edit_attribute, add_args=_edit_attr_args, needs_client=True,
265
+ description="Edit one attribute (PUT /api/dataTypes/attribute/{id})."),
266
+ "datatype-delete-attribute": ActionDef(
267
+ func=delete_attribute, add_args=_del_attr_args, needs_client=True,
268
+ description="Delete one attribute (DELETE /api/dataTypes/attribute/{id}/{attrId})."),
269
+ "datatype-change-to-public": ActionDef(
270
+ func=change_to_public, add_args=_promote_args, needs_client=True,
271
+ description="Promote a private inner model (from fromJson) to public so it's reusable (POST /api/DataTypes/changeToPublic)."),
272
+ "datatype-clone": ActionDef(
273
+ func=clone_datatype, add_args=_promote_args, needs_client=True,
274
+ description="Clone an inner data model (POST /api/DataTypes/clone)."),
275
+ }
@@ -0,0 +1,258 @@
1
+ """Generic <component>-create / <component>-edit actions for the DTO sub-tools.
2
+
3
+ One pair per registered component (dto/registry.py). Each:
4
+ - validates --config against the component's JSON Schema (fail-fast),
5
+ - builds the full DTO by merging onto the golden template (pure),
6
+ - --dry-run: returns the built DTO (+ validate@source oracle if any), sends nothing,
7
+ - otherwise create (POST) or edit (desired-state), then re-GET and return it.
8
+ """
9
+ from __future__ import annotations
10
+
11
+ import argparse
12
+ import json
13
+
14
+ from tools.procesio.actiondef import ActionDef
15
+ from tools.procesio.dto import framework, registry
16
+ from tools.procesio.errors import UsageError
17
+ from tools.procesio.handlers.common import add_profile_arg
18
+
19
+
20
+ def _load_config(args) -> dict:
21
+ raw = None
22
+ if getattr(args, "config_file", None):
23
+ with open(args.config_file, encoding="utf-8") as f:
24
+ raw = f.read()
25
+ elif getattr(args, "config", None):
26
+ raw = args.config
27
+ if raw is None:
28
+ raise UsageError("provide --config '<json>' or --config-file <path>")
29
+ try:
30
+ cfg = json.loads(raw)
31
+ except json.JSONDecodeError as e:
32
+ raise UsageError(f"--config must be valid JSON: {e}") from e
33
+ if not isinstance(cfg, dict):
34
+ raise UsageError("--config must be a JSON object")
35
+ return cfg
36
+
37
+
38
+ def _add_gate_args(p: argparse.ArgumentParser) -> None:
39
+ """Shared save-gate flags (process only enforces them; harmless elsewhere)."""
40
+ p.add_argument("--force", action="store_true",
41
+ help="bypass the pre-save FE (designer) + BE validation gate")
42
+ p.add_argument("--no-types", dest="no_types", action="store_true",
43
+ help="skip the advisory data-type-mismatch (warning) layer in the gate")
44
+
45
+
46
+ def _create_args(p: argparse.ArgumentParser) -> None:
47
+ add_profile_arg(p)
48
+ p.add_argument("--config", help="resource config as a JSON object")
49
+ p.add_argument("--config-file", dest="config_file", help="path to a JSON config file")
50
+ p.add_argument("--dry-run", dest="dry_run", action="store_true",
51
+ help="build + validate the DTO and return it without creating")
52
+ _add_gate_args(p)
53
+
54
+
55
+ def _edit_args(p: argparse.ArgumentParser) -> None:
56
+ add_profile_arg(p)
57
+ p.add_argument("--id", required=True, help="id of the resource to edit")
58
+ p.add_argument("--config", help="desired-state config as a JSON object")
59
+ p.add_argument("--config-file", dest="config_file", help="path to a JSON config file")
60
+ p.add_argument("--dry-run", dest="dry_run", action="store_true",
61
+ help="build the DTO and return it without editing")
62
+ # Separate from --force on purpose: --force answers "save it even though it is
63
+ # invalid"; this answers "yes, delete what the config leaves out". A create has
64
+ # nothing to remove, so the flag is only offered on edit.
65
+ p.add_argument("--allow-remove", dest="allow_remove", action="store_true",
66
+ help="permit this desired-state config to REMOVE actions/variables "
67
+ "the live resource has (refused by default)")
68
+ _add_gate_args(p)
69
+
70
+
71
+ def _make_create(component):
72
+ def func(client, args):
73
+ config = _load_config(args)
74
+ ctx = framework.prepare(component, client, config)
75
+ ctx["_force"] = getattr(args, "force", False)
76
+ ctx["_no_types"] = getattr(args, "no_types", False)
77
+ dto = framework.build_dto(component, config, ctx)
78
+ # Pre-save gate (process): FE designer + BE validation. Raises ValidationBlocked
79
+ # on blocking errors unless --force. For --dry-run we force it open so the report
80
+ # is shown without aborting. Components without a save_gate fall back to the oracle.
81
+ if component.save_gate:
82
+ gate_ctx = {**ctx, "_force": True} if args.dry_run else ctx
83
+ oracle = component.save_gate(client, dto, gate_ctx)
84
+ else:
85
+ oracle = framework.run_validate(component, client, dto, ctx)
86
+ # Non-blocking lint of what is about to be saved (for a form: field names a
87
+ # designer save would rename, phantom parents, ...). Reported, never enforced.
88
+ warnings = component.lint(dto) if component.lint else []
89
+ if args.dry_run:
90
+ out = {"dry_run": True, "component": component.name, "dto": dto,
91
+ "validation": oracle}
92
+ if warnings:
93
+ out["warnings"] = warnings
94
+ return out
95
+ resp = framework.run_create(component, client, dto, ctx)
96
+ rid = component.extract_id(resp, dto)
97
+ verified = framework.run_get(component, client, rid, ctx) if rid else None
98
+ out = {"created": True, "component": component.name, "id": rid,
99
+ "validation": oracle, "result": verified if verified is not None else resp}
100
+ if isinstance(resp, dict) and resp.get("_capture"): # AUTO webhook listen+capture log
101
+ out["capture"] = resp["_capture"]
102
+ if warnings:
103
+ out["warnings"] = warnings
104
+ return out
105
+ return func
106
+
107
+
108
+ def _process_edit_args(p: argparse.ArgumentParser) -> None:
109
+ _edit_args(p)
110
+ p.add_argument("--keep-layout", dest="keep_layout", action="store_true",
111
+ help="keep the current canvas positions and place only new actions "
112
+ "(default: re-arrange the whole canvas, classic engine + clustering, "
113
+ "exactly as process-create does)")
114
+
115
+
116
+ def _make_edit(component):
117
+ def func(client, args):
118
+ config = _load_config(args)
119
+ if getattr(args, "keep_layout", False) and isinstance(config, dict) and "actions" in config:
120
+ config.setdefault("relayout", "new") # processes only: keep positions, place new actions
121
+ ctx = framework.prepare(component, client, config)
122
+ ctx["_force"] = getattr(args, "force", False)
123
+ ctx["_no_types"] = getattr(args, "no_types", False)
124
+ ctx["_allow_remove"] = getattr(args, "allow_remove", False)
125
+ if args.dry_run:
126
+ # Build it the way the EDIT would, so the preview shows the ids the edit would keep.
127
+ dto = framework.build_edit_dto(component, client, args.id, config, ctx)
128
+ out = {"dry_run": True, "edit": True, "component": component.name,
129
+ "id": args.id, "dto": dto}
130
+ warnings = component.lint(dto) if component.lint else []
131
+ if warnings:
132
+ out["warnings"] = warnings
133
+ return out
134
+ if not component.edit:
135
+ raise UsageError(f"{component.name} does not support edit yet")
136
+ framework.validate_config(component, config)
137
+ resp = component.edit(client, args.id, config, ctx)
138
+ out = {"edited": True, "component": component.name, "id": args.id, "result": resp}
139
+ warnings = component.lint(resp) if component.lint else []
140
+ if warnings:
141
+ out["warnings"] = warnings
142
+ return out
143
+ return func
144
+
145
+
146
+ def _payload_docs(comp) -> tuple[dict, list]:
147
+ """The component's OWN schema and a working config, for the manifest.
148
+
149
+ Both are read from the files the component already ships: the schema is the one
150
+ `validate_config` enforces, and the example is a test fixture. Reading them here
151
+ rather than restating them means a caller that only sees the manifest gets the same
152
+ contract the tool enforces, and no second copy exists to fall behind. Absent files
153
+ are not an error - a component without them simply publishes less.
154
+ """
155
+ schema: dict = {}
156
+ try:
157
+ if comp.schema_path.exists():
158
+ schema = {"config": json.loads(comp.schema_path.read_text(encoding="utf-8"))}
159
+ except (OSError, json.JSONDecodeError):
160
+ schema = {}
161
+
162
+ examples: list = []
163
+ fixtures = comp.dir / "fixtures"
164
+ try:
165
+ for f in sorted(fixtures.glob("*.config.json")):
166
+ examples.append(json.loads(f.read_text(encoding="utf-8")))
167
+ break # one worked example is the point, not a corpus
168
+ except (OSError, json.JSONDecodeError):
169
+ examples = []
170
+ return schema, examples
171
+
172
+
173
+ def _list_properties(comp) -> list[str]:
174
+ """The config's top-level LIST properties, read from the component's own schema.
175
+
176
+ These are the collections the desired-state rule bites on, so naming them turns an
177
+ abstract rule ("the config replaces the definition") into an instruction a caller can
178
+ follow ("append to `actions` and send the whole list back"). Derived rather than
179
+ written down, so a schema that grows a list cannot leave the description behind.
180
+ """
181
+ try:
182
+ schema = json.loads(comp.schema_path.read_text(encoding="utf-8"))
183
+ except (OSError, json.JSONDecodeError, AttributeError):
184
+ return []
185
+ props = schema.get("properties")
186
+ if not isinstance(props, dict):
187
+ return []
188
+ return [k for k, v in props.items()
189
+ if not k.startswith("_") and isinstance(v, dict) and v.get("type") == "array"]
190
+
191
+
192
+ def build_actions() -> dict[str, ActionDef]:
193
+ out: dict[str, ActionDef] = {}
194
+ for name, comp in registry.all_components().items():
195
+ arg_schemas, examples = _payload_docs(comp)
196
+ lists = _list_properties(comp)
197
+ # Named lists make both descriptions concrete; a component with none still gets
198
+ # the rule, worded for a flat config.
199
+ listed = ", ".join(lists[:5])
200
+ # "node" is the word a caller reaches for when it wants to put one step on a
201
+ # canvas, and it belongs ONLY to the component that has such a list. Spraying it
202
+ # over every component would make a search for "add node" return six identical
203
+ # -edit actions and bury the one that answers the question.
204
+ node = " (no add-node either: a node IS an entry in actions)" if "actions" in lists else ""
205
+ adder = getattr(comp, "add_action", "")
206
+
207
+ out[f"{name}-create"] = ActionDef(
208
+ func=_make_create(comp), add_args=_create_args, needs_client=True,
209
+ description=(
210
+ f"Create a PROCESIO {name} from a validated config "
211
+ f"(build->validate->POST->re-GET). --config carries the WHOLE definition "
212
+ f"in ONE call - not a skeleton to fill in later"
213
+ + (f": put all of {listed} in it up front" if lists else "")
214
+ + ". There is no separate add/insert step afterwards. "
215
+ f"--dry-run previews the DTO without creating."
216
+ + (" Non-blocking lint findings come back as `warnings`." if comp.lint else "")
217
+ ),
218
+ arg_schemas=arg_schemas, examples=examples,
219
+ )
220
+ # The single fact that cost the most re-discovery: an agent holding only the arg
221
+ # schema knows --config takes a config, and reasonably assumes some add/insert/
222
+ # append action exists for putting ONE node in. None does, so it searches, fails,
223
+ # and eventually learns the rule by tripping the removal guard. Say it here, in
224
+ # the first sentence, and the search that goes looking for "add node" lands on
225
+ # this action and reads the answer.
226
+ out[f"{name}-edit"] = ActionDef(
227
+ func=_make_edit(comp), add_args=_process_edit_args if name == "process" else _edit_args, needs_client=True,
228
+ description=(
229
+ f"Edit a PROCESIO {name} (--id required). DESIRED STATE: the --config you "
230
+ f"send REPLACES the whole definition"
231
+ + ((f". To ADD one item WITHOUT restating the rest, use {adder}; "
232
+ f"otherwise GET the {name}, append yours to the matching list "
233
+ f"({listed}), and send the WHOLE config back. Batch freely: N items "
234
+ f"cost the same single call as 1."
235
+ if adder else
236
+ f". There is NO add / insert / append action{node} - to ADD or change "
237
+ f"one item, GET the {name}, append yours to the matching list "
238
+ f"({listed}), and send the WHOLE config back. Batch freely: N items "
239
+ f"cost the same single call as 1.")
240
+ # A flat component has no lists to append to, so the add/insert
241
+ # vocabulary would only put it in the way of searches meant for the
242
+ # components that do.
243
+ if lists else
244
+ f" - send the COMPLETE config every time, not only the fields you "
245
+ f"want to change.")
246
+ + " Anything you omit is REMOVED (refused unless --allow-remove)."
247
+ + (f" To move ONE field without restating the rest, use "
248
+ f"{comp.patch_action} instead - it deep-merges a patch."
249
+ if getattr(comp, "patch_action", "") else "")
250
+ + " --dry-run previews the DTO."
251
+ + (" Non-blocking lint findings come back as `warnings`." if comp.lint else "")
252
+ ),
253
+ arg_schemas=arg_schemas, examples=examples,
254
+ )
255
+ return out
256
+
257
+
258
+ ACTIONS = build_actions()