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,146 @@
1
+ """Environment-management actions (no HTTP - they only touch the local registry).
2
+
3
+ A PROCESIO environment is one installation, named `<Client>-<ENV>`, carrying the
4
+ host URLs it lives on (see environments.py). These actions let a user list the
5
+ known environments, add a client-specific one, switch the default (the natural
6
+ "I want to work on PROCESIO Internal-QA" gesture), and remove a user-defined one.
7
+
8
+ Built-in Internal-PROD/QA/DEV always exist and are shared with every teammate;
9
+ switching to one needs no setup beyond a credential bound to it.
10
+ """
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+
15
+ from tools.procesio import environments, profiles
16
+ from tools.procesio.actiondef import ActionDef
17
+
18
+
19
+ def _creds_by_environment() -> dict[str, list[str]]:
20
+ """Credential names grouped by the environment they are bound to (unbound ->
21
+ Internal-PROD), so listings can show which environments are usable."""
22
+ out: dict[str, list[str]] = {}
23
+ for name in profiles.profile_names():
24
+ blob = profiles.get_profile(name)
25
+ env = blob.get("environment") or environments.DEFAULT_ENV_NAME
26
+ out.setdefault(env, []).append(name)
27
+ return out
28
+
29
+
30
+ # -- list-environments ------------------------------------------------------
31
+
32
+ def list_environments(_args) -> dict:
33
+ default = environments.get_default()
34
+ by_env = _creds_by_environment()
35
+ out = []
36
+ for name in sorted(environments.all_environments()):
37
+ env = environments.get(name)
38
+ out.append({
39
+ "name": name,
40
+ "client": env.get("client"),
41
+ "env": env.get("env"),
42
+ "builtin": bool(env.get("builtin")),
43
+ "is_default": (name == default),
44
+ "web_base": env.get("web_base"),
45
+ "app_base": env.get("app_base"),
46
+ "forms_base": env.get("forms_base"),
47
+ "credentials": by_env.get(name, []),
48
+ })
49
+ return {
50
+ "count": len(out),
51
+ "default_environment": default,
52
+ "environments": out,
53
+ }
54
+
55
+
56
+ # -- add-environment --------------------------------------------------------
57
+
58
+ def _add_args(p: argparse.ArgumentParser) -> None:
59
+ p.add_argument("--name", required=True,
60
+ help="environment name, '<Client>-<ENV>' e.g. Acme-PROD")
61
+ p.add_argument("--web-base", dest="web_base", required=True,
62
+ help="Web API host, e.g. https://webapi.acme.example")
63
+ p.add_argument("--app-base", dest="app_base", required=True,
64
+ help="designer / front-end host, e.g. https://acme.example")
65
+ p.add_argument("--forms-base", dest="forms_base", required=True,
66
+ help="public forms host, e.g. https://forms.acme.example")
67
+ p.add_argument("--auth-base", dest="auth_base",
68
+ help="legacy auth host (optional; login uses the web host)")
69
+ p.add_argument("--client", help="client label (default: derived from the name)")
70
+ p.add_argument("--env", help="env label e.g. PROD/QA/DEV (default: derived from the name)")
71
+ p.add_argument("--make-default", dest="make_default", action="store_true",
72
+ help="switch the default environment to this one")
73
+
74
+
75
+ def add_environment(args) -> dict:
76
+ entry = environments.add(
77
+ args.name, web_base=args.web_base, app_base=args.app_base,
78
+ forms_base=args.forms_base, auth_base=args.auth_base,
79
+ client=args.client, env=args.env, make_default=args.make_default,
80
+ )
81
+ return {
82
+ "saved": True,
83
+ "environment": entry,
84
+ "default_environment": environments.get_default(),
85
+ "note": "environments are non-secret host URLs; bind a credential with "
86
+ "add-credential --environment " + entry["name"],
87
+ }
88
+
89
+
90
+ # -- set-environment (switch the default) -----------------------------------
91
+
92
+ def _name_arg(p: argparse.ArgumentParser) -> None:
93
+ p.add_argument("--name", required=True, help="environment name to switch to")
94
+
95
+
96
+ def set_environment(args) -> dict:
97
+ canon = environments.set_default(args.name)
98
+ env = environments.get(canon)
99
+ creds = _creds_by_environment().get(canon, [])
100
+ return {
101
+ "default_environment": canon,
102
+ "web_base": env.get("web_base"),
103
+ "app_base": env.get("app_base"),
104
+ "forms_base": env.get("forms_base"),
105
+ "credentials": creds,
106
+ "note": ("no credential is bound to this environment yet — add one with "
107
+ f"add-credential --environment {canon}") if not creds else
108
+ (f"using credential '{creds[0]}'" if len(creds) == 1 else
109
+ "multiple credentials bound — pass --profile to pick one"),
110
+ }
111
+
112
+
113
+ def remove_environment(args) -> dict:
114
+ environments.remove(args.name)
115
+ return {"removed": args.name, "default_environment": environments.get_default()}
116
+
117
+
118
+ def show_environment(args) -> dict:
119
+ env = environments.get(args.name)
120
+ creds = _creds_by_environment().get(env["name"], [])
121
+ return {**env, "is_default": env["name"] == environments.get_default(),
122
+ "credentials": creds}
123
+
124
+
125
+ ACTIONS = {
126
+ "list-environments": ActionDef(
127
+ func=list_environments,
128
+ description="List known PROCESIO environments (URLs, default, bound credentials).",
129
+ ),
130
+ "add-environment": ActionDef(
131
+ func=add_environment, add_args=_add_args,
132
+ description="Add a client environment (<Client>-<ENV> + its host URLs) to the registry.",
133
+ ),
134
+ "set-environment": ActionDef(
135
+ func=set_environment, add_args=_name_arg,
136
+ description="Switch the default environment (e.g. to Internal-QA); persists the choice.",
137
+ ),
138
+ "remove-environment": ActionDef(
139
+ func=remove_environment, add_args=_name_arg,
140
+ description="Remove a user-defined environment (built-in Internal-* cannot be removed).",
141
+ ),
142
+ "show-environment": ActionDef(
143
+ func=show_environment, add_args=_name_arg,
144
+ description="Show one environment's URLs, default flag, and bound credentials.",
145
+ ),
146
+ }
@@ -0,0 +1,236 @@
1
+ """Front-end (designer-layer) process validation — live action + the save gate.
2
+
3
+ This is the impure (client-facing) layer over flowmodel.fevalidation (pure). It:
4
+ * gathers the datatype catalog + subprocess-variable resolver from the live API,
5
+ * runs the pure FE validator (the designer "Process Errors" checks),
6
+ * exposes `process-fe-validate` (validate a live process by id),
7
+ * provides `pre_save_validate()` — the gate every process save runs: FE first, then
8
+ the BE validator (POST /api/Projects/validate), blocking the save on either unless
9
+ --force is passed.
10
+
11
+ Why a gate: POST /api/Projects/validate only checks the RUNTIME layer and returns EMPTY
12
+ even when the designer would REFUSE to save. Running the FE checks here means a
13
+ tool-driven save is held to the SAME bar as a human clicking Save in the designer —
14
+ without a conscious decision each time (CLAUDE.md: verify before done).
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+
20
+ from tools.procesio.actiondef import ActionDef
21
+ from tools.procesio.client import VARIABLES_ONLY
22
+ from tools.procesio.errors import ProcesioAPIError, ValidationBlocked
23
+ from tools.procesio.flowmodel import fevalidation as fv
24
+ from tools.procesio.handlers.common import add_profile_arg
25
+
26
+ _SUB_TEMPLATES = ("Call Subprocess", "Trigger Subprocess")
27
+
28
+
29
+ # -- gather live context for the pure validator -------------------------------
30
+
31
+ def _load_datatypes(client) -> list[dict]:
32
+ try:
33
+ r = client.get("/api/DataTypes", {"pageNumber": 1, "pageItemCount": 1000,
34
+ "includeProcesioEntries": True,
35
+ "includeExternalEntries": True})
36
+ except Exception: # noqa: BLE001 - the type layer is best-effort / non-blocking
37
+ return []
38
+ items = r.get("pageItems") if isinstance(r, dict) else r
39
+ return items or []
40
+
41
+
42
+ def _subprocess_resolver(client):
43
+ """target_vars_of(flow_id) -> {var_id: var_dict}, cached, network-tolerant."""
44
+ cache: dict = {}
45
+
46
+ def resolve(fid: str) -> dict:
47
+ if fid not in cache:
48
+ try:
49
+ r = client.get(f"/api/Projects/{fid}", VARIABLES_ONLY)
50
+ f = r.get("flow", r) if isinstance(r, dict) else r
51
+ cache[fid] = {v["id"]: v for v in (f.get("variables") or [])}
52
+ except Exception: # noqa: BLE001 - unreadable target: can't assert its contract
53
+ cache[fid] = {}
54
+ return cache[fid]
55
+
56
+ return resolve
57
+
58
+
59
+ def run_fe_validation(client, flow: dict, *, include_types: bool = True,
60
+ with_datatypes: bool = True) -> dict:
61
+ """Run the pure FE validator against a flow DTO, gathering live context. Returns a
62
+ report: {clean, error_count, warning_count, errors, warnings}."""
63
+ flow = flow.get("flow", flow) if isinstance(flow, dict) else flow
64
+ datatypes = _load_datatypes(client) if (include_types and with_datatypes) else None
65
+ resolver = _subprocess_resolver(client)
66
+ all_w = fv.validate_flow(flow, datatypes=datatypes, target_vars_of=resolver,
67
+ include_types=include_types)
68
+ all_w.extend(_flowlint_extras(client, flow, resolver))
69
+ errs, warns = fv.split_severity(all_w)
70
+ return {"clean": not errs, "error_count": len(errs), "warning_count": len(warns),
71
+ "errors": errs, "warnings": warns}
72
+
73
+
74
+ # flow-lint (handlers/flowlint.py) covers three designer save-blockers that are NOT in the
75
+ # FE reference file: a stale subprocess side-pannel id, an Execute-Query with a null/bad
76
+ # Output, and Node code binding an error-scope/undeclared variable. Fold ONLY those unique
77
+ # checks into the gate (the subprocess-mapping ones overlap fevalidation's checkSubprocess,
78
+ # so they're excluded to avoid double-reporting). Best-effort: a flow-lint infra hiccup must
79
+ # never break a legitimate save, so any failure yields no extra findings.
80
+ _FLOWLINT_UNIQUE = {
81
+ "SIDEPANEL_ID", "EXECQUERY_NO_OUTPUT", "EXECQUERY_OUTPUT_UNDECLARED",
82
+ "EXECQUERY_OUTPUT_TYPE", "CODE_ERROR_SCOPE", "CODE_UNDECLARED", "missing_error_variable",
83
+ }
84
+
85
+
86
+ def _flowlint_extras(client, flow: dict, resolver) -> list[dict]:
87
+ try:
88
+ from tools.procesio.handlers import flowlint
89
+ tmpl_sp = flowlint._template_sidepanel_ids(client)
90
+ problems = flowlint.lint_flow_dto(flow, tmpl_sp, resolver)
91
+ except Exception: # noqa: BLE001 - extras are best-effort; never block a save on them
92
+ return []
93
+ out: list[dict] = []
94
+ for p in problems:
95
+ if p.get("kind") not in _FLOWLINT_UNIQUE:
96
+ continue
97
+ name = p.get("action")
98
+ out.append({"severity": "error", "code": p["kind"], "text": p.get("detail", ""),
99
+ "badges": [name] if name else [], "actionId": None, "action": name})
100
+ return out
101
+
102
+
103
+ def run_be_validation(client, flow: dict) -> dict:
104
+ """Run PROCESIO's own validator (POST /api/Projects/validate). Empty 200 => valid."""
105
+ dto = flow.get("flow", flow) if isinstance(flow, dict) and "flow" in flow else flow
106
+ try:
107
+ res = client.post("/api/Projects/validate", dto)
108
+ except ProcesioAPIError as e:
109
+ det = e.details if isinstance(e.details, dict) else {"body": e.details}
110
+ return {"valid": False, "errors": det.get("body", det)}
111
+ empty = (not res) or (isinstance(res, dict)
112
+ and list(res.keys()) == ["raw_text"] and not res["raw_text"])
113
+ if empty:
114
+ return {"valid": True, "errors": []}
115
+ errs = (res.get("errors") or res.get("validationErrors")) if isinstance(res, dict) else None
116
+ valid = res.get("isValid") if isinstance(res, dict) else None
117
+ return {"valid": valid if valid is not None else (not errs), "errors": errs, "result": res}
118
+
119
+
120
+ # -- the save gate ------------------------------------------------------------
121
+
122
+ def pre_save_validate(client, dto: dict, *, force: bool = False,
123
+ include_types: bool = True) -> dict:
124
+ """Gate a process SAVE: FE (designer) validation first, then BE validation.
125
+
126
+ Returns a combined report {fe, be, blocked}. Raises ValidationBlocked when there are
127
+ blocking errors and force is False — so the caller (create/edit) aborts before the
128
+ POST/PUT. FE-warning-only (type-mismatch) never blocks. --force bypasses everything.
129
+ """
130
+ fe = run_fe_validation(client, dto, include_types=include_types)
131
+ be = run_be_validation(client, dto)
132
+ blocked = (not fe["clean"]) or (be.get("valid") is False)
133
+ report = {"fe": fe, "be": be, "blocked": blocked, "forced": bool(force)}
134
+ if blocked and not force:
135
+ n_fe = fe["error_count"]
136
+ n_be = len(be.get("errors") or []) if be.get("valid") is False else 0
137
+ raise ValidationBlocked(
138
+ f"Save blocked by validation: {n_fe} designer (front-end) error(s), "
139
+ f"{n_be} back-end error(s). Fix them, or pass --force to override.", report)
140
+ return report
141
+
142
+
143
+ # -- the live action ----------------------------------------------------------
144
+
145
+ def _args(p: argparse.ArgumentParser) -> None:
146
+ add_profile_arg(p)
147
+ p.add_argument("--id", required=True, help="process (project) id to validate")
148
+ p.add_argument("--no-types", dest="no_types", action="store_true",
149
+ help="skip the advisory data-type-mismatch (warning) layer")
150
+ p.add_argument("--include-be", dest="include_be", action="store_true",
151
+ help="also run the back-end validator (POST /api/Projects/validate)")
152
+
153
+
154
+ def process_fe_validate(client, args) -> dict:
155
+ resp = client.get(f"/api/Projects/{args.id}")
156
+ flow = resp.get("flow", resp) if isinstance(resp, dict) else resp
157
+ fe = run_fe_validation(client, flow, include_types=not args.no_types)
158
+ out = {"id": args.id, "title": flow.get("title") or flow.get("Title"),
159
+ "clean": fe["clean"], "error_count": fe["error_count"],
160
+ "warning_count": fe["warning_count"],
161
+ "errors": fe["errors"], "warnings": fe["warnings"]}
162
+ if args.include_be:
163
+ out["backend"] = run_be_validation(client, flow)
164
+ return out
165
+
166
+
167
+ ACTIONS = {
168
+ "process-fe-validate": ActionDef(
169
+ func=process_fe_validate, add_args=_args, needs_client=True,
170
+ description="Front-end (designer-layer) 'Process Errors' validation on a live "
171
+ "process — the client-side check that BLOCKS designer Save but which "
172
+ "POST /api/Projects/validate does NOT catch: unconnected actions, "
173
+ "missing Start/Stop, empty node names, required-empty fields, leftover "
174
+ "placeholders, bad number/integer values, out-of-range limits, "
175
+ "duplicate/primitive-named variables, and unmapped required subprocess "
176
+ "inputs. clean=true when no blocking errors. Data-type mismatches are "
177
+ "reported as (non-blocking) warnings. This same check auto-runs before "
178
+ "every process-create / process-edit. Add --include-be for the BE layer."),
179
+ }
180
+
181
+
182
+ # -- saving a fetched flow ----------------------------------------------------
183
+
184
+ def arrange(flow: dict) -> tuple[dict, str]:
185
+ """The flow laid out with the default arrangement (classic engine + clustering).
186
+
187
+ Returns (flow, note). Layout only moves positions and frame sizes; if it fails on an
188
+ unusual graph the save goes ahead with the canvas as it was, and the note says so."""
189
+ from tools.procesio.layout import adapter
190
+ try:
191
+ res = adapter.layout_flow(flow, cluster=True)
192
+ return res["bundle"], "arranged"
193
+ except Exception as e: # noqa: BLE001 - a layout problem must never block a save
194
+ return flow, f"not arranged ({type(e).__name__}: {e})"
195
+
196
+
197
+ def save_flow(client, flow: dict, *, flow_id: str, valid: bool, layout: bool | None = None) -> dict:
198
+ """PUT a flow with its validity mark stamped to `valid`, and report what the server KEPT.
199
+
200
+ Two measured facts about the platform put this in one place rather than a bare PUT at
201
+ each call site. Both were established against the live API, not assumed:
202
+
203
+ * `isValid` is never computed by the back end. It stores whatever the PUT body
204
+ carries, and defaults it to TRUE when the body omits the field. So a writer that
205
+ passes a fetched flow straight through leaves a corrected process marked broken
206
+ for ever, and one that drops the field marks a broken process valid.
207
+ * The runtime validator (POST /api/Projects/validate) answers EMPTY - "valid" - for
208
+ flows the designer refuses to save, so `valid` has to carry the FE+BE verdict the
209
+ create/edit gate applies, never the runtime answer alone.
210
+
211
+ The mark is stamped, never blocked on. Saving a half-built process is deliberate
212
+ platform behaviour; the point of the mark is to say so truthfully.
213
+
214
+ The returned `isValid` is RE-READ after the PUT, because reporting the pre-save
215
+ measurement describes the flow that was sent rather than the one the platform kept,
216
+ and those two genuinely differ. A read-back that fails leaves it None with a note:
217
+ the PUT already landed, so failing the whole call here would misreport a save that
218
+ succeeded.
219
+ """
220
+ if layout is None: # default: arrange on every save; PROCESIO_KEEP_LAYOUT=1 opts out
221
+ from tools.procesio.dto.process.builder import keep_layout_requested
222
+ layout = not keep_layout_requested()
223
+ note = "kept"
224
+ if layout:
225
+ flow, note = arrange(flow)
226
+ flow["isValid"] = bool(valid)
227
+ out: dict = {"stamped": bool(valid), "layout": note}
228
+ client.put("/api/Projects", flow)
229
+ try:
230
+ stored = client.get(f"/api/Projects/{flow_id}")
231
+ f = stored.get("flow", stored) if isinstance(stored, dict) else stored
232
+ out["isValid"] = f.get("isValid") if isinstance(f, dict) else None
233
+ except Exception as e: # noqa: BLE001 - the PUT landed; only the read-back failed
234
+ out["isValid"] = None
235
+ out["readback_error"] = str(e)
236
+ return out
@@ -0,0 +1,141 @@
1
+ """Download a flow-instance file (e.g. a Generate-Document PDF output) to local disk.
2
+
3
+ `GET /api/File/download` identifies the file by request **HEADERS** (HAR-verified),
4
+ NOT query params — a query-only call returns NRE "Object reference not set":
5
+
6
+ uploadFilePath the file DTO `path`
7
+ (flow/flow-<flowId>/flow-instance-<instanceId>/variable-<varId>/<fileId>)
8
+ variableId the output variable id
9
+ instanceId the flow instance id
10
+ flowTemplateId the process (flow template) id
11
+ workspaceId the workspace
12
+
13
+ Query: `?isArchived=false`. Returns raw bytes (`content-disposition: attachment`).
14
+ See `tools/procesio/PROCESIO-API-NOTES.md`. JSON in / JSON out; impure (live client).
15
+ """
16
+ from __future__ import annotations
17
+
18
+ import argparse
19
+ import json
20
+ import re
21
+ from pathlib import Path
22
+ from urllib.parse import unquote
23
+
24
+ from tools.procesio.actiondef import ActionDef
25
+ from tools.procesio.errors import ProcesioAPIError, UsageError
26
+ from tools.procesio.handlers.common import add_profile_arg
27
+
28
+ # flow/flow-<flowId>/flow-instance-<instanceId>/variable-<varId>/<fileId>
29
+ _PATH_RE = re.compile(
30
+ r"flow-(?P<flow>[0-9a-fA-F-]{36})/"
31
+ r"flow-instance-(?P<instance>[0-9a-fA-F-]{36})/"
32
+ r"variable-(?P<variable>[0-9a-fA-F-]{36})/")
33
+
34
+
35
+ def _ids_from_path(path: str) -> dict:
36
+ m = _PATH_RE.search(path or "")
37
+ return {"flow": m.group("flow"), "instance": m.group("instance"),
38
+ "variable": m.group("variable")} if m else {}
39
+
40
+
41
+ def _filename_from_disposition(cd: str) -> str | None:
42
+ if not cd:
43
+ return None
44
+ m = re.search(r"filename\*=UTF-8''([^;]+)", cd) # RFC 5987 form wins
45
+ if m:
46
+ return unquote(m.group(1)).strip().strip('"')
47
+ m = re.search(r'filename="?([^";]+)"?', cd)
48
+ return m.group(1).strip() if m else None
49
+
50
+
51
+ def file_download(client, args) -> dict:
52
+ """Download one flow-instance file. Identify it either explicitly
53
+ (--file-path + --variable-id + --instance-id + --flow-template-id) or with
54
+ --from-run pointing at a run-process result JSON (the ids are derived from the
55
+ file DTO's `path` and the result's instanceId)."""
56
+ file_path = args.file_path
57
+ variable_id = args.variable_id
58
+ instance_id = args.instance_id
59
+ flow_template_id = args.flow_template_id
60
+ name = None
61
+
62
+ if args.from_run:
63
+ try:
64
+ data = json.loads(Path(args.from_run).read_text(encoding="utf-8"))
65
+ except (OSError, json.JSONDecodeError) as e:
66
+ raise UsageError(f"--from-run: cannot read JSON ({e})") from e
67
+ res = data.get("result", data) if isinstance(data, dict) else {}
68
+ variables = res.get("variable") or {}
69
+ if args.var:
70
+ picked = variables.get(args.var)
71
+ if not isinstance(picked, dict) or not picked.get("path"):
72
+ raise UsageError(f"--from-run: variable {args.var!r} is not a file in the run result")
73
+ else:
74
+ picked = next((v for v in variables.values()
75
+ if isinstance(v, dict) and v.get("path")), None)
76
+ if picked is None:
77
+ raise UsageError("--from-run: no file variable (with a 'path') found in the run result")
78
+ ids = _ids_from_path(picked.get("path") or "")
79
+ file_path = file_path or picked.get("path")
80
+ name = picked.get("name")
81
+ flow_template_id = flow_template_id or ids.get("flow")
82
+ instance_id = instance_id or res.get("instanceId") or ids.get("instance")
83
+ variable_id = variable_id or ids.get("variable")
84
+
85
+ missing = [n for n, v in (("file-path", file_path), ("variable-id", variable_id),
86
+ ("instance-id", instance_id), ("flow-template-id", flow_template_id))
87
+ if not v]
88
+ if missing:
89
+ raise UsageError("missing " + ", ".join("--" + m for m in missing)
90
+ + " (or pass --from-run with a run-process result JSON)")
91
+
92
+ workspace_id = client.workspace_id or args.workspace_id
93
+ if not workspace_id:
94
+ raise UsageError("a workspace id is required: pass --workspace-id")
95
+
96
+ headers = {"uploadFilePath": file_path, "variableId": variable_id,
97
+ "instanceId": instance_id, "flowTemplateId": flow_template_id,
98
+ "workspaceId": workspace_id}
99
+ status, content, resp_headers = client.request_bytes(
100
+ "GET", "/api/File/download",
101
+ query={"isArchived": "true" if args.is_archived else "false"},
102
+ headers=headers)
103
+ if not (200 <= status < 300):
104
+ body = content[:300].decode("utf-8", "replace") if content else ""
105
+ raise ProcesioAPIError(int(status or 0), f"HTTP {status} downloading file", {"body": body})
106
+
107
+ rh = {str(k).lower(): v for k, v in (resp_headers or {}).items()}
108
+ out_name = (_filename_from_disposition(rh.get("content-disposition", "")) or name
109
+ or (file_path.rsplit("/", 1)[-1] if file_path else "download.bin"))
110
+ out = Path(args.out) if args.out else Path.cwd() / out_name
111
+ if out.is_dir():
112
+ out = out / out_name
113
+ if out.parent and not out.parent.exists():
114
+ out.parent.mkdir(parents=True, exist_ok=True)
115
+ out.write_bytes(content)
116
+ return {"downloaded": True, "path": str(out), "size": len(content),
117
+ "mimeType": rh.get("content-type"), "name": out.name}
118
+
119
+
120
+ def _args(p: argparse.ArgumentParser) -> None:
121
+ add_profile_arg(p)
122
+ p.add_argument("--from-run", dest="from_run",
123
+ help="path to a run-process result JSON; derive the file + ids from it")
124
+ p.add_argument("--var", help="with --from-run: the output variable name to download "
125
+ "(default: the first file variable)")
126
+ p.add_argument("--file-path", dest="file_path",
127
+ help="the file DTO 'path' (flow/flow-<id>/flow-instance-<id>/variable-<id>/<fileId>)")
128
+ p.add_argument("--variable-id", dest="variable_id", help="output variable id")
129
+ p.add_argument("--instance-id", dest="instance_id", help="flow instance id")
130
+ p.add_argument("--flow-template-id", dest="flow_template_id", help="process (flow template) id")
131
+ p.add_argument("--out", help="output file path or directory (default: the filename in the cwd)")
132
+ p.add_argument("--is-archived", dest="is_archived", action="store_true",
133
+ help="fetch from archived storage")
134
+
135
+
136
+ ACTIONS = {
137
+ "file-download": ActionDef(
138
+ func=file_download, add_args=_args, needs_client=True,
139
+ description="Download a flow-instance file (Generate-Document output etc.) "
140
+ "via the header-based GET /api/File/download."),
141
+ }