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,117 @@
1
+ """Tests for the live process-layout actions (duplicate-process, relayout-process).
2
+
3
+ The client is faked — no network. adapter.layout_flow runs the real offline engine
4
+ (legacy by default) on a tiny flow, so the round-trip through the handler is exercised."""
5
+ from __future__ import annotations
6
+
7
+ from argparse import Namespace
8
+
9
+ import pytest
10
+
11
+ from tools.procesio.errors import UsageError
12
+ from tools.procesio.handlers import process_layout as pl
13
+
14
+
15
+ def _flow(fid="f1"):
16
+ return {"Id": fid, "Title": "Demo", "Actions": [
17
+ {"Id": "start", "ActionTemplateName": "Start",
18
+ "CustomData": {"type": "circle", "position": {"x": 0, "y": 0}},
19
+ "Ports": [{"SourceId": "start", "DestinationId": "a", "Type": 0}]},
20
+ {"Id": "a", "ActionTemplateName": "Map Data",
21
+ "CustomData": {"type": "square", "position": {"x": 0, "y": 0}},
22
+ "Ports": [{"SourceId": "a", "DestinationId": "stop", "Type": 0}]},
23
+ {"Id": "stop", "ActionTemplateName": "Stop",
24
+ "CustomData": {"type": "circle", "position": {"x": 0, "y": 0}}, "Ports": []},
25
+ ]}
26
+
27
+
28
+ class FakeClient:
29
+ """Records POST/PUT calls and serves canned GET responses."""
30
+ def __init__(self, project_lists, flow):
31
+ self.workspace_id = "ws-1"
32
+ self.profile = {} # unbound -> production designer host
33
+ self._lists = list(project_lists) # successive /api/Projects responses
34
+ self._flow = flow
35
+ self.posts = []
36
+ self.puts = []
37
+
38
+ def get(self, path, query=None):
39
+ if path == "/api/Projects":
40
+ return {"pageItems": self._lists.pop(0)}
41
+ if path.startswith("/api/Projects/"):
42
+ return {"flow": self._flow}
43
+ raise AssertionError(f"unexpected GET {path}")
44
+
45
+ def post(self, path, body=None, query=None):
46
+ self.posts.append((path, body))
47
+ if path.endswith("/duplicate"):
48
+ return {"hasWebhook": False}
49
+ if path == "/api/Projects/validate":
50
+ return {"raw_text": ""}
51
+ raise AssertionError(f"unexpected POST {path}")
52
+
53
+ def put(self, path, body=None, query=None):
54
+ self.puts.append((path, body))
55
+ return {}
56
+
57
+
58
+ def test_duplicate_process_finds_new_copy_id():
59
+ before = [{"id": "A"}, {"id": "B"}]
60
+ after = [{"id": "A"}, {"id": "B"}, {"id": "C"}] # C is the new copy
61
+ # the two /api/Projects GETs (before, after) + the GET for the copy's title
62
+ c = FakeClient([before, after], _flow(fid="C"))
63
+ out = pl.duplicate_process(c, Namespace(id="A", workspace_id="ws-1", profile=None))["result"]
64
+ assert out["copy_id"] == "C"
65
+ assert out["source_id"] == "A"
66
+ assert out["designer_url"].endswith("/designer/C#ws-1")
67
+ assert out["has_webhook"] is False
68
+ assert c.posts[0][0] == "/api/Projects/A/duplicate"
69
+
70
+
71
+ def test_duplicate_process_ambiguous_when_multiple_new():
72
+ before = [{"id": "A"}]
73
+ after = [{"id": "A"}, {"id": "C"}, {"id": "D"}] # two new → cannot disambiguate
74
+ c = FakeClient([before, after], _flow())
75
+ out = pl.duplicate_process(c, Namespace(id="A", workspace_id="ws-1", profile=None))["result"]
76
+ assert out["copy_id"] is None
77
+ assert set(out["copy_candidates"]) == {"C", "D"}
78
+ assert out["designer_url"] is None
79
+
80
+
81
+ def test_relayout_process_dry_run_does_not_save():
82
+ c = FakeClient([], _flow())
83
+ out = pl.relayout_process(c, Namespace(id="C", workspace_id="ws-1", profile=None,
84
+ no_validate=False, dry_run=True))["result"]
85
+ assert out["saved"] is False and out["dry_run"] is True
86
+ assert out["nodes_moved"] >= 1
87
+ assert out["engine"] in ("legacy", "elk")
88
+ assert c.puts == [] and c.posts == [] # nothing persisted
89
+
90
+
91
+ def test_relayout_process_validates_then_saves():
92
+ c = FakeClient([], _flow())
93
+ out = pl.relayout_process(c, Namespace(id="C", workspace_id="ws-1", profile=None,
94
+ no_validate=False, dry_run=False))["result"]
95
+ assert out["saved"] is True and out["validated"] is True
96
+ assert [p[0] for p in c.posts] == ["/api/Projects/validate"] # validate gate ran
97
+ assert len(c.puts) == 1 and c.puts[0][0] == "/api/Projects" # saved via PUT
98
+ # the PUT body carries the re-laid-out flow (same action ids, new positions)
99
+ saved_flow = c.puts[0][1]
100
+ assert {a["Id"] for a in saved_flow["Actions"]} == {"start", "a", "stop"}
101
+
102
+
103
+ def test_relayout_process_no_validate_skips_gate():
104
+ c = FakeClient([], _flow())
105
+ out = pl.relayout_process(c, Namespace(id="C", workspace_id="ws-1", profile=None,
106
+ no_validate=True, dry_run=False))["result"]
107
+ assert out["saved"] is True and out["validated"] is None
108
+ assert c.posts == [] # validate skipped
109
+ assert len(c.puts) == 1
110
+
111
+
112
+ def test_relayout_process_reports_elk_engine(monkeypatch):
113
+ monkeypatch.setenv("LAYOUT_ENGINE", "elk")
114
+ c = FakeClient([], _flow())
115
+ out = pl.relayout_process(c, Namespace(id="C", workspace_id="ws-1", profile=None,
116
+ no_validate=True, dry_run=True))["result"]
117
+ assert out["engine"] == "elk"
@@ -0,0 +1,188 @@
1
+ """Tests for rename-actions (bulk-relabel a live process's canvas nodes).
2
+
3
+ The client is faked — no network. Both DTO casings are exercised: a PascalCase export
4
+ and the camelCase live DTO must rename identically."""
5
+ from __future__ import annotations
6
+
7
+ from argparse import Namespace
8
+
9
+ import pytest
10
+
11
+ from tools.procesio.errors import UsageError
12
+ from tools.procesio.handlers import process_naming as pn
13
+
14
+
15
+ def _flow_pascal():
16
+ return {"Id": "P", "Title": "Demo", "Actions": [
17
+ {"Id": "aaaa1111", "ActionName": "Node", "ActionTemplateName": "Node",
18
+ "CustomData": {"name": "Node", "icon": "icon-nodejs"},
19
+ "Ports": [{"SourceId": "aaaa1111", "DestinationId": "bbbb2222", "Type": 0}]},
20
+ {"Id": "bbbb2222", "ActionName": "Node", "ActionTemplateName": "Node",
21
+ "CustomData": {"name": "Node", "icon": "icon-nodejs"}, "Ports": []},
22
+ ]}
23
+
24
+
25
+ def _flow_camel():
26
+ return {"id": "P", "title": "Demo", "actions": [
27
+ {"id": "aaaa1111", "actionName": "Node", "actionTemplateName": "Node",
28
+ "customData": {"name": "Node"}, "ports": []},
29
+ {"id": "bbbb2222", "actionName": "Call API", "actionTemplateName": "Call API",
30
+ "customData": {"name": "Call API"}, "ports": []},
31
+ ]}
32
+
33
+
34
+ class FakeClient:
35
+ def __init__(self, flow):
36
+ self.workspace_id = "ws-1"
37
+ self.profile = {} # unbound -> production designer host
38
+ self._flow = flow
39
+ self.posts = []
40
+ self.puts = []
41
+
42
+ def get(self, path, query=None):
43
+ assert path.startswith("/api/Projects/")
44
+ return {"flow": self._flow}
45
+
46
+ def post(self, path, body=None, query=None):
47
+ self.posts.append((path, body))
48
+ return {"raw_text": ""}
49
+
50
+ def put(self, path, body=None, query=None):
51
+ self.puts.append((path, body))
52
+ return {}
53
+
54
+
55
+ def _args(**kw):
56
+ base = dict(id="P", workspace_id="ws-1", profile=None, map=None, map_file=None,
57
+ no_validate=False, dry_run=False, force=False)
58
+ base.update(kw)
59
+ return Namespace(**base)
60
+
61
+
62
+ # -- apply_names (pure) -------------------------------------------------------
63
+
64
+ def test_sets_both_action_name_and_custom_data_name():
65
+ flow, changes, unknown, ambiguous = pn.apply_names(
66
+ _flow_pascal(), {"aaaa1111": "Mapează nume"})
67
+ assert (unknown, ambiguous) == ([], [])
68
+ a = flow["Actions"][0]
69
+ assert a["ActionName"] == "Mapează nume"
70
+ assert a["CustomData"]["name"] == "Mapează nume"
71
+ assert changes == [{"id": "aaaa1111", "template": "Node",
72
+ "from": "Node", "to": "Mapează nume"}]
73
+
74
+
75
+ def test_camel_case_live_dto_renames_the_same_way():
76
+ flow, changes, _, _ = pn.apply_names(_flow_camel(), {"bbbb2222": "OCR AI"})
77
+ a = flow["actions"][1]
78
+ assert a["actionName"] == "OCR AI"
79
+ assert a["customData"]["name"] == "OCR AI"
80
+ assert len(changes) == 1
81
+
82
+
83
+ def test_does_not_mutate_the_input_flow():
84
+ original = _flow_pascal()
85
+ pn.apply_names(original, {"aaaa1111": "Changed"})
86
+ assert original["Actions"][0]["ActionName"] == "Node"
87
+ assert original["Actions"][0]["CustomData"]["name"] == "Node"
88
+
89
+
90
+ def test_untargeted_actions_are_left_alone():
91
+ flow, changes, _, _ = pn.apply_names(_flow_pascal(), {"aaaa1111": "Only me"})
92
+ assert flow["Actions"][1]["ActionName"] == "Node"
93
+ assert [c["id"] for c in changes] == ["aaaa1111"]
94
+
95
+
96
+ def test_ports_and_wiring_survive_a_rename():
97
+ flow, _, _, _ = pn.apply_names(_flow_pascal(), {"aaaa1111": "X", "bbbb2222": "Y"})
98
+ assert flow["Actions"][0]["Ports"] == [
99
+ {"SourceId": "aaaa1111", "DestinationId": "bbbb2222", "Type": 0}]
100
+
101
+
102
+ def test_a_name_already_in_place_is_not_reported_as_a_change():
103
+ _, changes, _, _ = pn.apply_names(_flow_pascal(), {"aaaa1111": "Node"})
104
+ assert changes == []
105
+
106
+
107
+ def test_unique_id_prefix_resolves():
108
+ _, changes, unknown, ambiguous = pn.apply_names(_flow_pascal(), {"aaaa": "Prefixed"})
109
+ assert (unknown, ambiguous) == ([], [])
110
+ assert changes[0]["id"] == "aaaa1111"
111
+
112
+
113
+ def test_ambiguous_prefix_is_reported_not_guessed():
114
+ flow = _flow_pascal()
115
+ flow["Actions"][1]["Id"] = "aaaa9999" # now "aaaa" matches two actions
116
+ new, changes, unknown, ambiguous = pn.apply_names(flow, {"aaaa": "Which one?"})
117
+ assert ambiguous == ["aaaa"]
118
+ assert changes == []
119
+
120
+
121
+ def test_unknown_id_is_reported():
122
+ _, changes, unknown, _ = pn.apply_names(_flow_pascal(), {"zzzz": "Nope"})
123
+ assert unknown == ["zzzz"]
124
+ assert changes == []
125
+
126
+
127
+ # -- rename_actions (handler) -------------------------------------------------
128
+
129
+ def test_dry_run_does_not_save():
130
+ c = FakeClient(_flow_camel())
131
+ out = pn.rename_actions(c, _args(map='{"aaaa1111": "Extrage nume"}', dry_run=True))["result"]
132
+ assert out["saved"] is False and out["dry_run"] is True
133
+ assert out["renamed_count"] == 1
134
+ assert c.puts == [] and c.posts == []
135
+
136
+
137
+ def test_validates_then_saves():
138
+ c = FakeClient(_flow_camel())
139
+ out = pn.rename_actions(c, _args(map='{"aaaa1111": "Extrage nume"}'))["result"]
140
+ assert out["validated"] is True and out["saved"] is True
141
+ assert c.posts[0][0] == "/api/Projects/validate"
142
+ assert c.puts[0][0] == "/api/Projects"
143
+ assert c.puts[0][1]["actions"][0]["actionName"] == "Extrage nume"
144
+ assert out["designer_url"].endswith("/designer/P#ws-1")
145
+
146
+
147
+ def test_no_validate_skips_the_gate():
148
+ c = FakeClient(_flow_camel())
149
+ pn.rename_actions(c, _args(map='{"aaaa1111": "X"}', no_validate=True))
150
+ assert c.posts == [] and len(c.puts) == 1
151
+
152
+
153
+ def test_map_file_is_accepted(tmp_path):
154
+ f = tmp_path / "names.json"
155
+ f.write_text('{"bbbb2222": "OCR AI — CI"}', encoding="utf-8")
156
+ c = FakeClient(_flow_camel())
157
+ out = pn.rename_actions(c, _args(map_file=str(f)))["result"]
158
+ assert out["renamed"][0]["to"] == "OCR AI — CI"
159
+
160
+
161
+ def test_map_and_map_file_are_mutually_exclusive(tmp_path):
162
+ c = FakeClient(_flow_camel())
163
+ with pytest.raises(UsageError, match="exactly one"):
164
+ pn.rename_actions(c, _args(map='{"a": "b"}', map_file=str(tmp_path / "x.json")))
165
+ with pytest.raises(UsageError, match="exactly one"):
166
+ pn.rename_actions(c, _args())
167
+
168
+
169
+ def test_blank_name_is_rejected():
170
+ c = FakeClient(_flow_camel())
171
+ with pytest.raises(UsageError, match="non-empty string"):
172
+ pn.rename_actions(c, _args(map='{"aaaa1111": " "}'))
173
+
174
+
175
+ def test_unknown_id_aborts_before_saving():
176
+ c = FakeClient(_flow_camel())
177
+ with pytest.raises(UsageError, match="no action in process"):
178
+ pn.rename_actions(c, _args(map='{"nope": "X"}'))
179
+ assert c.puts == []
180
+
181
+
182
+ def test_ambiguous_prefix_aborts_before_saving():
183
+ flow = _flow_camel()
184
+ flow["actions"][1]["id"] = "aaaa9999"
185
+ c = FakeClient(flow)
186
+ with pytest.raises(UsageError, match="ambiguous id prefix"):
187
+ pn.rename_actions(c, _args(map='{"aaaa": "X"}'))
188
+ assert c.puts == []
@@ -0,0 +1,172 @@
1
+ """Locks the Query Store NODE authoring shapes the builder emits from a `queryStore` spec.
2
+
3
+ Reverse-engineered from a live PROCESIO export and verified end-to-end in a real workspace
4
+ (SELECT/JOIN/GROUP BY, INSERT/UPDATE/DELETE/REPLACE, list params, error branch). The shape
5
+ facts that make the node RUN rather than merely validate:
6
+ - b102 Query: `Value` is SQL with `<%N%>`; each `<%N%>` is a CHIP in `Variable[]` typed
7
+ dataStoreTable ({dataStoreId}) or dataStoreColumn ({dataStoreId, columnId}) - NOT a
8
+ process variable; `@param` stays literal in the SQL.
9
+ - b103 Parameters: rows {id, source:{value,variable}, destination:{value:<paramName>}}.
10
+ - b105/b106 outputs bind like any {var}. One <%N%> id sequence across the whole node.
11
+ - Designer mirror: b102 -> `ds.<dataStoreId>[.<columnId>]`, b103 -> {id,destination,source}.
12
+ """
13
+ from __future__ import annotations
14
+
15
+ import itertools
16
+ import re
17
+
18
+ import pytest
19
+
20
+ from tools.procesio.dto.process import builder as pb
21
+ from tools.procesio.flowmodel import fevalidation as fv
22
+
23
+ _STORE = "11111111-1111-1111-1111-111111111111"
24
+ _C_NAME = "22222222-2222-2222-2222-222222222222"
25
+ _C_TIER = "33333333-3333-3333-3333-333333333333"
26
+ _C_CODE = "44444444-4444-4444-4444-444444444444"
27
+ _ORD = "55555555-5555-5555-5555-555555555555"
28
+ _O_CUST = "66666666-6666-6666-6666-666666666666"
29
+ _O_AMT = "77777777-7777-7777-7777-777777777777"
30
+
31
+ _DSM = {
32
+ "qs_customers": {"id": _STORE, "columns": {"name": _C_NAME, "tier": _C_TIER, "customercode": _C_CODE}},
33
+ "qs_orders": {"id": _ORD, "columns": {"customercode": _O_CUST, "amount": _O_AMT}},
34
+ }
35
+
36
+
37
+ def _ctx():
38
+ counter = itertools.count(1)
39
+ return {"new_id": lambda: f"00000000-0000-0000-0000-{next(counter):012d}",
40
+ "datastore_meta": _DSM}
41
+
42
+
43
+ def _qs_node(dto):
44
+ return next(a for a in dto["Actions"] if a.get("ActionTemplateName") == "Query Store")
45
+
46
+
47
+ def _param(node, tail):
48
+ return next(p for p in node["Parameters"] if p["TabPropertyId"].endswith(tail))
49
+
50
+
51
+ def _cd(node, tail):
52
+ def walk(settings):
53
+ for s in settings or []:
54
+ if str(s.get("id", "")).endswith(tail):
55
+ return s
56
+ if isinstance(s.get("value"), list):
57
+ r = walk(s["value"])
58
+ if r:
59
+ return r
60
+ for tab in node["CustomData"]["configuration"]:
61
+ r = walk(tab.get("settings", []))
62
+ if r:
63
+ return r
64
+
65
+
66
+ _ROWS = {"name": "rows", "type": "json", "isList": True, "direction": "output"}
67
+ _CNT = {"name": "count", "type": "integer", "direction": "output"}
68
+
69
+
70
+ def _select_cfg():
71
+ return {"title": "t",
72
+ "variables": [{"name": "maxTier", "type": "integer", "direction": "input"}, _ROWS, _CNT],
73
+ "actions": [{"id": "q", "action": "Query Store", "queryStore": {
74
+ "sql": "select {{col:QS_Customers.Name}} from {{ds:QS_Customers}} "
75
+ "where {{col:QS_Customers.Tier}} <= @maxTier",
76
+ "params": {"maxTier": {"var": "maxTier"}},
77
+ "resultRows": "rows", "totalCount": "count"}}]}
78
+
79
+
80
+ def test_query_chips_and_placeholders():
81
+ node = _qs_node(pb.build(_select_cfg(), _ctx()))
82
+ q = _param(node, "b102")
83
+ # Each chip becomes a positional placeholder and `@param` stays literal; the statement is
84
+ # laid out over lines so the node can be read in the designer.
85
+ assert q["Value"].splitlines() == ["select <%0%>", "from <%1%>", "where <%2%> <= @maxTier"]
86
+ chips = q["Variable"]
87
+ assert chips[0] == {"id": 0, "type": "dataStoreColumn", "variableId": None,
88
+ "dataStoreId": _STORE, "columnId": _C_NAME, "attribute": None}
89
+ assert chips[1] == {"id": 1, "type": "dataStoreTable", "variableId": None,
90
+ "dataStoreId": _STORE, "attribute": None}
91
+ assert chips[2]["columnId"] == _C_TIER and chips[2]["type"] == "dataStoreColumn"
92
+
93
+
94
+ def test_parameters_map_and_outputs():
95
+ node = _qs_node(pb.build(_select_cfg(), _ctx()))
96
+ p = _param(node, "b103")
97
+ assert p["Variable"] == [] # sources live INLINE
98
+ row = p["Value"][0]
99
+ assert row["destination"] == {"value": "maxTier", "variable": []} # @param name, no '@'
100
+ assert re.match(r"^<%\d+%>$", row["source"]["value"])
101
+ assert row["source"]["variable"][0]["variableId"] # bound to the process variable
102
+ # outputs bind like any {var}: Value=<%N%>, Variable=[{variableId}]
103
+ for tail in ("b105", "b106"):
104
+ op = _param(node, tail)
105
+ assert re.match(r"^<%\d+%>$", op["Value"]) and op["Variable"][0]["variableId"]
106
+ assert _param(node, "b104")["Value"] == "1800" # Time Out default
107
+
108
+
109
+ def test_one_id_sequence_across_node():
110
+ node = _qs_node(pb.build(_select_cfg(), _ctx()))
111
+ ids = []
112
+ for p in node["Parameters"]:
113
+ for v in p.get("Variable") or []:
114
+ ids.append(v["id"])
115
+ val = p.get("Value")
116
+ if isinstance(val, list):
117
+ for row in val:
118
+ ids += [v["id"] for v in (row.get("source", {}).get("variable") or [])]
119
+ assert ids == sorted(set(ids)) and ids == list(range(len(ids))) # contiguous, unique
120
+
121
+
122
+ def test_designer_mirror():
123
+ node = _qs_node(pb.build(_select_cfg(), _ctx()))
124
+ q = _cd(node, "b102")["value"] # code-editor -> ds.<id>[.<col>]
125
+ # Laid out over lines on the way in, so the node is readable in the designer. The clauses,
126
+ # the chips and the parameter are unchanged; only the whitespace between them is new.
127
+ assert q.splitlines() == [f"select ds.{_STORE}.{_C_NAME}",
128
+ f"from ds.{_STORE}",
129
+ f"where ds.{_STORE}.{_C_TIER} <= @maxTier"]
130
+ prow = _cd(node, "b103")["value"][0] # map-parameters designer row
131
+ assert prow["destination"] == "maxTier" and prow["source"] # var id
132
+ assert _cd(node, "b105")["value"] and _cd(node, "b106")["value"] # output var ids
133
+
134
+
135
+ def test_join_two_data_stores():
136
+ cfg = {"title": "t", "variables": [_ROWS, _CNT],
137
+ "actions": [{"id": "q", "action": "Query Store", "queryStore": {
138
+ "sql": "SELECT c.{{col:QS_Customers.Name}} AS Customer, SUM(o.{{col:QS_Orders.Amount}}) AS Rev "
139
+ "FROM {{ds:QS_Customers}} AS c JOIN {{ds:QS_Orders}} AS o "
140
+ "ON o.{{col:QS_Orders.CustomerCode}} = c.{{col:QS_Customers.CustomerCode}} "
141
+ "GROUP BY c.{{col:QS_Customers.Name}}",
142
+ "resultRows": "rows", "totalCount": "count"}}]}
143
+ node = _qs_node(pb.build(cfg, _ctx()))
144
+ chips = _param(node, "b102")["Variable"]
145
+ stores = {c["dataStoreId"] for c in chips}
146
+ assert stores == {_STORE, _ORD} # both data stores chipped
147
+ assert {c["columnId"] for c in chips if c["type"] == "dataStoreColumn"} == {
148
+ _C_NAME, _O_AMT, _O_CUST, _C_CODE}
149
+
150
+
151
+ def test_guid_passthrough_without_meta():
152
+ cfg = {"title": "t", "variables": [_ROWS],
153
+ "actions": [{"id": "q", "action": "Query Store", "queryStore": {
154
+ "sql": f"select {{{{col:{_STORE}.{_C_NAME}}}}} from {{{{ds:{_STORE}}}}}",
155
+ "resultRows": "rows"}}]}
156
+ ctx = {"new_id": lambda: "00000000-0000-0000-0000-000000000001"} # no datastore_meta
157
+ node = _qs_node(pb.build(cfg, ctx))
158
+ chips = _param(node, "b102")["Variable"]
159
+ assert chips[0]["columnId"] == _C_NAME and chips[1]["dataStoreId"] == _STORE
160
+
161
+
162
+ def test_unknown_store_name_raises():
163
+ cfg = {"title": "t", "variables": [_ROWS],
164
+ "actions": [{"id": "q", "action": "Query Store", "queryStore": {
165
+ "sql": "select {{col:Nope.Name}} from {{ds:Nope}}", "resultRows": "rows"}}]}
166
+ with pytest.raises(Exception) as e:
167
+ pb.build(cfg, _ctx())
168
+ assert "unknown Data Store" in str(e.value)
169
+
170
+
171
+ def test_fe_validation_clean():
172
+ assert fv.validate_flow(pb.build(_select_cfg(), _ctx())) == []
@@ -0,0 +1,56 @@
1
+ """A config can declare the platform's ProcessInfo variable, and bind its fields.
2
+
3
+ ProcessInfo is an ordinary flow variable of a fixed model (type 40, SystemDataModel) that the
4
+ designer adds the first time something references it - it is NOT ambient and NOT automatic. A
5
+ process rebuilt from a config therefore loses it silently unless the config can ask for it,
6
+ which is what `direction: "processinfo"` is for. Its `workspaceId` is the honest source for the
7
+ workspace a run belongs to: always right, never configured, and correct after an import.
8
+ """
9
+ import tools.procesio.dto.process.builder as pb
10
+
11
+ SYSTEM_MODEL = "10c6ac59-3929-49e6-99dc-121212121221"
12
+ WORKSPACE_ATTR = "75044bb4-7c70-40f2-8756-21c03de655c8"
13
+
14
+
15
+ def _cfg(actions=None):
16
+ return {"title": "t",
17
+ "variables": [{"name": "ProcessInfo", "direction": "processinfo"},
18
+ {"name": "out", "type": "string", "direction": "output"}],
19
+ "actions": actions or []}
20
+
21
+
22
+ def _build(monkeypatch=None):
23
+ return pb.build(_cfg(), {"var_ids": {"processinfo": "11111111-1111-1111-1111-111111111111",
24
+ "out": "22222222-2222-2222-2222-222222222222"}})
25
+
26
+
27
+ def test_processinfo_is_emitted_as_a_type_40_system_variable():
28
+ dto = pb.build(_cfg(), {"var_ids": {"processinfo": "11111111-1111-1111-1111-111111111111",
29
+ "out": "22222222-2222-2222-2222-222222222222"}})
30
+ variables = dto.get("Variables") or dto.get("variables")
31
+ pi = next(v for v in variables if (v.get("Name") or v.get("name")) == "ProcessInfo")
32
+ assert (pi.get("Type") or pi.get("type")) == 40
33
+ assert (pi.get("DataType") or pi.get("dataType")) == SYSTEM_MODEL
34
+ assert not (pi.get("IsList") or pi.get("isList"))
35
+
36
+
37
+ def test_direction_is_published_in_the_schema():
38
+ import json
39
+ import pathlib
40
+ schema = json.loads((pathlib.Path(pb.__file__).parent / "config.schema.json")
41
+ .read_text(encoding="utf-8"))
42
+ found = json.dumps(schema)
43
+ assert "processinfo" in found, "the config schema must offer the processinfo direction"
44
+
45
+
46
+ def test_the_model_is_registered_so_a_path_binding_can_resolve():
47
+ """`{var: ProcessInfo, path: [workspaceId]}` needs the variable's model in ctx to resolve."""
48
+ ctx = {}
49
+ cfg = _cfg()
50
+ # prepare_ctx fills var_models from `model`; a processinfo variable must get the fixed one
51
+ # without the config naming it.
52
+ var_models = {}
53
+ for v in cfg["variables"]:
54
+ if str(v.get("direction", "")).lower() == "processinfo":
55
+ var_models[v["name"].lower()] = pb.SYSTEM_DATA_MODEL_ID
56
+ assert var_models["processinfo"] == SYSTEM_MODEL
@@ -0,0 +1,127 @@
1
+ """Multi-credential profile store: CRUD, default resolution, secret hygiene."""
2
+ from __future__ import annotations
3
+
4
+ import argparse
5
+ import json
6
+
7
+ import pytest
8
+
9
+ from tools.procesio import profiles
10
+ from tools.procesio.errors import AuthError, UsageError
11
+
12
+
13
+ def test_save_and_get_roundtrip(store):
14
+ profiles.save_profile("p", {"type": "apikey", "key": "K", "value": "V"})
15
+ blob = profiles.get_profile("p")
16
+ assert blob["key"] == "K" and blob["value"] == "V"
17
+ assert "p" in profiles.profile_names()
18
+
19
+
20
+ def test_first_profile_becomes_default(store):
21
+ profiles.save_profile("first", {"type": "apikey", "key": "K", "value": "V"})
22
+ assert profiles.get_default() == "first"
23
+ profiles.save_profile("second", {"type": "apikey", "key": "K", "value": "V"})
24
+ assert profiles.get_default() == "first" # adding more doesn't change default
25
+
26
+
27
+ def test_index_has_no_secret_values(store):
28
+ profiles.save_profile("p", {"type": "apikey", "key": "K", "value": "TOPSECRET",
29
+ "workspace": "w"})
30
+ raw_index = store.get("procesio", "credentials")
31
+ assert "TOPSECRET" not in raw_index
32
+ assert json.loads(raw_index)[0]["name"] == "p"
33
+
34
+
35
+ def test_public_view_redacts_secrets(store):
36
+ profiles.save_profile("p", {"type": "userpass", "username": "u@example.com",
37
+ "password": "PW"})
38
+ view = profiles.public_view(profiles.get_profile("p"), "p")
39
+ assert view["username"] == "u@example.com"
40
+ assert "password" not in view
41
+ assert view["has_password"] is True
42
+
43
+
44
+ def test_resolve_explicit_default_and_single(store):
45
+ with pytest.raises(UsageError):
46
+ profiles.resolve(None) # nothing stored, ambiguous
47
+ profiles.save_profile("only", {"type": "apikey", "key": "K", "value": "V"})
48
+ name, _ = profiles.resolve(None)
49
+ assert name == "only"
50
+ profiles.save_profile("other", {"type": "apikey", "key": "K", "value": "V"})
51
+ profiles.set_default("other")
52
+ assert profiles.resolve(None)[0] == "other"
53
+ assert profiles.resolve("only")[0] == "only"
54
+
55
+
56
+ def test_remove_fixes_default(store):
57
+ profiles.save_profile("a", {"type": "apikey", "key": "K", "value": "V"})
58
+ profiles.save_profile("b", {"type": "apikey", "key": "K", "value": "V"})
59
+ profiles.set_default("a")
60
+ profiles.remove_profile("a")
61
+ assert "a" not in profiles.profile_names()
62
+ assert profiles.get_default() == "b" # default moved to a survivor
63
+
64
+
65
+ def test_get_missing_profile_raises(store):
66
+ with pytest.raises(AuthError):
67
+ profiles.get_profile("nope")
68
+
69
+
70
+ def test_token_cache_roundtrip(store):
71
+ profiles.set_token_cache("p", {"access_token": "T", "expires_at": 123})
72
+ assert profiles.get_token_cache("p")["access_token"] == "T"
73
+ profiles.clear_token_cache("p")
74
+ assert profiles.get_token_cache("p") is None
75
+
76
+
77
+ # -- add-credential secret hygiene ------------------------------------------
78
+
79
+ def test_apikey_secrets_are_prompted_when_flags_are_omitted(monkeypatch):
80
+ """A key passed as --key/--value lands in shell history and every process
81
+ listing, which defeats storing it in the credential manager at all. Omitting
82
+ the flag on a TTY must prompt instead of erroring."""
83
+ from tools.procesio.handlers import profile_admin
84
+
85
+ monkeypatch.setattr(profile_admin.sys.stdin, "isatty", lambda: True)
86
+ asked = []
87
+
88
+ def fake_getpass(prompt):
89
+ asked.append(prompt)
90
+ return {
91
+ "PROCESIO API key name: ": "KN",
92
+ "PROCESIO API key value (shown once): ": "KV",
93
+ }[prompt]
94
+
95
+ monkeypatch.setattr(profile_admin.getpass, "getpass", fake_getpass)
96
+ saved = {}
97
+ monkeypatch.setattr(profile_admin.profiles, "save_profile",
98
+ lambda n, b: saved.update({"name": n, "blob": b}))
99
+ monkeypatch.setattr(profile_admin.profiles, "get_default", lambda: None)
100
+
101
+ args = argparse.Namespace(
102
+ name="p", type="apikey", key=None, value=None, workspace_id=None,
103
+ workspace=None, username=None, password=None, realm=None, client_id=None,
104
+ web_base=None, auth_base=None, make_default=False)
105
+ out = profile_admin.add_credential(args)
106
+
107
+ assert asked == [
108
+ "PROCESIO API key name: ",
109
+ "PROCESIO API key value (shown once): ",
110
+ ]
111
+ assert saved["blob"]["key"] == "KN" and saved["blob"]["value"] == "KV"
112
+ # The returned view must never carry the secret back out.
113
+ assert "KV" not in json.dumps(out)
114
+
115
+
116
+ def test_omitted_secret_without_a_tty_is_a_usage_error(monkeypatch):
117
+ """CI / tool-to-tool callers still pass the flag; failing loudly beats hanging
118
+ on a getpass prompt nobody can answer."""
119
+ from tools.procesio.handlers import profile_admin
120
+
121
+ monkeypatch.setattr(profile_admin.sys.stdin, "isatty", lambda: False)
122
+ args = argparse.Namespace(
123
+ name="p", type="apikey", key=None, value=None, workspace_id=None,
124
+ workspace=None, username=None, password=None, realm=None, client_id=None,
125
+ web_base=None, auth_base=None, make_default=False)
126
+ with pytest.raises(UsageError, match="--key"):
127
+ profile_admin.add_credential(args)