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,115 @@
1
+ """Load the agent's knowledge base (the markdown docs in this folder).
2
+
3
+ The `guidance` action serves these so any session/LLM loads the methodology from
4
+ ONE registry-discoverable place instead of re-deriving it. The docs are the
5
+ source of truth; this module just reads them.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from pathlib import Path
10
+
11
+ KB_DIR = Path(__file__).resolve().parent
12
+
13
+ # The form-building guide lives beside the TOOL it documents (form DTO, event config,
14
+ # field paths), not in this folder. Serving it from here rather than copying it keeps
15
+ # one source of truth: a 100 KB guide duplicated into the agent would be stale within a
16
+ # release, and the version the model reads is the one that would be wrong.
17
+ FORM_GUIDE = KB_DIR.parents[1] / "tools" / "procesio" / "FORM-DEV-GUIDE"
18
+
19
+ # The house style, distilled from auditing a production workspace: HOW this team builds,
20
+ # where the best-practices doc says WHAT good looks like. Served per file like the form
21
+ # guide (~80 KB together); `patterns` is the index and names the rest.
22
+ PATTERNS = KB_DIR / "IMPLEMENTATION-PATTERNS"
23
+
24
+ # topic -> (path relative to KB_DIR, or an absolute Path; human label)
25
+ TOPICS: dict[str, tuple[str | Path, str]] = {
26
+ "playbook": ("PROCESIO-BUILD-AND-TEST-PLAYBOOK.md",
27
+ "Build-and-test operating procedure"),
28
+ "best-practices": ("PROCESIO-BEST-PRACTICES.md",
29
+ "PROCESIO implementation best practices"),
30
+ "visual-organization": ("PROCESIO-VISUAL-ORGANIZATION.md",
31
+ "Visual canvas layout + recurring build patterns"),
32
+ "datastore": ("PROCESIO-DATASTORE.md",
33
+ "Data Store module: API actions, process node, form trigger"),
34
+ "scheduling": ("PROCESIO-SCHEDULING.md",
35
+ "Scheduling a process (recurrences + crontab)"),
36
+ "environments": ("PROCESIO-ENVIRONMENTS.md",
37
+ "Working across PROCESIO environments (switch/add <Client>-<ENV>)"),
38
+ "reliability": ("PROCESIO-API-RELIABILITY-DOCTRINE.md",
39
+ "Driving the PROCESIO Web API safely: sequential calls, "
40
+ "behavioural verification, deadlines/retries, form-build traps"),
41
+ "boundary": ("README.md", "Agent knowledge base + tool-vs-agent boundary"),
42
+
43
+ # Building a FORM is a different discipline from building a process, and asking for
44
+ # it returned `unknown topic` - so an agent that needed the field-path shape, the
45
+ # event contract or the known traps had no way to reach the guide that documents
46
+ # all three. Measured cost of that gap in one run: a RUN_PROCESS map written with
47
+ # invented paths ("root.fields.<id>.value" instead of the four-GUID chain) and the
48
+ # two sides transposed, which the API accepts silently and which binds nothing.
49
+ #
50
+ # Served as ONE entry per guide file rather than a single `forms` blob: the guide is
51
+ # ~100 KB, over the character budget a run carries forward, so a single topic would
52
+ # be an answer no step could keep. `forms` is the index, which names the rest.
53
+ "forms": (FORM_GUIDE / "00-INDEX.md",
54
+ "Form development guide - START HERE, names the sub-topics below"),
55
+ "forms-anatomy": (FORM_GUIDE / "01-ANATOMY.md",
56
+ "Form anatomy: elements, config ids, the field VALUE PATH"),
57
+ "forms-code": (FORM_GUIDE / "02-CODE-INJECTION.md",
58
+ "Injecting custom code into a form"),
59
+ "forms-dom": (FORM_GUIDE / "03-DOM-CONTRACT.md",
60
+ "The rendered DOM contract a form's code may rely on"),
61
+ "forms-interaction": (FORM_GUIDE / "04-INTERACTION-RECIPES.md",
62
+ "Interaction recipes: show/hide, validation, computed fields"),
63
+ "forms-motion": (FORM_GUIDE / "05-STEPPER-AND-MOTION.md",
64
+ "Multi-step forms (stepper) and motion"),
65
+ "forms-process": (FORM_GUIDE / "06-PROCESS-INTEGRATION.md",
66
+ "Wiring a control to a process: RUN_PROCESS event, inputMap/"
67
+ "outputMap row shape, form value paths"),
68
+ "forms-deploy": (FORM_GUIDE / "07-DEPLOY-WORKFLOW.md",
69
+ "Publishing a form and its custom URL"),
70
+ "forms-pitfalls": (FORM_GUIDE / "08-PITFALLS.md",
71
+ "Known form traps and their signatures"),
72
+
73
+ "patterns": (PATTERNS / "00-INDEX.md",
74
+ "House implementation patterns - START HERE, names the sub-topics + the "
75
+ "workspace-knowledge folder convention"),
76
+ "patterns-processes": (PATTERNS / "01-PROCESSES.md",
77
+ "How we build processes: result flags, HTML rendering, Node idioms, utilities"),
78
+ "patterns-forms": (PATTERNS / "02-FORMS.md",
79
+ "How we build forms and form<->process communication"),
80
+ "patterns-integrations": (PATTERNS / "03-INTEGRATIONS.md",
81
+ "How we build integrations: webhooks, ERP, SFTP, LLM extraction, documents"),
82
+ "patterns-database": (PATTERNS / "04-DATABASE.md",
83
+ "How we design tables and stored procedures for PROCESIO"),
84
+ }
85
+
86
+ # `topic=all` concatenates everything it lists, so the form guide's chapters stay out of
87
+ # it: they would multiply that payload sixfold and bury the process guidance most callers
88
+ # actually asked for. The `forms` index IS included - it is small and it advertises the
89
+ # chapters, which is exactly what a caller who did not know they existed needs.
90
+ _ALL_EXCLUDED = {t for t in TOPICS if t.startswith(("forms-", "patterns-"))}
91
+
92
+
93
+ def topics() -> list[str]:
94
+ return list(TOPICS.keys())
95
+
96
+
97
+ def load(topic: str) -> dict:
98
+ if topic not in TOPICS:
99
+ raise KeyError(
100
+ f"unknown topic: {topic}. Known: {', '.join(TOPICS)}")
101
+ filename, label = TOPICS[topic]
102
+ path = filename if isinstance(filename, Path) else KB_DIR / filename
103
+ if not path.exists():
104
+ raise FileNotFoundError(f"knowledge file missing: {path}")
105
+ return {
106
+ "topic": topic,
107
+ "label": label,
108
+ "source": str(path),
109
+ "content": path.read_text(encoding="utf-8"),
110
+ }
111
+
112
+
113
+ def load_all() -> list[dict]:
114
+ """Every topic that belongs in a `topic=all` answer (see _ALL_EXCLUDED)."""
115
+ return [load(t) for t in TOPICS if t not in _ALL_EXCLUDED]
@@ -0,0 +1,89 @@
1
+ """procesio agent entrypoint - action dispatch.
2
+
3
+ Drives the `procesio` tool (and, in later slices, web + google-* for forms and
4
+ deliverables) to create, verify, and audit PROCESIO resources. Invoked exactly
5
+ like an action-dispatch tool: action name first, JSON in / JSON out. It is the
6
+ executable side of the build-and-test playbook in this folder.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import sys
11
+ from pathlib import Path
12
+
13
+ AGENT_ROOT = Path(__file__).resolve().parent
14
+ FRAMEWORK_ROOT = AGENT_ROOT.parents[1]
15
+ # .venv layout is per-OS: Scripts/python.exe on Windows, bin/python everywhere else.
16
+ _VENV_PY = (FRAMEWORK_ROOT / ".venv" / "Scripts" / "python.exe" if sys.platform == "win32"
17
+ else FRAMEWORK_ROOT / ".venv" / "bin" / "python")
18
+ if _VENV_PY.exists() and Path(sys.executable).resolve() != _VENV_PY.resolve():
19
+ import subprocess
20
+ sys.exit(subprocess.run([str(_VENV_PY), __file__, *sys.argv[1:]]).returncode)
21
+
22
+ import argparse # noqa: E402
23
+
24
+ if str(FRAMEWORK_ROOT) not in sys.path:
25
+ sys.path.insert(0, str(FRAMEWORK_ROOT))
26
+
27
+ from tools._lib.io import emit, fail # noqa: E402
28
+ from agents._lib import errors # noqa: E402
29
+ from agents._lib.actiondef import ActionDef # noqa: E402
30
+
31
+
32
+ class _Parser(argparse.ArgumentParser):
33
+ def error(self, message: str):
34
+ raise errors.UsageError(message)
35
+
36
+
37
+ def collect_actions() -> dict[str, ActionDef]:
38
+ actions: dict[str, ActionDef] = {}
39
+ from agents.procesio.handlers import (status, guidance, checklist as checklist_h,
40
+ verify as verify_h, audit as audit_h)
41
+ actions.update(status.ACTIONS)
42
+ actions.update(guidance.ACTIONS)
43
+ actions.update(checklist_h.ACTIONS)
44
+ actions.update(verify_h.ACTIONS)
45
+ actions.update(audit_h.ACTIONS)
46
+ return actions
47
+
48
+
49
+ ACTIONS = collect_actions()
50
+
51
+
52
+ def _build_context():
53
+ from agents.procesio.context import ProcesioContext
54
+ return ProcesioContext.create()
55
+
56
+
57
+ def dispatch(action: str, argv: list[str], *, context_builder=None) -> dict:
58
+ if action not in ACTIONS:
59
+ raise errors.UsageError(
60
+ f"unknown action: {action}. Known: {', '.join(sorted(ACTIONS))}")
61
+ defn = ACTIONS[action]
62
+ parser = _Parser(prog=f"procesio {action}", description=defn.description)
63
+ defn.add_args(parser)
64
+ parsed = parser.parse_args(argv)
65
+ if defn.context:
66
+ builder = context_builder or _build_context
67
+ ctx = builder()
68
+ return defn.func(ctx, parsed)
69
+ return defn.func(parsed)
70
+
71
+
72
+ def main(argv=None) -> None:
73
+ argv = list(sys.argv[1:] if argv is None else argv)
74
+ if not argv or argv[0] in ("-h", "--help"):
75
+ print("Actions:", file=sys.stderr)
76
+ for name in sorted(ACTIONS):
77
+ print(f" {name:<12} {ACTIONS[name].description}", file=sys.stderr)
78
+ sys.exit(0)
79
+ action, rest = argv[0], argv[1:]
80
+ try:
81
+ result = dispatch(action, rest)
82
+ except Exception as exc: # noqa: BLE001
83
+ code, message, details, exit_code = errors.classify(exc)
84
+ fail(code, message, details, exit_code)
85
+ emit(result)
86
+
87
+
88
+ if __name__ == "__main__":
89
+ main()
File without changes
@@ -0,0 +1,62 @@
1
+ """Fixtures for the PROCESIO agent tests. Zero live calls: the tool invoker is a
2
+ recording fake, Credential Manager is never touched.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ import sys
7
+ from pathlib import Path
8
+
9
+ import pytest
10
+
11
+ FRAMEWORK_ROOT = Path(__file__).resolve().parents[3]
12
+ if str(FRAMEWORK_ROOT) not in sys.path:
13
+ sys.path.insert(0, str(FRAMEWORK_ROOT))
14
+
15
+
16
+ @pytest.fixture(autouse=True)
17
+ def _no_keyring(monkeypatch):
18
+ from tools._lib import creds
19
+ monkeypatch.setattr(creds, "get_optional", lambda tool, name: None)
20
+ monkeypatch.setattr(creds, "has", lambda tool, name: False)
21
+
22
+
23
+ class FakeInvoke:
24
+ """Drop-in for toolrunner.invoke: __call__(tool, action, *args) -> dict.
25
+
26
+ Map an action name to the dict it should return, or to a ToolError instance
27
+ to simulate a tool failure. Records every call for assertions.
28
+ """
29
+
30
+ def __init__(self):
31
+ self.calls: list[tuple[str, str, list]] = []
32
+ self._map: dict[str, object] = {}
33
+
34
+ def set(self, action: str, value) -> "FakeInvoke":
35
+ self._map[action] = value
36
+ return self
37
+
38
+ def __call__(self, tool: str, action: str, *args):
39
+ self.calls.append((tool, action, list(args)))
40
+ v = self._map.get(action, {})
41
+ if isinstance(v, Exception):
42
+ raise v
43
+ return v
44
+
45
+
46
+ @pytest.fixture
47
+ def fake_invoke():
48
+ return FakeInvoke()
49
+
50
+
51
+ def flow(actions, *, title="T", description="") -> dict:
52
+ """Build a get-process style envelope around a flow with these actions."""
53
+ return {"result": {"flow": {
54
+ "Title": title, "Description": description, "Actions": actions}}}
55
+
56
+
57
+ def action(template, *, params=None, settings=None, name=None) -> dict:
58
+ a = {"ActionName": name or template, "ActionTemplateName": template,
59
+ "Parameters": params or []}
60
+ if settings is not None:
61
+ a["CustomData"] = {"configuration": [{"settings": settings}]}
62
+ return a
@@ -0,0 +1,91 @@
1
+ from __future__ import annotations
2
+
3
+ from agents.procesio import audit
4
+ from agents.procesio.tests.conftest import action
5
+
6
+ START = action("Start")
7
+ STOP = action("Stop")
8
+
9
+
10
+ def _codes(findings):
11
+ return {f["code"] for f in findings}
12
+
13
+
14
+ def test_clean_process_has_no_correctness_findings():
15
+ configured = action("Add", params=[{"Value": "x", "Variable": []}],
16
+ settings=[{"value": "x"}])
17
+ flow = {"Title": "Clean", "Description": "does a thing",
18
+ "Actions": [START, configured, STOP]}
19
+ assert audit.correctness_findings(flow) == []
20
+
21
+
22
+ def test_designer_blank_is_flagged_as_correctness_warn():
23
+ # runtime Parameters set, designer configuration empty -> the documented bug
24
+ blank = action("Send Email", params=[{"Value": "<%0%>", "Variable": [{"id": 0}]}],
25
+ settings=[{"value": ""}])
26
+ flow = {"Actions": [START, blank, STOP]}
27
+ cf = audit.correctness_findings(flow)
28
+ assert "designer-blank" in _codes(cf)
29
+ assert all(f["severity"] in ("warn", "fail") for f in cf)
30
+
31
+
32
+ def test_datastore_masquerade_flagged_as_fail():
33
+ # a Call API node NAMED like a cache op is the FX-usecase bug: it never touches
34
+ # the Data Store, but the process still runs green.
35
+ masq = action("Call API", name="Cache read")
36
+ flow = {"Actions": [START, masq, STOP]}
37
+ cf = audit.correctness_findings(flow)
38
+ hits = [f for f in cf if f["code"] == "datastore-as-callapi"]
39
+ assert hits and hits[0]["severity"] == "fail"
40
+ assert hits[0]["action"] == "Cache read"
41
+
42
+
43
+ def test_real_datastore_node_and_plain_callapi_not_flagged():
44
+ real_cache = action("Data Store", name="Cache read",
45
+ params=[{"Value": "x"}], settings=[{"value": "x"}])
46
+ plain_api = action("Call API", name="Fetch BNR XML",
47
+ params=[{"Value": "https://bnr.ro"}], settings=[{"value": "url"}])
48
+ flow = {"Actions": [START, real_cache, plain_api, STOP]}
49
+ assert "datastore-as-callapi" not in _codes(audit.correctness_findings(flow))
50
+
51
+
52
+ def test_practice_smells_flagged():
53
+ acts = [START, STOP]
54
+ acts += [action("Call API"), action("SQL Server"), action("Decisional")]
55
+ acts += [action(f"Add{i}", params=[{"Value": "1"}], settings=[{"value": "1"}])
56
+ for i in range(4)] # push count over 5
57
+ flow = {"Title": "Heavy", "Description": "", "Actions": acts}
58
+ rep = audit.audit_process(flow)
59
+ codes = _codes(rep["findings"])
60
+ assert "high-action-count" in codes
61
+ assert "slow-actions" in codes
62
+ assert "missing-description" in codes
63
+ assert rep["summary"]["nonstructural_action_count"] == 7
64
+
65
+
66
+ def test_audit_handles_live_camelcase_shape():
67
+ # the LIVE Web-API returns camelCase; the auditor must work on it, not just
68
+ # PascalCase export goldens (regression: live audit found 0 actions before ci()).
69
+ flow = {"title": "Live", "description": "", "actions": [
70
+ {"actionTemplateName": "Start", "parameters": []},
71
+ {"actionName": "notify", "actionTemplateName": "Send Email",
72
+ "parameters": [{"value": "<%0%>", "variable": [{"id": 0}]}],
73
+ "customData": {"configuration": [{"settings": [{"value": ""}]}]}},
74
+ {"actionTemplateName": "Stop", "parameters": []}]}
75
+ rep = audit.audit_process(flow)
76
+ assert rep["summary"]["nonstructural_action_count"] == 1
77
+ assert rep["summary"]["title"] == "Live"
78
+ assert "designer-blank" in _codes(rep["findings"])
79
+
80
+
81
+ def test_inline_secret_flagged_but_guid_credential_is_not():
82
+ secret = action("Connect", params=[{"Value": "p@ssw0rd-secret-value", "Variable": []}])
83
+ credid = action("Send Email",
84
+ params=[{"Value": "2aacf4f1-310c-469f-80ef-394d6ab9582f", "Variable": []}])
85
+ flow = {"Actions": [START, secret, credid, STOP]}
86
+ codes = _codes(audit.audit_process(flow)["findings"])
87
+ assert "possible-inline-secret" in codes
88
+ # the credential GUID literal must NOT be mistaken for a secret
89
+ secret_findings = [f for f in audit.audit_process(flow)["findings"]
90
+ if f["code"] == "possible-inline-secret"]
91
+ assert all(f["action"] != "Send Email" for f in secret_findings)
@@ -0,0 +1,28 @@
1
+ from __future__ import annotations
2
+
3
+ from agents.procesio import checklist as cl
4
+
5
+
6
+ def test_all_steps_have_required_keys():
7
+ keys = {"id", "phase", "title", "how", "tool", "automatable", "citation"}
8
+ for s in cl.STEPS:
9
+ assert keys <= set(s), f"{s.get('id')} missing {keys - set(s)}"
10
+ assert s["phase"] in cl.PHASES
11
+
12
+
13
+ def test_phase_filter():
14
+ val = cl.steps(phase="validate")
15
+ assert val and all(s["phase"] == "validate" for s in val)
16
+
17
+
18
+ def test_automatable_only_is_subset():
19
+ auto = cl.steps(automatable_only=True)
20
+ assert auto and all(s["automatable"] for s in auto)
21
+ assert len(auto) < len(cl.STEPS) # there are genuine manual steps too
22
+
23
+
24
+ def test_manual_steps_are_the_non_automatable_ones():
25
+ manual = cl.manual_steps()
26
+ assert manual and all(not s["automatable"] for s in manual)
27
+ # the real-browser form check must be in the manual set - it cannot be automated
28
+ assert "form-behavior" in {s["id"] for s in manual}
@@ -0,0 +1,78 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+
5
+ import pytest
6
+
7
+ from agents.procesio import knowledge
8
+
9
+
10
+ def test_topics_present():
11
+ assert set(knowledge.topics()) == {
12
+ "playbook", "best-practices", "visual-organization", "datastore",
13
+ "scheduling", "environments", "reliability", "boundary",
14
+ "forms", "forms-anatomy", "forms-code", "forms-dom", "forms-interaction",
15
+ "forms-motion", "forms-process", "forms-deploy", "forms-pitfalls",
16
+ "patterns", "patterns-processes", "patterns-forms", "patterns-integrations",
17
+ "patterns-database"}
18
+
19
+
20
+ def test_each_topic_loads_real_content():
21
+ for t in knowledge.topics():
22
+ doc = knowledge.load(t)
23
+ assert doc["content"].strip(), f"{t} empty"
24
+ assert Path(doc["source"]).exists()
25
+ assert doc["topic"] == t
26
+
27
+
28
+ def test_all_excludes_the_form_chapters_but_keeps_their_index():
29
+ """`topic=all` is a payload a run carries forward under a character budget. The
30
+ form guide is ~100 KB across nine files; folding it in would evict the process
31
+ guidance most callers asked for. The index is small and advertises the rest."""
32
+ served = {d["topic"] for d in knowledge.load_all()}
33
+ assert "forms" in served
34
+ assert not [t for t in served if t.startswith(("forms-", "patterns-"))]
35
+ assert "patterns" in served
36
+ assert sum(len(d["content"]) for d in knowledge.load_all()) < 100_000
37
+
38
+
39
+ def test_the_form_chapters_are_reachable_one_at_a_time():
40
+ for t in ("forms-anatomy", "forms-process", "forms-pitfalls"):
41
+ assert knowledge.load(t)["content"].strip()
42
+
43
+
44
+ def test_the_form_index_names_the_chapters_a_caller_must_ask_for():
45
+ """The index is the only form topic in `all`, so it has to be the map: a caller
46
+ that lands there must learn the sub-topics exist without a second guess."""
47
+ body = knowledge.load("forms")["content"]
48
+ for chapter in ("ANATOMY", "PROCESS-INTEGRATION", "PITFALLS"):
49
+ assert chapter in body
50
+
51
+
52
+ def test_the_process_integration_chapter_carries_the_map_row_contract():
53
+ """This is the fact the gap actually cost: a RUN_PROCESS map row's two sides are
54
+ objects with DIFFERENT shapes, and the form side's path is a four-GUID chain, not
55
+ a readable pseudo-path. If this ever stops being served, the guide is not doing
56
+ the one job it was registered for."""
57
+ body = knowledge.load("forms-process")["content"]
58
+ assert "inputMap" in body and "outputMap" in body
59
+ assert "11223344-5566-7788-99aa-aabbccddeeff" in body # the FIELDS_NS constant
60
+ assert "isList" in body # the row object shape
61
+
62
+
63
+ def test_unknown_topic_raises():
64
+ with pytest.raises(KeyError):
65
+ knowledge.load("nope")
66
+
67
+
68
+ def test_implementation_patterns_carry_no_workspace_data():
69
+ """Hard rule 10: the patterns are framework files read by other teams. They were
70
+ distilled from one client's workspace, so guard the obvious leaks: GUIDs, e-mail
71
+ addresses and connection strings."""
72
+ import re
73
+ for t in ("patterns", "patterns-processes", "patterns-forms", "patterns-integrations",
74
+ "patterns-database"):
75
+ text = knowledge.load(t)["content"]
76
+ assert not re.search(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}", text), t
77
+ assert not re.search(r"[\w.-]+@[\w-]+\.[a-z]{2,}", text), t
78
+ assert not re.search(r"(?i)password\s*=|pwd=\w", text), t
@@ -0,0 +1,48 @@
1
+ """Guard: agent.yaml must declare exactly the actions the dispatcher registers,
2
+ the per-action args must match, and every driven tool must be registered.
3
+ """
4
+ from __future__ import annotations
5
+
6
+ from pathlib import Path
7
+
8
+ from tools._lib.manifest import load_agent
9
+ from agents.procesio import main
10
+
11
+
12
+ def _manifest():
13
+ agent_root = Path(main.__file__).resolve().parent
14
+ return load_agent(agent_root / "agent.yaml")
15
+
16
+
17
+ def test_manifest_actions_match_dispatch():
18
+ m = _manifest()
19
+ assert set(m.action_names()) == set(main.ACTIONS), (
20
+ f"only in manifest: {set(m.action_names()) - set(main.ACTIONS)}; "
21
+ f"only in code: {set(main.ACTIONS) - set(m.action_names())}")
22
+
23
+
24
+ def test_expected_actions_registered():
25
+ assert set(main.ACTIONS) == {
26
+ "status", "guidance", "checklist", "verify", "audit"}
27
+
28
+
29
+ def test_declared_tools_are_registered():
30
+ from registry import get_tool
31
+ for tool_name in _manifest().tools:
32
+ get_tool(tool_name) # raises KeyError if missing
33
+
34
+
35
+ def test_manifest_args_match_dispatch():
36
+ """Each action's manifest args (kebab) must match the argparse flags the
37
+ handler registers (so the contract cannot drift from the code)."""
38
+ import argparse
39
+ m = _manifest()
40
+ for name, defn in main.ACTIONS.items():
41
+ parser = argparse.ArgumentParser()
42
+ defn.add_args(parser)
43
+ code_args = {a.dest.replace("_", "-") for a in parser._actions
44
+ if a.dest not in ("help",)}
45
+ spec = m.get_action(name)
46
+ manifest_args = {a.name for a in spec.args}
47
+ assert manifest_args == code_args, (
48
+ f"{name}: manifest {manifest_args} != code {code_args}")
@@ -0,0 +1,134 @@
1
+ from __future__ import annotations
2
+
3
+ from agents._lib.toolrunner import ToolError
4
+ from agents.procesio import verifylib
5
+ from agents.procesio.tests.conftest import action, flow
6
+
7
+ START = action("Start")
8
+ STOP = action("Stop")
9
+ CONFIGURED = action("Add", params=[{"Value": "x", "Variable": []}],
10
+ settings=[{"value": "x"}])
11
+
12
+
13
+ def _check(report, cid):
14
+ return next(c for c in report["checks"] if c["id"] == cid)
15
+
16
+
17
+ def test_clean_process_passes_without_run(fake_invoke):
18
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
19
+ fake_invoke.set("request", {"result": {"isValid": True}})
20
+ rep = verifylib.verify_process(fake_invoke, "pid")
21
+ assert rep["verdict"] == "pass"
22
+ assert _check(rep, "validate-process")["status"] == "pass"
23
+ assert _check(rep, "config-parity-audit")["status"] == "pass"
24
+ assert _check(rep, "run-instance")["status"] == "skip"
25
+ # manual checks must always be surfaced
26
+ assert any(s["id"] == "form-behavior" for s in rep["manual_checks"])
27
+
28
+
29
+ def test_designer_blank_drops_verdict_to_warn(fake_invoke):
30
+ blank = action("Send Email", params=[{"Value": "<%0%>", "Variable": [{"id": 0}]}],
31
+ settings=[{"value": ""}])
32
+ fake_invoke.set("get-process", flow([START, blank, STOP]))
33
+ fake_invoke.set("request", {"result": {"isValid": True}})
34
+ rep = verifylib.verify_process(fake_invoke, "pid")
35
+ assert rep["verdict"] == "warn"
36
+ assert _check(rep, "config-parity-audit")["status"] == "warn"
37
+
38
+
39
+ def test_validate_sends_flow_via_body_file_not_inline(fake_invoke):
40
+ # regression: a large flow passed as inline --body overflows the OS command line
41
+ # (Windows WinError 206 / POSIX E2BIG) and crashed the gate. The validate call must
42
+ # use --body-file, never --body.
43
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
44
+ fake_invoke.set("request", {"result": {"isValid": True}})
45
+ verifylib.verify_process(fake_invoke, "pid")
46
+ req = next(c for c in fake_invoke.calls
47
+ if c[0] == "procesio" and c[1] == "request" and "/api/Projects/validate" in c[2])
48
+ assert "--body-file" in req[2]
49
+ assert "--body" not in req[2]
50
+
51
+
52
+ def test_datastore_masquerade_hard_fails_the_gate(fake_invoke):
53
+ # a Call-API node named like a cache op is a hard defect (severity fail), so the
54
+ # config-parity check and the whole verdict must be `fail`, not merely `warn`.
55
+ masq = action("Call API", name="Cache read")
56
+ fake_invoke.set("get-process", flow([START, masq, STOP]))
57
+ fake_invoke.set("request", {"result": {"isValid": True}})
58
+ rep = verifylib.verify_process(fake_invoke, "pid")
59
+ assert _check(rep, "config-parity-audit")["status"] == "fail"
60
+ assert rep["verdict"] == "fail"
61
+
62
+
63
+ def test_run_finished_status_50_passes(fake_invoke):
64
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
65
+ fake_invoke.set("request", {"result": {"isValid": True}})
66
+ fake_invoke.set("run-process", {"result": {"id": "iid", "status": 50}})
67
+ fake_invoke.set("get-instance-status", {"result": {"status": 50, "actions": []}})
68
+ rep = verifylib.verify_process(fake_invoke, "pid", run=True)
69
+ assert rep["verdict"] == "pass"
70
+ assert _check(rep, "run-instance")["status"] == "pass"
71
+
72
+
73
+ def test_run_with_errors_status_40_fails(fake_invoke):
74
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
75
+ fake_invoke.set("request", {"result": {"isValid": True}})
76
+ fake_invoke.set("run-process", {"result": {"id": "iid", "status": 40}})
77
+ fake_invoke.set("get-instance-status", {"result": {
78
+ "status": 40, "actions": [{"name": "Add", "errorMessage": "boom"}]}})
79
+ rep = verifylib.verify_process(fake_invoke, "pid", run=True)
80
+ assert rep["verdict"] == "fail"
81
+ rc = _check(rep, "run-instance")
82
+ assert rc["status"] == "fail"
83
+ assert rc["detail"]["action_errors"][0]["errorMessage"] == "boom"
84
+
85
+
86
+ def test_validate_surfaces_400_validation_messages_as_warn(fake_invoke):
87
+ # PROCESIO returns HTTP 400 + a list of validation messages for an invalid
88
+ # process; verify must surface them as a warn, not skip.
89
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
90
+ fake_invoke.set("request", ToolError(
91
+ "procesio", "invalid_argument", "HTTP 400",
92
+ {"status": 400, "body": {"body": [
93
+ {"statusCode": 390, "value": "Action has too few input ports.",
94
+ "target": "prc"}]}}))
95
+ rep = verifylib.verify_process(fake_invoke, "pid")
96
+ vc = _check(rep, "validate-process")
97
+ assert vc["status"] == "warn"
98
+ assert vc["detail"]["errors"][0]["statusCode"] == 390
99
+ assert rep["verdict"] == "warn"
100
+
101
+
102
+ def test_validate_endpoint_error_is_skip_not_fail(fake_invoke):
103
+ fake_invoke.set("get-process", flow([START, CONFIGURED, STOP]))
104
+ fake_invoke.set("request", ToolError("procesio", "server_error", "no validate here"))
105
+ rep = verifylib.verify_process(fake_invoke, "pid")
106
+ assert _check(rep, "validate-process")["status"] == "skip"
107
+ assert rep["verdict"] == "pass" # a skipped optional check does not fail the gate
108
+
109
+
110
+ def test_verify_reads_live_camelcase_shapes(fake_invoke):
111
+ # regression: live get-process/instance status are camelCase and nest actions
112
+ # under instance.actions; verify must parse both.
113
+ fake_invoke.set("get-process", {"result": {"flow": {
114
+ "title": "Live", "actions": [
115
+ {"actionTemplateName": "Start", "parameters": []},
116
+ {"actionName": "a", "actionTemplateName": "Add",
117
+ "parameters": [{"value": "x"}],
118
+ "customData": {"configuration": [{"settings": [{"value": "x"}]}]}},
119
+ {"actionTemplateName": "Stop", "parameters": []}]}}})
120
+ fake_invoke.set("request", {"result": {"isValid": True}})
121
+ fake_invoke.set("run-process", {"result": {"id": "iid", "status": 50}})
122
+ fake_invoke.set("get-instance-status",
123
+ {"result": {"instance": {"status": 50, "actions": []}}})
124
+ rep = verifylib.verify_process(fake_invoke, "pid", run=True)
125
+ assert rep["title"] == "Live"
126
+ assert rep["verdict"] == "pass"
127
+ assert _check(rep, "run-instance")["status"] == "pass"
128
+
129
+
130
+ def test_fetch_failure_fails_fast(fake_invoke):
131
+ fake_invoke.set("get-process", ToolError("procesio", "not_found", "no such process"))
132
+ rep = verifylib.verify_process(fake_invoke, "pid")
133
+ assert rep["verdict"] == "fail"
134
+ assert _check(rep, "fetch")["status"] == "fail"