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,175 @@
1
+ """MCP protocol mechanics shared by both surfaces: version negotiation and the 2026-07-28 era.
2
+
3
+ The two servers publish different tools for different audiences and stay independent of each
4
+ other (neither imports the other; tests/test_chat_surface.py asserts it). The protocol they
5
+ speak is a different matter. It has one correct behaviour, and keeping a copy of it in each
6
+ server is how both came to agree to any protocol version a client asked for, including ones
7
+ that do not exist. So the mechanics live here, once. Each server supplies only what is its
8
+ own: its tools, its dispatcher and its identity.
9
+
10
+ MCP's own terms for the two eras:
11
+
12
+ legacy 2025-11-25 and earlier. An `initialize` handshake fixes the version for the process.
13
+ modern 2026-07-28. No handshake: every request carries its version in `_meta`, every result
14
+ carries `resultType`, list results carry `ttlMs` and `cacheScope`, and servers MUST
15
+ implement `server/discover`.
16
+
17
+ A server that speaks both is "dual-era". Both servers are dual-era over stdio, because a
18
+ modern-only stdio server would fail every legacy client, and legacy clients have no way to
19
+ fall forward.
20
+
21
+ The HTTP transport calls ``handle(..., modern=False)``. Modern Streamable HTTP adds header
22
+ rules (`Mcp-Method`, `Mcp-Name`) that transport does not implement, so it must not advertise
23
+ the modern era. Over it, `server/discover` stays a plain method-not-found: that is the answer a
24
+ dual-era client reads as "legacy server, fall back". Never answer it with a version-gated
25
+ message instead; one public MCP server did, and the client took it as a modern reply and
26
+ stopped seeing its tools.
27
+
28
+ Pure standard library, so either server can import it without widening what it depends on.
29
+ """
30
+ from __future__ import annotations
31
+
32
+ import hashlib
33
+ import json
34
+ import sys
35
+ from typing import Callable
36
+
37
+ MODERN_VERSIONS = ("2026-07-28",)
38
+ # Newest first. A tools-only server meets every one of these: later revisions only ADD
39
+ # optional fields (annotations, title, outputSchema), which earlier clients ignore.
40
+ LEGACY_VERSIONS = ("2025-11-25", "2025-06-18", "2025-03-26", "2024-11-05")
41
+
42
+ META_VERSION = "io.modelcontextprotocol/protocolVersion"
43
+ META_SERVER_INFO = "io.modelcontextprotocol/serverInfo"
44
+ META_TOOLS_DIGEST = "com.procesio/toolsDigest"
45
+
46
+ PARSE_ERROR = -32700
47
+ METHOD_NOT_FOUND = -32601
48
+ INTERNAL_ERROR = -32603
49
+ UNSUPPORTED_PROTOCOL_VERSION = -32022
50
+
51
+ # The tool list cannot change while the process runs: it is built once at import and
52
+ # `listChanged` is false. So a long freshness hint is honest, and "public" is too, because
53
+ # the list carries no per-user data a shared intermediary should keep to itself.
54
+ LIST_TTL_MS = 3_600_000
55
+ CACHE_SCOPE = "public"
56
+
57
+
58
+ def negotiate_legacy(requested) -> str:
59
+ """The version to answer `initialize` with: the client's if we serve it, else our newest.
60
+
61
+ `initialize` always selects the legacy era, so a client asking for a modern version there
62
+ gets the newest legacy one. That is what a dual-era server is required to do, and it is
63
+ the answer that keeps a client from expecting fields this era never sends."""
64
+ return requested if requested in LEGACY_VERSIONS else LEGACY_VERSIONS[0]
65
+
66
+
67
+ def tools_digest(tools) -> str:
68
+ """sha256 over the canonical JSON of a `tools/list` tools array.
69
+
70
+ Canonical means keys sorted, no whitespace, UTF-8, non-ASCII left unescaped. A client or
71
+ gateway reproduces it from the list it actually RECEIVED and compares it with the value
72
+ published in server.json, which the MCP Registry does not let anyone change after
73
+ publication. The value a server reports about itself is a convenience for spotting which
74
+ release you are talking to, not a control: the spec says self-reported server information
75
+ must not drive security decisions."""
76
+ raw = json.dumps(tools, sort_keys=True, separators=(",", ":"), ensure_ascii=False)
77
+ return "sha256:" + hashlib.sha256(raw.encode("utf-8")).hexdigest()
78
+
79
+
80
+ def handle(req: dict, *, tools: list, call_tool: Callable[[str, dict], tuple[dict, bool]],
81
+ server_info: dict, modern: bool = True) -> dict | None:
82
+ """Dispatch one JSON-RPC request. Returns a response, or None for a notification."""
83
+ method = req.get("method") or ""
84
+ req_id = req.get("id")
85
+ is_notification = "id" not in req
86
+ params = req.get("params") if isinstance(req.get("params"), dict) else {}
87
+ meta = params.get("_meta")
88
+ requested = meta.get(META_VERSION) if isinstance(meta, dict) else None
89
+ is_modern = modern and requested is not None
90
+
91
+ def ok(result):
92
+ return {"jsonrpc": "2.0", "id": req_id, "result": result}
93
+
94
+ def err(code, message, data=None):
95
+ error = {"code": code, "message": message}
96
+ if data is not None:
97
+ error["data"] = data
98
+ return {"jsonrpc": "2.0", "id": req_id, "error": error}
99
+
100
+ def complete(result, *, cacheable=False):
101
+ """Modern results carry resultType and the server's identity; lists add cache hints."""
102
+ result = dict(result)
103
+ result["resultType"] = "complete"
104
+ result["_meta"] = {**(result.get("_meta") or {}), META_SERVER_INFO: server_info}
105
+ if cacheable:
106
+ result["ttlMs"] = LIST_TTL_MS
107
+ result["cacheScope"] = CACHE_SCOPE
108
+ return ok(result)
109
+
110
+ if method.startswith("notifications/"):
111
+ return None
112
+
113
+ if is_modern and requested not in MODERN_VERSIONS:
114
+ if is_notification:
115
+ return None
116
+ # A recognised modern error: it tells a dual-era client this server IS modern, so it
117
+ # retries with a listed version instead of falling back to `initialize`.
118
+ return err(UNSUPPORTED_PROTOCOL_VERSION, "Unsupported protocol version",
119
+ {"supported": list(MODERN_VERSIONS), "requested": requested})
120
+
121
+ if method == "server/discover":
122
+ if not modern:
123
+ return err(METHOD_NOT_FOUND, f"method not found: {method}")
124
+ return complete({"supportedVersions": list(MODERN_VERSIONS),
125
+ "capabilities": {"tools": {}},
126
+ "_meta": {META_TOOLS_DIGEST: tools_digest(tools)}}, cacheable=True)
127
+
128
+ if method == "initialize":
129
+ return ok({"protocolVersion": negotiate_legacy(params.get("protocolVersion")),
130
+ "capabilities": {"tools": {"listChanged": False}},
131
+ "serverInfo": server_info})
132
+
133
+ if method == "ping": # removed in the modern era; harmless to keep answering for legacy
134
+ return ok({})
135
+
136
+ if method == "tools/list":
137
+ return complete({"tools": tools}, cacheable=True) if is_modern else ok({"tools": tools})
138
+
139
+ if method == "tools/call":
140
+ payload, is_error = call_tool(params.get("name", ""), params.get("arguments") or {})
141
+ result = {"content": [{"type": "text", "text": json.dumps(payload, ensure_ascii=False)}],
142
+ "isError": is_error}
143
+ return complete(result) if is_modern else ok(result)
144
+
145
+ if is_notification:
146
+ return None
147
+ return err(METHOD_NOT_FOUND, f"method not found: {method}")
148
+
149
+
150
+ def serve_stdio(handle_fn: Callable[[dict], dict | None], log: Callable[[str], None]) -> None:
151
+ """Newline-delimited JSON-RPC over stdin/stdout. Never raises out of the loop."""
152
+ try:
153
+ sys.stdout.reconfigure(encoding="utf-8", newline="\n")
154
+ sys.stdin.reconfigure(encoding="utf-8")
155
+ except Exception: # noqa: BLE001 - older interpreters; best effort
156
+ pass
157
+ for line in sys.stdin:
158
+ line = line.strip()
159
+ if not line:
160
+ continue
161
+ try:
162
+ req = json.loads(line)
163
+ except ValueError:
164
+ resp = {"jsonrpc": "2.0", "id": None,
165
+ "error": {"code": PARSE_ERROR, "message": "parse error"}}
166
+ else:
167
+ try:
168
+ resp = handle_fn(req)
169
+ except Exception as e: # noqa: BLE001
170
+ log(f"handler error: {e}")
171
+ resp = {"jsonrpc": "2.0", "id": req.get("id") if isinstance(req, dict) else None,
172
+ "error": {"code": INTERNAL_ERROR, "message": f"internal error: {e}"}}
173
+ if resp is not None:
174
+ sys.stdout.write(json.dumps(resp, ensure_ascii=False) + "\n")
175
+ sys.stdout.flush()
@@ -0,0 +1,306 @@
1
+ """aat-mcp: a stdio MCP server exposing the AAT registry as a small generic surface.
2
+
3
+ Hand-rolled JSON-RPC 2.0 over newline-delimited stdio (no third-party dependency,
4
+ robust to environment quirks). A driver (opencode, or any MCP client) connects and
5
+ gets these tools (opencode shows them prefixed with the server name, e.g.
6
+ `aat_run_tool`):
7
+
8
+ capabilities - list tools/agents/skills; or one capability's full arg schema
9
+ run_tool - run a REVERSIBLE tool with structured JSON args
10
+ run_agent - run a REVERSIBLE agent
11
+ run_tool_confirmed - run a tool INCLUDING irreversible actions (human-approved)
12
+ run_agent_confirmed - run an agent INCLUDING irreversible actions (human-approved)
13
+ get_skill - fetch a skill's markdown (model-decided loading; spec 04)
14
+
15
+ Two things this fixes vs the B0 bash spike: args are JSON objects (no shell
16
+ quote-escaping) and capability schemas replace `--help` spelunking.
17
+
18
+ Safety (spec 03): the reversibility gate is CODE, evaluated before execution
19
+ (gate.py -> agents/_lib/reversibility, the same policy as `orchestrator drive` and
20
+ `deputy`). `run_tool`/`run_agent` refuse irreversible actions and return
21
+ `approval_required`, naming the `*_confirmed` path. Only the `*_confirmed` tools are
22
+ marked `ask` in opencode, so a HUMAN approves each side effect; a model cannot forge
23
+ the click and cannot bypass by picking the plain tool. Set AAT_MCP_DENY_IRREVERSIBLE
24
+ for a headless run where even confirmed actions must be refused.
25
+
26
+ Run: python webplatform/aat_mcp/server.py (opencode spawns this over stdio)
27
+ """
28
+ from __future__ import annotations
29
+
30
+ import json
31
+ import os
32
+ import sys
33
+
34
+ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
35
+ import bridge # noqa: E402 (sibling module)
36
+ import gate # noqa: E402
37
+ import protocol # noqa: E402 (shared MCP mechanics)
38
+
39
+ SERVER_INFO = {"name": "aat-mcp", "version": "0.2.0"}
40
+ DEFAULT_PROTOCOL = protocol.LEGACY_VERSIONS[0] # what `initialize` gets when it names no version
41
+
42
+ _RUN_TOOL_SCHEMA = {
43
+ "type": "object",
44
+ "properties": {
45
+ "tool": {"type": "string", "description": "registered tool name"},
46
+ "action": {"type": "string", "description": "action name (omit for a flat tool)"},
47
+ "args": {"type": "object", "description": "flag name -> value (objects/arrays pass cleanly)"},
48
+ },
49
+ "required": ["tool"],
50
+ }
51
+ _RUN_AGENT_SCHEMA = {
52
+ "type": "object",
53
+ "properties": {
54
+ "agent": {"type": "string", "description": "registered agent name"},
55
+ "action": {"type": "string", "description": "action name"},
56
+ "args": {"type": "object", "description": "flag name -> value"},
57
+ },
58
+ "required": ["agent"],
59
+ }
60
+
61
+ TOOLS = [
62
+ {
63
+ "name": "capabilities",
64
+ "description": (
65
+ "Discover AAT capabilities. No args -> a compact list of every ready "
66
+ "tool/agent/skill (name, description, primary_action). "
67
+ "search='<keywords>' -> find the right ACTION by keyword across every "
68
+ "tool/agent (add name= to search within one). name=<tool or agent> + "
69
+ "action=<action> -> that one action's full argument schema; use this "
70
+ "INSTEAD of guessing flags or running --help. name= alone returns the "
71
+ "whole schema, but for a large tool that is automatically reduced to "
72
+ "the action-name index - so prefer search= or action=. Optional kind "
73
+ "filter: tool|agent|skill."
74
+ ),
75
+ "inputSchema": {
76
+ "type": "object",
77
+ "properties": {
78
+ "kind": {"type": "string", "enum": ["tool", "agent", "skill"]},
79
+ "name": {"type": "string", "description": "tool or agent name"},
80
+ "action": {"type": "string",
81
+ "description": "one action of `name` - returns just its arg schema"},
82
+ "search": {"type": "string",
83
+ "description": "keywords to find a matching action"},
84
+ "full": {"type": "boolean",
85
+ "description": "include the longer description + example per "
86
+ "entry (default false keeps the listing small)"},
87
+ },
88
+ },
89
+ },
90
+ {
91
+ "name": "run_tool",
92
+ "description": (
93
+ "Run a registered AAT tool for a REVERSIBLE / read action. 'args' is a "
94
+ "JSON object of flag name->value (objects/arrays pass cleanly, no shell "
95
+ "escaping). Targets the PROCESIO platform API - see "
96
+ "https://docs.procesio.com. If the action is irreversible (send/delete/pay/post/...), "
97
+ "this REFUSES and returns approval_required telling you to use "
98
+ "run_tool_confirmed. Discover tools/actions via capabilities."
99
+ ),
100
+ "inputSchema": _RUN_TOOL_SCHEMA,
101
+ },
102
+ {
103
+ "name": "run_tool_confirmed",
104
+ "description": (
105
+ "Run a tool INCLUDING an irreversible action (send/delete/pay/post/"
106
+ "issue-invoice/...). Targets the PROCESIO platform API - see "
107
+ "https://docs.procesio.com. The operator is asked to approve before it runs. "
108
+ "Use this only after run_tool returned approval_required, or when you "
109
+ "know the action has a real-world side effect."
110
+ ),
111
+ "inputSchema": _RUN_TOOL_SCHEMA,
112
+ },
113
+ {
114
+ "name": "run_agent",
115
+ "description": (
116
+ "Run a registered AAT agent for a REVERSIBLE action. In an interactive "
117
+ "session, route a substantive request first with agent='orchestrator', "
118
+ "action='intake', args={'request': '<the ask>'} (per AGENTS.md). If you "
119
+ "were told you are already inside one step of an externally-managed plan, "
120
+ "do NOT route or plan - act directly; 'orchestrator drive' is refused "
121
+ "there because it would start a second orchestration loop. Irreversible "
122
+ "agent actions are refused here - use run_agent_confirmed."
123
+ ),
124
+ "inputSchema": _RUN_AGENT_SCHEMA,
125
+ },
126
+ {
127
+ "name": "run_agent_confirmed",
128
+ "description": (
129
+ "Run an agent INCLUDING an irreversible action. The operator is asked to "
130
+ "approve before it runs."
131
+ ),
132
+ "inputSchema": _RUN_AGENT_SCHEMA,
133
+ },
134
+ {
135
+ "name": "get_skill",
136
+ "description": (
137
+ "Fetch a registered skill's SKILL.md plus a metadata-only resource index. "
138
+ "To retrieve one bundled resource, pass a path from that index in the "
139
+ "optional resource field."
140
+ ),
141
+ "inputSchema": {
142
+ "type": "object",
143
+ "properties": {
144
+ "name": {"type": "string"},
145
+ "resource": {"type": "string"},
146
+ },
147
+ "required": ["name"],
148
+ },
149
+ },
150
+ ]
151
+
152
+
153
+ # Titles and hints, kept in one table so the claim each tool makes about itself can be
154
+ # audited in one place. The hints drive auto-permissions in a client: a readOnlyHint tool
155
+ # may run without asking, so a wrong one here is a write that fires unprompted.
156
+ #
157
+ # run_* are NOT read-only. They dispatch any registered action, and the reversible set
158
+ # they admit still includes creates and updates (add-credential, datastore-add-rows,
159
+ # update-*). "Reversible" answers whether a thing can be undone; "read-only" answers
160
+ # whether it changes anything, and those are different questions. Mapping one onto the
161
+ # other would mislabel roughly ninety write actions as safe to run unattended.
162
+ _ANNOTATIONS = {
163
+ "capabilities": ("Discover PROCESIO capabilities", True),
164
+ "get_skill": ("Read a PROCESIO skill", True),
165
+ "run_tool": ("Run a PROCESIO tool action", False),
166
+ "run_tool_confirmed": ("Run a PROCESIO tool action (approval required)", False),
167
+ "run_agent": ("Run a PROCESIO agent action", False),
168
+ "run_agent_confirmed": ("Run a PROCESIO agent action (approval required)", False),
169
+ }
170
+
171
+ for _t in TOOLS:
172
+ _title, _read_only = _ANNOTATIONS[_t["name"]]
173
+ _t["title"] = _title
174
+ _t["annotations"] = {
175
+ "title": _title,
176
+ "readOnlyHint": _read_only,
177
+ # A dispatcher can reach an update, which overwrites data. Only a tool that
178
+ # cannot change anything may claim otherwise.
179
+ "destructiveHint": not _read_only,
180
+ "idempotentHint": _read_only,
181
+ # Read-only calls answer from the local registry; the rest reach the platform.
182
+ "openWorldHint": not _read_only,
183
+ }
184
+
185
+
186
+ def _log(msg: str) -> None:
187
+ print(f"[aat-mcp] {msg}", file=sys.stderr, flush=True)
188
+
189
+
190
+ def _run(kind: str, arguments: dict, confirmed: bool) -> tuple[dict, bool]:
191
+ """Execute a tool/agent through the reversibility gate.
192
+
193
+ kind: 'tool' or 'agent'. confirmed: True for the *_confirmed tools (opencode has
194
+ already asked the operator). Returns (payload, is_error)."""
195
+ key = "tool" if kind == "tool" else "agent"
196
+ target = arguments.get(key)
197
+ if not target:
198
+ return {"error": f"run_{kind} requires '{key}'"}, True
199
+ action = arguments.get("action")
200
+ verdict = gate.classify(target, action)
201
+
202
+ if not confirmed and not verdict["reversible"]:
203
+ # Plain tool refuses an irreversible action and names the confirmed path.
204
+ return {"approval_required": {
205
+ key: target, "action": action, "verb": verdict["verb"],
206
+ "blast_class": verdict["blast_class"], "reason": verdict["reason"],
207
+ "next": (f"This action is irreversible ({verdict['blast_class']}). To "
208
+ f"proceed, call run_{kind}_confirmed with the same arguments - "
209
+ f"the operator will be asked to approve it."),
210
+ }}, False
211
+
212
+ if confirmed and not verdict["reversible"] and gate.deny_irreversible_env():
213
+ # Headless fail-safe: no human in the seat to approve.
214
+ return {"refused": ("irreversible action denied (AAT_MCP_DENY_IRREVERSIBLE "
215
+ "is set; no human in the seat)"),
216
+ "verb": verdict["verb"], "blast_class": verdict["blast_class"]}, True
217
+
218
+ runner = bridge.run_tool if kind == "tool" else bridge.run_agent
219
+ res = runner(target, action, arguments.get("args"))
220
+ if not res.get("ok", False):
221
+ # Recovery hint so the driver re-discovers instead of guessing again, falling
222
+ # back to bash, or claiming it lacks access (observed with weaker models on a
223
+ # bad action/args or a transient tool error).
224
+ res = dict(res)
225
+ res["hint"] = (f"This {kind} call failed - it does NOT mean you lack access. "
226
+ f"Call capabilities with name='{target}' and action='{action}' "
227
+ f"(or search='<keywords>') to see the valid args, then retry "
228
+ f"run_{kind}. Do NOT fall back to bash.")
229
+ schema = _usage_help(kind, target, action, res)
230
+ if schema:
231
+ res["schema"] = schema
232
+ return res, True
233
+ return res, False
234
+
235
+
236
+ # A usage failure is a naming failure: a flag spelled `workspace_id` instead of
237
+ # `workspace-id`, an invented action, or a required arg the caller probed for by
238
+ # calling the action empty. The framework already knows the right answer at this
239
+ # exact moment - it just never said it, so the model guessed again (measured: the
240
+ # same action retried with four different arg spellings). Answering here fixes it
241
+ # for every tool at once, with no per-tool change.
242
+ _USAGE_MARKERS = ("unknown action", "unrecognized arguments",
243
+ "arguments are required", "invalid choice")
244
+
245
+
246
+ def _usage_help(kind: str, target: str, action: str | None, res: dict) -> dict | None:
247
+ """Attach the valid action/arg names when a call failed on USAGE, not on the
248
+ remote system. Never raises - enrichment must not turn into a second error."""
249
+ err = res.get("error") or {}
250
+ message = str(err.get("message") or "")
251
+ if not any(marker in message for marker in _USAGE_MARKERS):
252
+ return None
253
+ try:
254
+ return bridge.action_help(target, action, kind)
255
+ except Exception: # noqa: BLE001 - best effort; the original error still stands
256
+ return None
257
+
258
+
259
+ def _call_tool(name: str, arguments: dict) -> tuple[dict, bool]:
260
+ """Return (result_payload, is_error). Never raises: failures come back as a
261
+ structured payload the model can read."""
262
+ try:
263
+ if name == "capabilities":
264
+ return bridge.capabilities(arguments.get("kind"), arguments.get("name"),
265
+ arguments.get("action"),
266
+ arguments.get("search"),
267
+ bool(arguments.get("full", False))), False
268
+ if name == "run_tool":
269
+ return _run("tool", arguments, confirmed=False)
270
+ if name == "run_tool_confirmed":
271
+ return _run("tool", arguments, confirmed=True)
272
+ if name == "run_agent":
273
+ return _run("agent", arguments, confirmed=False)
274
+ if name == "run_agent_confirmed":
275
+ return _run("agent", arguments, confirmed=True)
276
+ if name == "get_skill":
277
+ if not arguments.get("name"):
278
+ return {"error": "get_skill requires 'name'"}, True
279
+ if "resource" in arguments:
280
+ return bridge.get_skill_resource(arguments["name"], arguments["resource"]), False
281
+ return bridge.get_skill(arguments["name"]), False
282
+ return {"error": f"unknown tool: {name}"}, True
283
+ except KeyError as e:
284
+ return {"error": str(e)}, True
285
+ except Exception as e: # noqa: BLE001 - surface as a readable tool error
286
+ return {"error": f"{type(e).__name__}: {e}"}, True
287
+
288
+
289
+ def handle(req: dict, *, modern: bool = True) -> dict | None:
290
+ """Dispatch one JSON-RPC request. Returns a response dict, or None for a
291
+ notification (no response).
292
+
293
+ The protocol mechanics - version negotiation and the 2026-07-28 era - live in
294
+ protocol.py, shared with the chat surface; this server supplies only its tools and its
295
+ dispatcher. ``modern=False`` is for the HTTP transport, which serves the legacy era only."""
296
+ return protocol.handle(req, tools=TOOLS, call_tool=_call_tool,
297
+ server_info=SERVER_INFO, modern=modern)
298
+
299
+
300
+ def main() -> None:
301
+ _log("started (stdio). Waiting for JSON-RPC on stdin.")
302
+ protocol.serve_stdio(handle, _log)
303
+
304
+
305
+ if __name__ == "__main__":
306
+ main()
@@ -0,0 +1,8 @@
1
+ import sys
2
+ from pathlib import Path
3
+
4
+ # Make the aat_mcp package modules (bridge, server) importable under pytest's
5
+ # importlib mode without turning aat_mcp into an installed package.
6
+ _AAT_MCP = Path(__file__).resolve().parents[1]
7
+ if str(_AAT_MCP) not in sys.path:
8
+ sys.path.insert(0, str(_AAT_MCP))