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,18 @@
1
+ """PROCESIO CLI + Agent - installed entry points.
2
+
3
+ The repository is path-based: a tool is a folder under ``tools/`` with its own
4
+ ``main.py``, and the runner resolves it by path rather than importing it by name
5
+ (``google-calendar`` is a folder name, never a module name). So the wheel ships the
6
+ whole tree under this package and puts this directory on ``sys.path``, which makes
7
+ ``import tools`` and ``import registry`` resolve exactly as they do in a clone.
8
+
9
+ Running from a clone is unchanged and still documented:
10
+ ``uv sync`` then ``python scripts/run-tool.py <tool> <action>``.
11
+ """
12
+ from pathlib import Path
13
+
14
+ __version__ = "0.1.1"
15
+
16
+ #: The bundled repository root. In a wheel this directory holds tools/, agents/,
17
+ #: scripts/, skills/ and registry.py; in a clone it is the package beside them.
18
+ ROOT = Path(__file__).resolve().parent
procesio_cli/_cli.py ADDED
@@ -0,0 +1,71 @@
1
+ """Console-script entry points.
2
+
3
+ Each one runs the corresponding script from the bundled tree, unchanged. Delegating
4
+ with ``runpy`` rather than importing a ``main()`` keeps one code path: the script a
5
+ clone runs and the script an installed package runs are the same file, so they cannot
6
+ drift apart.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import runpy
11
+ import sys
12
+
13
+ from . import ROOT
14
+
15
+
16
+ def _run(script: str, *, where: str = "scripts") -> int:
17
+ path = ROOT / where / script
18
+ if not path.is_file():
19
+ print(f"error: {script} is missing from the installed package", file=sys.stderr)
20
+ return 2
21
+ root = str(ROOT)
22
+ if root not in sys.path:
23
+ sys.path.insert(0, root) # so `import tools` / `import registry` resolve
24
+ sys.argv = [str(path), *sys.argv[1:]]
25
+ try:
26
+ runpy.run_path(str(path), run_name="__main__")
27
+ except SystemExit as exc: # the scripts exit through sys.exit
28
+ return int(exc.code or 0)
29
+ return 0
30
+
31
+
32
+ def run_tool() -> int:
33
+ return _run("run-tool.py")
34
+
35
+
36
+ def run_agent() -> int:
37
+ return _run("run-agent.py")
38
+
39
+
40
+ def list_tools() -> int:
41
+ return _run("list-tools.py")
42
+
43
+
44
+ def get_skill() -> int:
45
+ return _run("get-skill.py")
46
+
47
+
48
+ def mcp_server() -> int:
49
+ """The full stdio MCP server, as a command instead of an absolute path.
50
+
51
+ Configuring it used to mean writing /abs/path/to/the/clone into every client's
52
+ JSON. Installed, the client names a command and the path problem disappears.
53
+
54
+ Six generic tools over the whole registry, so any tool you add shows up without
55
+ integration code. That reach is the point, and it is also why this is not what the
56
+ plugin launches - see mcp_chat_server.
57
+ """
58
+ return _run("server.py", where="webplatform/aat_mcp")
59
+
60
+
61
+ def mcp_chat_server() -> int:
62
+ """The curated stdio MCP server: one named tool per operation.
63
+
64
+ What `.mcp.json` launches, and what a general chat client should get. Every tool
65
+ states what it does and none of them forward a caller-supplied action, which is
66
+ what makes the surface reviewable - by a person reading a directory listing, and
67
+ by a model choosing between tools.
68
+
69
+ `procesio-mcp` is still there for anyone who wants the whole registry.
70
+ """
71
+ return _run("chat_server.py", where="webplatform/aat_mcp")
File without changes
File without changes
@@ -0,0 +1,24 @@
1
+ """ActionDef - dispatchable action unit for agents.
2
+
3
+ Like the tool-side ActionDef, but instead of a `client` flag it has a `context`
4
+ flag: when True the dispatcher builds the agent's shared context (config + state
5
+ backend) and passes it as the first argument. Pure actions (status, version)
6
+ leave it False and just receive the parsed argparse namespace.
7
+ """
8
+ from __future__ import annotations
9
+
10
+ import argparse
11
+ from dataclasses import dataclass
12
+ from typing import Callable
13
+
14
+
15
+ def _no_args(_parser: argparse.ArgumentParser) -> None:
16
+ return None
17
+
18
+
19
+ @dataclass
20
+ class ActionDef:
21
+ func: Callable
22
+ add_args: Callable[[argparse.ArgumentParser], None] = _no_args
23
+ context: bool = False # True -> dispatch builds the agent context, passes it first
24
+ description: str = ""
@@ -0,0 +1,40 @@
1
+ """Shared error handling for agents.
2
+
3
+ Mirrors the tool-side contract: every uncaught exception is classified into a
4
+ (code, message, details, exit_code) tuple that becomes the {"error": ...} JSON
5
+ envelope. ToolError from a driven tool is surfaced with its origin preserved.
6
+ """
7
+ from __future__ import annotations
8
+
9
+ from typing import Any
10
+
11
+ from agents._lib.toolrunner import ToolError
12
+
13
+
14
+ class UsageError(Exception):
15
+ """Bad CLI usage (unknown action, missing/invalid arg). Exit code 2."""
16
+
17
+
18
+ class AgentError(Exception):
19
+ """Agent-level failure with an explicit error code."""
20
+
21
+ def __init__(self, code: str, message: str, details: dict[str, Any] | None = None):
22
+ self.code = code
23
+ self.message = message
24
+ self.details = details or {}
25
+ super().__init__(message)
26
+
27
+
28
+ def classify(exc: Exception) -> tuple[str, str, dict[str, Any], int]:
29
+ if isinstance(exc, UsageError):
30
+ return "usage_error", str(exc), {}, 2
31
+ if isinstance(exc, AgentError):
32
+ return exc.code, exc.message, exc.details, 1
33
+ if isinstance(exc, ToolError):
34
+ # A tool the agent drives failed. Keep its code/message and note the tool.
35
+ details = dict(exc.details)
36
+ details.setdefault("tool", exc.tool)
37
+ return f"tool:{exc.code}", f"{exc.tool}: {exc.message}", details, 1
38
+ if isinstance(exc, KeyError):
39
+ return "not_found", str(exc), {}, 1
40
+ return "internal_error", str(exc), {"type": type(exc).__name__}, 1
@@ -0,0 +1,236 @@
1
+ """Reversibility classification - the shared definition of "irreversible".
2
+
3
+ The decision policy turns on exactly one axis: reversible, act; irreversible, stop
4
+ and ask a human. This is a MODULE rather than a rule in a prompt because a rule in
5
+ a prompt is something a model can talk itself past. Here it is evaluated BEFORE the
6
+ model is asked anything, so an irreversible action cannot be auto-decided even when
7
+ the prompt is wrong.
8
+
9
+ Deliberately conservative. A hit means "treat as irreversible" and escalate or
10
+ refuse. A false positive costs one escalation; a false negative costs real-world
11
+ blast radius, and the caller reporting on itself is not a reliable witness. The
12
+ asymmetry is the reason to lean.
13
+
14
+ KNOW WHAT THIS IS. It matches VERBS, in English, in the action name and argv. An
15
+ action whose name carries no listed verb is reported reversible, so silence here is
16
+ absence of evidence and not a safety guarantee. Treat it as a guard rail that stops
17
+ the obvious mistakes, never as a sandbox: it does not inspect what a call will
18
+ actually do, and it does not read any language but English. Extending the verb list
19
+ is the intended way to close a gap you find.
20
+
21
+ One definition, one place. The verb list started inside a single agent's driver
22
+ loop; it lives here so that every caller shares it and no two of them can drift
23
+ into different ideas of what "irreversible" means.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import re
28
+
29
+ # Verbs / action fragments that name an irreversible, real-world side effect.
30
+ # Matched against a tool/agent name, its action verb (argv[0]), and every argv
31
+ # token. Kept as a flat tuple on purpose: greppable, testable, no clever grouping.
32
+ IRREVERSIBLE_VERBS: tuple[str, ...] = (
33
+ "send", "delete", "remove", "purge", "drop", "pay", "purchase", "buy",
34
+ "charge", "transfer", "post", "publish", "ban", "kick", "issue-invoice",
35
+ "wire", "refund", "archive", "revoke", "deactivate", "wipe",
36
+ )
37
+
38
+ # The four blast-radius classes worth naming: data loss, money out, message sent,
39
+ # someone else's production. Used to explain WHY something escalated, in terms a
40
+ # person recognises rather than an invented taxonomy.
41
+ _CLASS_OF_VERB: dict[str, str] = {
42
+ "send": "message-sent", "post": "message-sent", "publish": "message-sent",
43
+ "issue-invoice": "money-out", "pay": "money-out", "purchase": "money-out",
44
+ "buy": "money-out", "charge": "money-out", "transfer": "money-out",
45
+ "wire": "money-out", "refund": "money-out",
46
+ "delete": "data-loss", "remove": "data-loss", "purge": "data-loss",
47
+ "drop": "data-loss", "wipe": "data-loss", "archive": "data-loss",
48
+ "ban": "third-party-state", "kick": "third-party-state",
49
+ "revoke": "third-party-state", "deactivate": "third-party-state",
50
+ }
51
+
52
+
53
+ def _probe_hit(probe: str) -> str | None:
54
+ """Return the irreversible verb matched in one string, or None.
55
+
56
+ Word-ish match so `send` hits "send" and "send-message" but not "sender" or
57
+ "resend-guard". Hyphen/underscore/space are all treated as token separators
58
+ because tool actions are kebab-case and argv tokens are not.
59
+ """
60
+ probe = probe.lower()
61
+ for verb in IRREVERSIBLE_VERBS:
62
+ if probe == verb:
63
+ return verb
64
+ if re.search(rf"(^|[-_ ]){re.escape(verb)}([-_ ]|$)", probe):
65
+ return verb
66
+ return None
67
+
68
+
69
+ def match(name: str, argv: list[str] | None = None) -> str | None:
70
+ """Return the matched irreversible verb for an action, or None.
71
+
72
+ Checks the tool/agent name, the action verb (argv[0]), and every argv token.
73
+ This is the function drive.py's `_looks_irreversible` becomes.
74
+ """
75
+ argv = list(argv or [])
76
+ probes = [str(name)] + [str(tok) for tok in argv]
77
+ for probe in probes:
78
+ hit = _probe_hit(probe)
79
+ if hit:
80
+ return hit
81
+ return None
82
+
83
+
84
+ def classify(name: str, argv: list[str] | None = None) -> dict:
85
+ """Classify an action's reversibility.
86
+
87
+ Returns:
88
+ {"reversible": bool, "verb": str|None, "blast_class": str|None,
89
+ "reason": str}
90
+
91
+ `blast_class` is one of money-out, message-sent, data-loss or
92
+ third-party-state, and None when the action is reversible.
93
+ """
94
+ verb = match(name, argv)
95
+ if verb is None:
96
+ return {"reversible": True, "verb": None, "blast_class": None,
97
+ "reason": "no irreversible verb in action name or argv"}
98
+ blast = _CLASS_OF_VERB.get(verb, "irreversible")
99
+ return {"reversible": False, "verb": verb, "blast_class": blast,
100
+ "reason": f"action matches irreversible verb {verb!r} ({blast})"}
101
+
102
+
103
+ def classify_text(text: str) -> dict:
104
+ """Classify a free-text question / proposed action.
105
+
106
+ The deputy is asked questions in prose ("should I send the reminder?"), not
107
+ argv. Same verb list, tokenised over the text. Conservative by construction:
108
+ any irreversible verb anywhere in the text trips the gate, because the cost of
109
+ a needless escalation is one WhatsApp line and the cost of a miss is real.
110
+ """
111
+ for token in re.split(r"[^\w-]+", str(text).lower()):
112
+ if not token:
113
+ continue
114
+ hit = _probe_hit(token)
115
+ if hit:
116
+ blast = _CLASS_OF_VERB.get(hit, "irreversible")
117
+ return {"reversible": False, "verb": hit, "blast_class": blast,
118
+ "reason": f"text names irreversible verb {hit!r} ({blast})"}
119
+ return {"reversible": True, "verb": None, "blast_class": None,
120
+ "reason": "no irreversible verb in text"}
121
+
122
+
123
+ # ---------------------------------------------------------------------------
124
+ # Autonomy levels (spec P0.0-07). The binary gate above is generalized to four
125
+ # graded levels WITHOUT weakening it: today's behaviour (reversible runs;
126
+ # irreversible needs approval) is exactly L1, the default. Still code-authoritative
127
+ # and evaluated before the model is asked - a model cannot self-escalate.
128
+ # ---------------------------------------------------------------------------
129
+
130
+ LEVELS: tuple[str, ...] = ("L0", "L1", "L2", "L3")
131
+ _LEVEL_RANK = {lvl: i for i, lvl in enumerate(LEVELS)}
132
+
133
+ # Verbs that are PURE READS (no side effect). L0 allows ONLY these. Conservative by
134
+ # construction: anything whose primary verb is not clearly a read is refused at L0.
135
+ READ_VERBS: tuple[str, ...] = (
136
+ "get", "list", "read", "search", "find", "show", "view", "fetch", "status",
137
+ "describe", "inspect", "check", "count", "lookup", "resolve", "recall", "query",
138
+ "probe", "catalog", "help", "guidance", "checklist", "summary", "stats",
139
+ )
140
+
141
+ # role -> the maximum autonomy that role may run or grant (spec P0.0-07 / D14).
142
+ _ROLE_MAX: dict[str, str | None] = {
143
+ "none": None, "read": "L0", "update": "L1", "write": "L2", "admin": "L3",
144
+ }
145
+
146
+
147
+ def _read_hit(probe: str) -> str | None:
148
+ probe = probe.lower()
149
+ for verb in READ_VERBS:
150
+ if probe == verb or re.search(rf"(^|[-_ ]){re.escape(verb)}([-_ ]|$)", probe):
151
+ return verb
152
+ return None
153
+
154
+
155
+ def is_read_only(name: str, argv: list[str] | None = None) -> bool:
156
+ """True iff the action has no irreversible verb AND its primary verb (argv[0], else
157
+ the action name) is a known read verb. Used to gate L0 (read-only)."""
158
+ argv = list(argv or [])
159
+ if match(name, argv) is not None:
160
+ return False
161
+ primary = str(argv[0]) if argv else str(name)
162
+ return _read_hit(primary) is not None
163
+
164
+
165
+ def _in_scope(name: str, argv: list[str], scopes: set, verb: str | None) -> bool:
166
+ """L2: is this irreversible action inside the caller-provided allow-list? Matches on
167
+ the tool/agent name, ``name:action``, the action verb, or the irreversible verb."""
168
+ if not scopes:
169
+ return False
170
+ action = str(argv[0]) if argv else ""
171
+ cands = {str(name), (f"{name}:{action}" if action else str(name)), action, verb or ""}
172
+ return bool(cands & set(scopes))
173
+
174
+
175
+ def decide(name: str, argv: list[str] | None = None, *, level: str = "L1",
176
+ scopes=None) -> dict:
177
+ """Graded autonomy decision, built on ``classify()``. Returns:
178
+ {allow, needs_confirmation, level, reason, verb, blast_class}
179
+ - allow=False -> blocked outright (L0 mutation).
180
+ - allow, needs_confirmation=False -> runs directly.
181
+ - allow, needs_confirmation=True -> runs only via the human-approval path.
182
+ """
183
+ argv = list(argv or [])
184
+ cls = classify(name, argv)
185
+ lvl = level if level in _LEVEL_RANK else "L1"
186
+ rank = _LEVEL_RANK[lvl]
187
+
188
+ if rank == 0: # L0 read-only
189
+ ro = is_read_only(name, argv)
190
+ return {"allow": ro, "needs_confirmation": False, "level": "L0",
191
+ "reason": ("read-only action permitted at L0" if ro
192
+ else "L0 is read-only; this action may cause a side effect"),
193
+ "verb": cls["verb"], "blast_class": cls["blast_class"]}
194
+
195
+ if cls["reversible"]: # L1/L2/L3: reversible always runs
196
+ return {"allow": True, "needs_confirmation": False, "level": lvl,
197
+ "reason": "reversible action", "verb": None, "blast_class": None}
198
+
199
+ if rank == 1: # L1 ask
200
+ return {"allow": True, "needs_confirmation": True, "level": "L1",
201
+ "reason": f"L1: irreversible ({cls['blast_class']}) needs approval",
202
+ "verb": cls["verb"], "blast_class": cls["blast_class"]}
203
+
204
+ if rank == 2: # L2 bounded
205
+ if _in_scope(name, argv, set(scopes or []), cls["verb"]):
206
+ return {"allow": True, "needs_confirmation": False, "level": "L2",
207
+ "reason": "L2: irreversible action within authorized scope",
208
+ "verb": cls["verb"], "blast_class": cls["blast_class"]}
209
+ return {"allow": True, "needs_confirmation": True, "level": "L2",
210
+ "reason": "L2: irreversible action outside scope needs approval",
211
+ "verb": cls["verb"], "blast_class": cls["blast_class"]}
212
+
213
+ # L3 full - irreversible allowed, still classified for the record.
214
+ return {"allow": True, "needs_confirmation": False, "level": "L3",
215
+ "reason": "L3: full autonomy (irreversible action logged)",
216
+ "verb": cls["verb"], "blast_class": cls["blast_class"]}
217
+
218
+
219
+ def max_level_for_role(role: str | None) -> str | None:
220
+ """The maximum autonomy level a role may run/grant. ``None`` = no AAT access."""
221
+ return _ROLE_MAX.get(str(role or "").strip().lower())
222
+
223
+
224
+ def clamp(requested: str, role: str | None = None, ws_cap: str | None = None) -> str | None:
225
+ """Effective level = min(requested, role-max, workspace-cap). A caller may always
226
+ choose LOWER than their max. Returns ``None`` iff the role has no AAT access.
227
+ ``role``/``ws_cap`` unset = not clamped (local single-user), so default is unchanged."""
228
+ levels = [requested if requested in _LEVEL_RANK else "L1"]
229
+ if role is not None:
230
+ role_max = max_level_for_role(role)
231
+ if role_max is None:
232
+ return None
233
+ levels.append(role_max)
234
+ if ws_cap in _LEVEL_RANK:
235
+ levels.append(ws_cap)
236
+ return min(levels, key=lambda lvl: _LEVEL_RANK[lvl])
@@ -0,0 +1,141 @@
1
+ """Drive registered tools from an agent.
2
+
3
+ An agent never imports a tool's internals. It invokes the tool's entrypoint as a
4
+ subprocess and parses the single JSON object the tool prints to stdout — exactly
5
+ the JSON-in / JSON-out contract every tool already honors. This keeps agents
6
+ decoupled: a tool can be rewritten freely as long as its manifest contract holds.
7
+
8
+ Throughput note: subprocess-per-call adds ~hundreds of ms, which is irrelevant for
9
+ outreach (deliberately throttled, warmup-capped sends) and keeps the boundary clean.
10
+
11
+ Testability: `invoke` takes an optional `runner` callable so tests can fake tool
12
+ execution without spawning processes or hitting the network.
13
+ """
14
+ from __future__ import annotations
15
+
16
+ import json
17
+ import subprocess
18
+ import sys
19
+ from pathlib import Path
20
+ from typing import Any, Callable
21
+
22
+ _FRAMEWORK_ROOT = Path(__file__).resolve().parents[2]
23
+ if str(_FRAMEWORK_ROOT) not in sys.path:
24
+ sys.path.insert(0, str(_FRAMEWORK_ROOT))
25
+
26
+ from registry import get_agent, get_tool # noqa: E402
27
+
28
+ # A runner takes the argv list and returns (returncode, stdout, stderr).
29
+ Runner = Callable[[list[str]], "tuple[int, str, str]"]
30
+
31
+
32
+ class ToolError(Exception):
33
+ """A driven tool failed: it returned an {"error": {...}} envelope, produced
34
+ non-JSON output, or could not be located/spawned."""
35
+
36
+ def __init__(self, tool: str, code: str, message: str,
37
+ details: dict[str, Any] | None = None):
38
+ self.tool = tool
39
+ self.code = code
40
+ self.message = message
41
+ self.details = details or {}
42
+ super().__init__(f"{tool}: {code}: {message}")
43
+
44
+
45
+ def _subprocess_runner(timeout: int) -> Runner:
46
+ def run(cmd: list[str]) -> tuple[int, str, str]:
47
+ proc = subprocess.run(cmd, capture_output=True, text=True,
48
+ encoding="utf-8", timeout=timeout)
49
+ return proc.returncode, proc.stdout or "", proc.stderr or ""
50
+ return run
51
+
52
+
53
+ def _parse_tool_output(tool: str, stdout: str, stderr: str) -> dict[str, Any]:
54
+ """Tools emit exactly one JSON object on stdout (logs go to stderr). Parse the
55
+ last non-empty stdout line defensively, raising ToolError on anything else."""
56
+ lines = [ln for ln in stdout.splitlines() if ln.strip()]
57
+ if not lines:
58
+ raise ToolError(tool, "no_output", "tool produced no stdout",
59
+ {"stderr": stderr[-800:]})
60
+ try:
61
+ data = json.loads(lines[-1])
62
+ except ValueError:
63
+ raise ToolError(tool, "bad_output", "tool stdout was not JSON",
64
+ {"stdout": stdout[-800:], "stderr": stderr[-800:]})
65
+ if isinstance(data, dict) and "error" in data and isinstance(data["error"], dict):
66
+ err = data["error"]
67
+ raise ToolError(tool, err.get("code", "tool_error"),
68
+ err.get("message", ""), err.get("details") or {})
69
+ if not isinstance(data, dict):
70
+ raise ToolError(tool, "bad_output", "tool JSON was not an object",
71
+ {"stdout": stdout[-800:]})
72
+ return data
73
+
74
+
75
+ def invoke(tool_name: str, *args: Any, runner: Runner | None = None,
76
+ timeout: int = 120) -> dict[str, Any]:
77
+ """Run a registered tool and return its parsed JSON object.
78
+
79
+ Example: invoke("apollo", "search-people", "--keywords", "energy", "--per-page", 25)
80
+ Raises ToolError on tool-not-found, spawn failure, non-JSON output, or an
81
+ {"error": ...} envelope from the tool.
82
+ """
83
+ try:
84
+ # respect_hidden=False: a scoped surface limits what a session is offered,
85
+ # it must not break an agent's own plumbing. See registry.get_tool.
86
+ m = get_tool(tool_name, respect_hidden=False)
87
+ except KeyError:
88
+ raise ToolError(tool_name, "tool_not_found",
89
+ f"no registered tool named {tool_name!r}")
90
+ if m.path is None:
91
+ raise ToolError(tool_name, "no_path", "tool manifest has no path")
92
+ entry = m.path / m.entrypoint
93
+ if not entry.exists():
94
+ raise ToolError(tool_name, "no_entrypoint", f"entrypoint missing: {entry}")
95
+
96
+ argv = [sys.executable, str(entry), *[str(a) for a in args]]
97
+ run = runner or _subprocess_runner(timeout)
98
+ try:
99
+ rc, out, err = run(argv)
100
+ except subprocess.TimeoutExpired:
101
+ raise ToolError(tool_name, "timeout", f"tool timed out after {timeout}s")
102
+ except Exception as exc: # noqa: BLE001
103
+ raise ToolError(tool_name, "spawn_failed", str(exc))
104
+ # A tool failure still prints a JSON error envelope, so parse before trusting rc.
105
+ return _parse_tool_output(tool_name, out, err)
106
+
107
+
108
+ def invoke_agent(agent_name: str, *args: Any, runner: Runner | None = None,
109
+ timeout: int = 300) -> dict[str, Any]:
110
+ """Run a registered AGENT and return its parsed JSON object.
111
+
112
+ An agent honors the same JSON-in / JSON-out contract as a tool (action name
113
+ as the first positional arg, one JSON object on stdout, {"error": ...} on
114
+ failure), so this mirrors ``invoke`` but resolves the entrypoint via
115
+ ``get_agent``. This is what lets the headless ``orchestrator drive`` loop
116
+ drive OTHER agents (curator, email-classifier, ...) as well as tools.
117
+
118
+ Example: invoke_agent("curator", "recall", "--query", "pricing deck")
119
+ Raises ToolError (with the agent name as ``.tool``) on not-found, spawn
120
+ failure, non-JSON output, or an {"error": ...} envelope from the agent.
121
+ """
122
+ try:
123
+ m = get_agent(agent_name)
124
+ except KeyError:
125
+ raise ToolError(agent_name, "agent_not_found",
126
+ f"no registered agent named {agent_name!r}")
127
+ if m.path is None:
128
+ raise ToolError(agent_name, "no_path", "agent manifest has no path")
129
+ entry = m.path / m.entrypoint
130
+ if not entry.exists():
131
+ raise ToolError(agent_name, "no_entrypoint", f"entrypoint missing: {entry}")
132
+
133
+ argv = [sys.executable, str(entry), *[str(a) for a in args]]
134
+ run = runner or _subprocess_runner(timeout)
135
+ try:
136
+ rc, out, err = run(argv)
137
+ except subprocess.TimeoutExpired:
138
+ raise ToolError(agent_name, "timeout", f"agent timed out after {timeout}s")
139
+ except Exception as exc: # noqa: BLE001
140
+ raise ToolError(agent_name, "spawn_failed", str(exc))
141
+ return _parse_tool_output(agent_name, out, err)
@@ -0,0 +1,62 @@
1
+ # Connector Builder — build → test → improve playbook
2
+
3
+ The operating procedure for producing a working PROCESIO Custom Action with the AI Connector Builder. The agent's `next-step` and `checklist` actions are the executable form of this document.
4
+
5
+ > **Running it for real?** Read `guidance --topic troubleshooting` alongside this — it has the tool/skill inventory, the live-run realities (sync stages 504 at the proxy but keep running → poll; the clarification-questions shape; the MSYS path gotcha), and the compile failure triage (NU1301 = platform NuGet, not your code, vs NU1102 = a bad version pin you fix in the .csproj). `next-step --build-id` attaches that triage automatically on a failed compile.
6
+
7
+ ## The loop
8
+
9
+ ```
10
+ 1 scope → create-build (API docs + clear requirements)
11
+ 2 gather → gather (GATHER+CLARIFY) → read api_profile + questions
12
+ 3 clarify → answer (every question; keys are the question ids) → PLAN
13
+ 4 plan → revise-plan* then approve-plan → GENERATE (pauses)
14
+ 5 generate → review files; regenerate-file* then approve-generate
15
+ 6 validate → validate-continue / validate-autofix / validate-return-to-generate
16
+ compile → (automatic) on failure: retry --from-step 6
17
+ 7 deliver → download-artifact → connector.nupkg
18
+ 8 install → procesio customaction-upload --file connector.nupkg
19
+ 9 test → exercise it in PROCESIO (hand off to the procesio agent)
20
+ 10 improve → feed failures back (see "Where feedback goes")
21
+ 11 cleanup → procesio customaction-delete before re-uploading a new build
22
+ → recompile, re-upload, repeat 8-11 until green
23
+ ```
24
+
25
+ `*` = repeat as needed before the approve.
26
+
27
+ ## Two ways to drive stages 2-6
28
+
29
+ - **Manual (default for a first build):** call each stage yourself so you can read and steer every output. Use `next-step --build-id <ID>` after each call.
30
+ - **Automatic:** `start-build --build-id <ID>` runs the entire pipeline as one background task. Poll `get-build`. Use this only once the requirements + clarifications are trusted (it won't pause for review).
31
+
32
+ ## Stage discipline
33
+
34
+ - **Scope (1).** Requirements are the highest-leverage input. State the operations the connector must expose, the auth scheme, and the data shapes. A vague requirement produces a vague plan and a weak connector. The docs URL is scraped; if the docs are poor, paste the relevant section via `--api-docs-text`.
35
+ - **Clarify (3).** Answer *all* questions — unanswered ones fall back to defaults that may not match intent. The answer keys are the question **ids** returned by `gather` (or `get-build`).
36
+ - **Plan (4).** This is the cheapest place to fix structure (files, classes, methods, NuGet deps, input/output controls). Prefer `revise-plan` here over fixing generated code later. `set-version` is only valid at this stage.
37
+ - **Generate (5).** Review before approving. Fix a single file with `regenerate-file`; use `regenerate` for cross-file/general guidance. Approving moves you into validate→compile→fix→deliver (a background task).
38
+ - **Validate/Compile (6).** Read findings before continuing. On a compile failure, `retry --from-step 6` skips straight to compile→fix→deliver (no regeneration); use `--from-step 4` to regenerate first.
39
+ - **Deliver (7).** The artifact is a real PROCESIO Custom Action `.nupkg`. It is not "done" until it has been **installed and exercised in PROCESIO** — compiling is necessary, not sufficient.
40
+
41
+ ## Where feedback goes (improve, stage 10)
42
+
43
+ | Symptom seen in PROCESIO | Fix in the builder |
44
+ |---|---|
45
+ | Wrong inputs/outputs, missing operation | `revise-plan` (re-shape) → re-approve |
46
+ | One file's logic wrong | `regenerate-file --filename X --instructions "..."` |
47
+ | Compiles but misbehaves at runtime | `regenerate` with the PROCESIO error text as `--step-instructions` |
48
+ | Validation too weak/strong | edit `validation_rule` knowledge module |
49
+ | **Every connector makes the same mistake** | edit `prompt` / `spec_module` / `example` knowledge, then `reload-config` — this fixes generation for ALL future builds |
50
+
51
+ The knowledge edits are the deepest loop: they improve the *builder*, not just one connector. Reach for them when you see a systemic pattern (e.g. the model keeps mis-using a PROCESIO SDK decorator) — encode the correction once as a spec module or few-shot example.
52
+
53
+ ## Diagnostics
54
+
55
+ - `get-build` — current status/step_status + all JSONB state.
56
+ - `logs --success false` — the failing stage's LLM logs (model/cost/tokens, prompt via the admin prompt endpoint).
57
+ - `list-issues --build-id <ID>` / `get-issue` — recorded failure cases with code snapshots (before/after a fix).
58
+ - `build-selftest` — is the compiler service itself healthy? (trivial 2-file C#, no LLM spend.)
59
+
60
+ ## Definition of done
61
+
62
+ A connector is done when: it compiled, **installed into PROCESIO** (`customaction-list` shows it), and ran correctly inside a real PROCESIO process with expected inputs/outputs — verified per the procesio agent's build-and-test playbook. Anything short of a live PROCESIO run is "compiles", not "works".