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,385 @@
1
+ // Core SPA: load inventory, render capability cards, drive live validation.
2
+ // Setup/test interactions live in actions.js (attached to window.Actions).
3
+ (function () {
4
+ const state = { inv: null, tab: "tools", filter: "", onlyNeedsSetup: false, val: {} };
5
+ const $ = (s, r = document) => r.querySelector(s);
6
+ const content = $("#content");
7
+
8
+ // ---- tiny DOM builder --------------------------------------------------
9
+ function el(tag, attrs, ...kids) {
10
+ const n = document.createElement(tag);
11
+ if (attrs) for (const [k, v] of Object.entries(attrs)) {
12
+ if (k === "class") n.className = v;
13
+ else if (k === "html") n.innerHTML = v;
14
+ else if (k.startsWith("data-")) n.setAttribute(k, v);
15
+ else if (k === "onclick") n.addEventListener("click", v);
16
+ else if (v !== null && v !== undefined) n.setAttribute(k, v);
17
+ }
18
+ for (const kid of kids.flat()) {
19
+ if (kid == null || kid === false) continue;
20
+ n.appendChild(typeof kid === "string" ? document.createTextNode(kid) : kid);
21
+ }
22
+ return n;
23
+ }
24
+
25
+ function toast(msg, kind) {
26
+ const t = el("div", { class: "toast " + (kind || "") }, msg);
27
+ $("#toasts").appendChild(t);
28
+ setTimeout(() => t.remove(), 5000);
29
+ }
30
+
31
+ function valKey(item) { return item.kind + ":" + item.name; }
32
+
33
+ // ---- setup action bridge ----------------------------------------------
34
+ function act(name, data) {
35
+ if (window.Actions && typeof window.Actions[name] === "function") {
36
+ window.Actions[name](data, { state, refresh, rerender, toast, el, validateOne });
37
+ } else {
38
+ toast("action unavailable: " + name, "bad");
39
+ }
40
+ }
41
+
42
+ // Shown when the API returns 401 - the tab has no valid token (opened the base
43
+ // URL, a new tab, or the server restarted with a new token). Let the user paste it.
44
+ function renderTokenGate() {
45
+ const inp = el("input", { type: "text", placeholder: "paste the access token from your terminal" });
46
+ const connect = () => {
47
+ const v = inp.value.trim();
48
+ if (!v) { toast("paste the token first", "bad"); return; }
49
+ API.setToken(v); refresh();
50
+ };
51
+ const btn = el("button", { class: "btn", onclick: connect }, "Connect");
52
+ inp.addEventListener("keydown", (e) => { if (e.key === "Enter") connect(); });
53
+ content.innerHTML = "";
54
+ content.appendChild(el("div", { class: "banner" },
55
+ el("h3", null, "Enter your access token"),
56
+ el("p", { class: "sub" }, "This dashboard is protected by a one-time token. Open the URL that "
57
+ + "'python dashboard/serve.py' printed in your terminal, or copy just the token and paste it here:"),
58
+ el("div", { class: "rowflex" }, inp, btn)));
59
+ setTimeout(() => inp.focus(), 30);
60
+ }
61
+
62
+ // ---- data --------------------------------------------------------------
63
+ async function refresh() {
64
+ content.innerHTML = '<div class="loading">Loading inventory...</div>';
65
+ try {
66
+ state.inv = await API.get("/api/inventory");
67
+ } catch (e) {
68
+ content.innerHTML = "";
69
+ if (e.status === 401) return renderTokenGate();
70
+ content.appendChild(el("div", { class: "banner" },
71
+ el("h3", null, "Cannot reach the dashboard API"),
72
+ el("p", { class: "sub" }, String(e.message || e))));
73
+ return;
74
+ }
75
+ renderSummary();
76
+ renderBanner();
77
+ rerender();
78
+ validateAll();
79
+ }
80
+
81
+ // ---- summary + fresh-start banner -------------------------------------
82
+ function renderSummary() {
83
+ const s = state.inv.summary;
84
+ const u = state.inv.userdata || {};
85
+ $("#basePath").textContent = (u.base || "") + (u.overridden ? " (AAT_USERDATA_DIR)" : "");
86
+ const box = $("#summary"); box.innerHTML = "";
87
+ const tile = (n, l, sub, cls) => el("div", { class: "stat" },
88
+ el("div", { class: "n " + (cls || "") }, String(n)),
89
+ el("div", { class: "l" }, l),
90
+ sub ? el("div", { class: "sub2 meta" }, sub) : null);
91
+ box.appendChild(tile(s.tools.ready + "/" + s.tools.total, "Tools ready to use",
92
+ s.tools.needs_setup + " need setup" + (s.tools.errored ? ", " + s.tools.errored + " errored" : "")));
93
+ box.appendChild(tile(s.agents.ready + "/" + s.agents.total, "Agents ready to use",
94
+ s.agents.needs_setup + " need setup"));
95
+ box.appendChild(tile(s.skills.total, "Skills", "no setup needed"));
96
+ box.appendChild(tile(s.llm_ready ? "yes" : "no", "AI model connected",
97
+ s.llm_ready ? "tests + copilot enabled" : "connect one to enable tests",
98
+ s.llm_ready ? "" : "warn"));
99
+ const st = state.inv.store || {};
100
+ box.appendChild(tile(st.records != null ? st.records : "-", "Things it remembers",
101
+ (st.runs != null ? st.runs + " past runs" : "")));
102
+ }
103
+
104
+ function renderBanner() {
105
+ const b = $("#freshBanner");
106
+ if (!state.inv.fresh_start) { b.classList.add("hidden"); return; }
107
+ b.classList.remove("hidden"); b.innerHTML = "";
108
+ const ob = state.inv.onboarding || {};
109
+ b.appendChild(el("h3", null, "Fresh install - let's get you set up"));
110
+ b.appendChild(el("p", { class: "sub" }, ob.message || ""));
111
+ const ol = el("ol");
112
+ (ob.steps || []).forEach(s => ol.appendChild(el("li", null, s)));
113
+ b.appendChild(ol);
114
+ b.appendChild(el("button", { class: "btn", onclick: () => act("bootstrap", { withTemplates: true }) },
115
+ "Initialize (copy config templates)"));
116
+ }
117
+
118
+ // ---- tab render --------------------------------------------------------
119
+ function matches(item) {
120
+ if (state.onlyNeedsSetup && !item.needs_setup && !item.error) return false;
121
+ if (!state.filter) return true;
122
+ const f = state.filter.toLowerCase();
123
+ return (item.name || "").toLowerCase().includes(f) ||
124
+ (item.description || "").toLowerCase().includes(f);
125
+ }
126
+
127
+ function rerender() {
128
+ content.innerHTML = "";
129
+ const t = state.tab;
130
+ if (t === "providers") return renderProviders();
131
+ if (t === "context") return renderContext();
132
+ const list = (state.inv[t] || []).filter(matches);
133
+ if (!list.length) {
134
+ const msg = state.onlyNeedsSetup ? "Nothing needs setup here - all good." : "Nothing matches.";
135
+ content.appendChild(el("div", { class: "loading" }, msg));
136
+ return;
137
+ }
138
+ const grid = el("div", { class: "grid" });
139
+ const render = t === "tools" ? renderTool : t === "agents" ? renderAgent : renderSkill;
140
+ list.forEach(i => grid.appendChild(render(i)));
141
+ content.appendChild(grid);
142
+ }
143
+
144
+ function readinessDot(item) {
145
+ if (item.error) return el("span", { class: "dot red", title: item.error });
146
+ if (item.needs_setup) return el("span", { class: "dot amber", title: "needs setup" });
147
+ return el("span", { class: "dot green", title: "ready to use" });
148
+ }
149
+
150
+ // The one plain-language status a newcomer reads first.
151
+ function setupLabel(item) {
152
+ if (item.error) return { t: "Not working (failed to load)", c: "bad" };
153
+ if (item.kind === "agent" && item.needs_setup && !(item.missing_secrets || []).length)
154
+ return { t: "A tool it uses needs setup", c: "warn" };
155
+ if (item.needs_setup) {
156
+ if (item.web_session_status && !item.web_session_status.present)
157
+ return { t: "Needs a browser login", c: "warn" };
158
+ if ((item.actions || []).some(a => a.name === "auth-login"))
159
+ return { t: "Needs Google/LinkedIn sign-in", c: "warn" };
160
+ return { t: "Needs a credential", c: "warn" };
161
+ }
162
+ return { t: "Ready to use", c: "ok" };
163
+ }
164
+ function statusPill(item) {
165
+ const s = setupLabel(item);
166
+ return el("div", { class: "setup " + s.c }, s.t);
167
+ }
168
+
169
+ function head(item) {
170
+ return el("div", { class: "card-head" },
171
+ el("div", { class: "card-title" }, readinessDot(item),
172
+ el("span", { class: "name" }, item.name)),
173
+ el("span", { class: "badge" }, item.kind));
174
+ }
175
+ function desc(item) {
176
+ return el("p", { class: "card-desc clamp", title: item.description || "" },
177
+ item.description || "");
178
+ }
179
+
180
+ function valSlot(item) {
181
+ const v = state.val[valKey(item)];
182
+ const wrap = el("div", { class: "row", "data-valslot": valKey(item) });
183
+ wrap.appendChild(el("div", { class: "k" }, "live check"));
184
+ wrap.appendChild(valPill(v, item));
185
+ return wrap;
186
+ }
187
+ function valPill(v, item) {
188
+ const rc = el("div", { class: "v" });
189
+ if (!v) rc.appendChild(el("span", { class: "pill unknown" }, "not checked"));
190
+ else if (v.status === "checking") rc.appendChild(el("span", { class: "pill warn" },
191
+ el("span", { class: "dot amber pulse" }), " checking..."));
192
+ else if (v.status === "connected") rc.appendChild(el("span", { class: "pill ok" }, "connected"));
193
+ else if (v.status === "invalid") rc.appendChild(el("span", { class: "pill bad", title: v.detail || "" }, "not working"));
194
+ else rc.appendChild(el("span", { class: "pill unknown", title: v.detail || "" }, "-"));
195
+ if (item.probe) rc.appendChild(el("button",
196
+ { class: "btn ghost sm", onclick: () => validateOne(item) }, "re-check"));
197
+ if (v && v.status === "invalid")
198
+ rc.appendChild(el("button", { class: "btn ghost sm", title: "Ask the AI why this is failing",
199
+ onclick: () => act("explainProbe", { kind: item.kind, name: item.name }) }, "Explain"));
200
+ return rc;
201
+ }
202
+
203
+ function secretRows(item) {
204
+ if (!item.secrets_status || !item.secrets_status.length) return null;
205
+ const rows = el("div", { class: "rows" });
206
+ item.secrets_status.forEach(s => {
207
+ const present = s.present;
208
+ rows.appendChild(el("div", { class: "row" },
209
+ el("div", { class: "k", title: s.description }, s.name),
210
+ el("div", { class: "v" },
211
+ el("span", { class: "pill " + (present ? "ok" : "bad") }, present ? "present" : "missing"),
212
+ el("button", { class: "btn ghost sm", onclick: () => act("setCred", { tool: item.name, secret: s.name, hasNs: s.name.includes(":") }) },
213
+ present ? "update" : "Add"),
214
+ present ? el("button", { class: "btn danger sm", title: "Delete this credential from Windows Credential Manager", onclick: () => act("delCred", { tool: item.name, secret: s.name }) }, "Delete") : null)));
215
+ });
216
+ return rows;
217
+ }
218
+
219
+ // A tool that logs in via a saved browser session (no API key).
220
+ function webSessionRow(item) {
221
+ const ws = item.web_session_status;
222
+ if (!ws) return null;
223
+ return el("div", { class: "rows" }, el("div", { class: "row" },
224
+ el("div", { class: "k", title: "browser login captured via the web tool" },
225
+ "web login: " + ws.name),
226
+ el("div", { class: "v" },
227
+ el("span", { class: "pill " + (ws.present ? "ok" : "bad") },
228
+ ws.present ? "connected" : "not connected"),
229
+ el("button", { class: "btn ghost sm", onclick: () => act("webConnect", ws) },
230
+ ws.present ? "reconnect" : "Connect"))));
231
+ }
232
+
233
+ function renderTool(item) {
234
+ if (item.error) return el("div", { class: "card err" }, head(item),
235
+ statusPill(item), el("p", { class: "errmsg" }, item.error));
236
+ const hasOauth = (item.actions || []).some(a => a.name === "auth-login");
237
+ const isGoogle = (item.secrets || []).some(s => (s.name || "").startsWith("google:"));
238
+ const kids = [head(item), statusPill(item), desc(item),
239
+ secretRows(item), webSessionRow(item)];
240
+ if (item.probe) kids.push(valSlot(item)); // only show a live check when there is one
241
+ const foot = [el("span", { class: "meta" }, (item.actions ? item.actions.length + " actions" : "flat tool"))];
242
+ if (hasOauth && isGoogle) foot.push(el("button", { class: "btn", title: "Manage the Google accounts (profiles) this login can use", onclick: () => act("googleAccounts", { tool: item.name }) }, "Manage accounts"));
243
+ else if (hasOauth) foot.push(el("button", { class: "btn", title: "Sign in (OAuth)", onclick: () => act("oauthLogin", { tool: item.name }) }, "Connect"));
244
+ if (item.name === "procesio") foot.push(el("button", { class: "btn", title: "Manage PROCESIO environments (switch/add) and credentials per environment", onclick: () => act("procesioEnvironments", { tool: item.name }) }, "Environments"));
245
+ foot.push(el("button", { class: "btn ghost sm", onclick: () => act("details", { kind: "tool", name: item.name }) }, "Details"));
246
+ kids.push(el("div", { class: "card-foot" }, ...foot));
247
+ return el("div", { class: "card" }, ...kids);
248
+ }
249
+
250
+ function renderAgent(item) {
251
+ if (item.error) return el("div", { class: "card err" }, head(item),
252
+ statusPill(item), el("p", { class: "errmsg" }, item.error));
253
+ const kids = [head(item), statusPill(item), desc(item), secretRows(item)];
254
+ if (item.probe) kids.push(valSlot(item));
255
+ const ts = item.tool_status || {};
256
+ if (Object.keys(ts).length) {
257
+ const rows = el("div", { class: "rows" });
258
+ Object.entries(ts).forEach(([tn, st]) => rows.appendChild(el("div", { class: "row" },
259
+ el("div", { class: "k" }, "uses: " + tn),
260
+ el("div", { class: "v" }, el("span", { class: "pill " + (st.ready ? "ok" : st.present ? "bad" : "warn") },
261
+ st.ready ? "ready" : st.present ? "needs setup" : "not found")))));
262
+ kids.push(el("div", { class: "section-title" }, el("h2", null, "tools it uses"), el("span", { class: "line" })));
263
+ kids.push(rows);
264
+ }
265
+ kids.push(el("div", { class: "card-foot" },
266
+ el("button", { class: "btn ghost sm", onclick: () => act("details", { kind: "agent", name: item.name }) }, "Details")));
267
+ return el("div", { class: "card" }, ...kids);
268
+ }
269
+
270
+ function renderSkill(item) {
271
+ return el("div", { class: "card" }, head(item),
272
+ el("div", { class: "setup ok" }, "Always available"),
273
+ desc(item),
274
+ item.warning ? el("p", { class: "errmsg" }, item.warning) : null);
275
+ }
276
+
277
+ function renderProviders() {
278
+ const p = state.inv.providers || {};
279
+ const wrap = el("div");
280
+ wrap.appendChild(el("p", { class: "card-desc" },
281
+ "Connect an AI model here (OpenAI, Azure, a local model, or Anthropic). It powers the Test buttons, the context summary, and the copilot. This is the only place the dashboard itself uses AI - and it works with any provider."));
282
+ wrap.appendChild(el("div", { class: "card-foot" },
283
+ el("button", { class: "btn", onclick: () => act("editConfig", { component: "llm", name: "providers" }) },
284
+ "Edit providers"),
285
+ el("span", { class: "meta" }, "default: " + (p.default || "none"))));
286
+ if (p.error) wrap.appendChild(el("div", { class: "banner" },
287
+ el("h3", null, "No AI model connected yet"),
288
+ el("p", { class: "sub" }, "Edit providers, then add a key below to enable the Test buttons, context summary, and copilot.")));
289
+ const grid = el("div", { class: "grid" });
290
+ (p.providers || []).forEach(pr => grid.appendChild(el("div", { class: "card" },
291
+ el("div", { class: "card-head" },
292
+ el("div", { class: "card-title" },
293
+ el("span", { class: "dot " + (pr.key_present ? "green" : "amber") }),
294
+ el("span", { class: "name" }, pr.name)),
295
+ pr.is_default ? el("span", { class: "badge" }, "default") : null),
296
+ el("div", { class: "setup " + (pr.key_present ? "ok" : "warn") },
297
+ pr.key_present ? "Ready" : "Needs an API key"),
298
+ el("p", { class: "card-desc" }, (pr.adapter || "") + " - " + (pr.model || "")),
299
+ el("div", { class: "rows" }, el("div", { class: "row" },
300
+ el("div", { class: "k" }, "api key"),
301
+ el("div", { class: "v" },
302
+ el("span", { class: "pill " + (pr.key_present ? "ok" : "bad") }, pr.key_present ? "present" : "missing"),
303
+ el("button", { class: "btn ghost sm", onclick: () => act("setCred", { tool: "llm", secret: pr.name }) },
304
+ pr.key_present ? "update" : "Add")))),
305
+ el("div", { class: "card-foot" },
306
+ el("button", { class: "btn ghost sm", onclick: () => act("testProvider", { provider: pr.name }) }, "Test connection")))));
307
+ wrap.appendChild(grid);
308
+ content.appendChild(wrap);
309
+ }
310
+
311
+ function renderContext() {
312
+ const st = state.inv.store || {};
313
+ const u = state.inv.userdata || {};
314
+ const wrap = el("div");
315
+ wrap.appendChild(el("p", { class: "card-desc" },
316
+ "This is the memory your assistant builds up over time - facts, preferences, and past work. It lives on this machine only and is safe to wipe."));
317
+ wrap.appendChild(el("div", { class: "card" },
318
+ el("div", { class: "card-title" }, "Memory store"),
319
+ el("p", { class: "card-desc" }, u.base || ""),
320
+ el("div", { class: "rows" },
321
+ row2("things remembered", st.records != null ? st.records : "-"),
322
+ row2("past runs", st.runs != null ? st.runs : "-"),
323
+ row2("runs still open", st.open_runs != null ? st.open_runs : "-"),
324
+ row2("storage created", String(!!(u.scan && u.scan.store_db_exists))),
325
+ row2("config files", u.scan ? u.scan.config_files : "-")),
326
+ el("div", { class: "card-foot" },
327
+ el("button", { class: "btn ghost sm", onclick: () => act("inspectContext", {}) }, "Summarize with AI"))));
328
+ content.appendChild(wrap);
329
+ }
330
+ function row2(k, v) {
331
+ return el("div", { class: "row" }, el("div", { class: "k" }, k),
332
+ el("div", { class: "v" }, el("span", { class: "meta" }, String(v))));
333
+ }
334
+
335
+ // ---- live validation ---------------------------------------------------
336
+ function setVal(key, status, detail) {
337
+ state.val[key] = { status, detail };
338
+ const slot = document.querySelector('[data-valslot="' + CSS.escape(key) + '"]');
339
+ if (slot) {
340
+ const item = findItem(key);
341
+ slot.replaceChildren(el("div", { class: "k" }, "live check"), valPill(state.val[key], item));
342
+ }
343
+ }
344
+ function findItem(key) {
345
+ const [kind] = key.split(":");
346
+ const bucket = kind === "tool" ? "tools" : kind === "agent" ? "agents" : "skills";
347
+ return (state.inv[bucket] || []).find(i => valKey(i) === key) || { probe: null };
348
+ }
349
+
350
+ function validateAll() {
351
+ if (state.stream) { try { state.stream.close(); } catch (_) {} }
352
+ ["tools", "agents"].forEach(b => (state.inv[b] || []).forEach(i => {
353
+ if (i.probe) setVal(valKey(i), "checking");
354
+ }));
355
+ state.stream = API.stream("/api/validate/all", {
356
+ result: (d) => setVal(d.kind + ":" + d.name, d.status, d.detail),
357
+ done: (_d, es) => es.close(), // stop EventSource auto-reconnect
358
+ error: (d) => toast("validation stream error: " + (d.message || ""), "bad"),
359
+ });
360
+ }
361
+
362
+ async function validateOne(item) {
363
+ setVal(valKey(item), "checking");
364
+ try {
365
+ const d = await API.post("/api/validate/one", { kind: item.kind, name: item.name });
366
+ setVal(item.kind + ":" + item.name, d.status, d.detail);
367
+ } catch (e) { setVal(valKey(item), "invalid", String(e.message || e)); }
368
+ }
369
+
370
+ // ---- wiring ------------------------------------------------------------
371
+ $("#tabs").addEventListener("click", (e) => {
372
+ const b = e.target.closest(".tab"); if (!b) return;
373
+ document.querySelectorAll(".tab").forEach(t => t.classList.remove("active"));
374
+ b.classList.add("active"); state.tab = b.dataset.tab;
375
+ $("#toolbar").style.display = (state.tab === "context") ? "none" : "flex";
376
+ rerender();
377
+ });
378
+ $("#filterInput").addEventListener("input", (e) => { state.filter = e.target.value; rerender(); });
379
+ $("#onlyNeedsSetup").addEventListener("change", (e) => { state.onlyNeedsSetup = e.target.checked; rerender(); });
380
+ $("#reloadBtn").addEventListener("click", refresh);
381
+ $("#recheckBtn").addEventListener("click", validateAll);
382
+
383
+ window.App = { state, el, toast, refresh, rerender, validateOne };
384
+ refresh();
385
+ })();
@@ -0,0 +1,72 @@
1
+ // Setup copilot chat. Sends the user's question + current state to /api/copilot
2
+ // (which routes through the provider-agnostic llm tool) and renders the reply
3
+ // plus one-click suggestion buttons that map to the same setup actions.
4
+ (function () {
5
+ const App = window.App;
6
+ const el = App.el;
7
+
8
+ const MAP = {
9
+ set_credential: (s) => window.Actions.setCred(s.data || {}),
10
+ edit_config: (s) => window.Actions.editConfig(s.data || {}),
11
+ test_tool: (s) => window.Actions.testTool(s.data || {}),
12
+ test_agent: (s) => window.Actions.testAgent(s.data || {}),
13
+ oauth_login: (s) => window.Actions.oauthLogin(s.data || {}),
14
+ web_login: () => window.Actions.webLogin(),
15
+ bootstrap: () => window.Actions.bootstrap({ withTemplates: true }),
16
+ };
17
+
18
+ function open() {
19
+ const log = el("div", { class: "copilot-log" });
20
+ const inp = el("input", { placeholder: "Ask how to set something up..." });
21
+ const send = el("button", { class: "btn" }, "Send");
22
+
23
+ function addMsg(who, text) {
24
+ log.appendChild(el("div", { class: "cmsg " + who }, text));
25
+ log.scrollTop = log.scrollHeight;
26
+ }
27
+ async function submit() {
28
+ const q = inp.value.trim();
29
+ if (!q) return;
30
+ inp.value = "";
31
+ addMsg("user", q);
32
+ const thinking = el("div", { class: "cmsg bot" }, "thinking...");
33
+ log.appendChild(thinking);
34
+ log.scrollTop = log.scrollHeight;
35
+ try {
36
+ const r = await API.post("/api/copilot", { message: q });
37
+ thinking.remove();
38
+ addMsg("bot", r.reply || "(no reply)");
39
+ (r.suggestions || []).forEach((s) => {
40
+ const b = el("button", { class: "btn ghost sm" }, s.label || s.action);
41
+ b.addEventListener("click", () => {
42
+ const fn = MAP[s.action];
43
+ if (fn) fn(s); else App.toast("unknown suggestion: " + s.action, "bad");
44
+ });
45
+ log.appendChild(el("div", { class: "csugg" }, b));
46
+ });
47
+ log.scrollTop = log.scrollHeight;
48
+ } catch (e) {
49
+ thinking.remove();
50
+ addMsg("bot", "error: " + e.message);
51
+ }
52
+ }
53
+ send.addEventListener("click", submit);
54
+ inp.addEventListener("keydown", (e) => { if (e.key === "Enter") submit(); });
55
+
56
+ const root = document.getElementById("modalRoot");
57
+ root.innerHTML = "";
58
+ const box = el("div", { class: "modal" },
59
+ el("h3", null, "Setup copilot"),
60
+ el("p", { class: "hint" }, "Uses your configured LLM provider. Suggestions are one-click."),
61
+ log,
62
+ el("div", { class: "field" }, el("div", { class: "rowflex" }, inp, send)));
63
+ const bg = el("div", { class: "modal-bg" }, box);
64
+ bg.addEventListener("click", (e) => { if (e.target === bg) root.innerHTML = ""; });
65
+ root.appendChild(bg);
66
+ addMsg("bot", "Ask me what to set up. I can see what is ready and what is missing on this machine.");
67
+ setTimeout(() => inp.focus(), 30);
68
+ }
69
+
70
+ const btn = document.getElementById("copilotBtn");
71
+ if (btn) btn.addEventListener("click", open);
72
+ })();
@@ -0,0 +1,121 @@
1
+ // Google multi-account (profile) manager. Lists connected Google profiles and
2
+ // lets you add, re-connect, or remove one. All operations run through google-mail
3
+ // (the shared account surface); tokens are shared by every Google tool.
4
+ (function () {
5
+ const App = window.App;
6
+ const el = App.el;
7
+ const toast = App.toast;
8
+ const LABEL_RE = /^[a-z0-9._-]+$/;
9
+
10
+ function closeModal() { document.getElementById("modalRoot").innerHTML = ""; }
11
+ function shell(title, hint, body, foot) {
12
+ const root = document.getElementById("modalRoot");
13
+ root.innerHTML = "";
14
+ const box = el("div", { class: "modal" },
15
+ el("h3", null, title),
16
+ hint ? el("p", { class: "hint" }, hint) : null,
17
+ body,
18
+ el("div", { class: "modal-foot" }, ...foot));
19
+ const bg = el("div", { class: "modal-bg" }, box);
20
+ bg.addEventListener("click", (e) => { if (e.target === bg) closeModal(); });
21
+ root.appendChild(bg);
22
+ return box;
23
+ }
24
+
25
+ async function open() {
26
+ const body = el("div");
27
+ shell("Google accounts",
28
+ "One login can hold several Google accounts, each under a short label (e.g. 'default', 'personal'). Every Google tool shares these.",
29
+ body, [el("button", { class: "btn ghost", onclick: closeModal }, "Close")]);
30
+ await renderList(body);
31
+ }
32
+
33
+ async function renderList(body) {
34
+ body.innerHTML = "";
35
+ body.appendChild(el("div", { class: "meta" }, "loading accounts..."));
36
+ let data;
37
+ try { data = await API.get("/api/google/accounts"); }
38
+ catch (e) { body.innerHTML = ""; body.appendChild(el("div", { class: "errmsg" }, String(e.message || e))); return; }
39
+ body.innerHTML = "";
40
+
41
+ if (!data.ok) {
42
+ if (!data.has_client) {
43
+ body.appendChild(el("div", { class: "banner" },
44
+ el("h3", null, "Add the Google OAuth client first"),
45
+ el("p", { class: "sub" }, "Store the Google Cloud desktop-client JSON as the google:oauth-client credential (the client-key row on any Google tool's card). Then you can add accounts here.")));
46
+ } else {
47
+ body.appendChild(el("div", { class: "errmsg" },
48
+ "Could not list accounts: " + ((data.error && data.error.message) || "unknown")));
49
+ }
50
+ return;
51
+ }
52
+
53
+ const rows = el("div", { class: "rows" });
54
+ (data.accounts || []).forEach(a => {
55
+ const emailSpan = el("span", { class: "meta", style: "margin-left:8px" },
56
+ a.has_token ? "resolving email..." : "");
57
+ rows.appendChild(el("div", { class: "row" },
58
+ el("div", { class: "k" },
59
+ el("span", { class: "dot " + (a.has_token ? "green" : "amber") }),
60
+ " " + a.account + (a.active ? " (active)" : ""),
61
+ emailSpan),
62
+ el("div", { class: "v" },
63
+ el("button", { class: "btn ghost sm", onclick: () => doLogin(body, a.account) }, "Re-connect"),
64
+ el("button", { class: "btn danger sm", onclick: () => doRemove(body, a.account) }, "Remove"))));
65
+ // Fill the email in lazily so the list is instant.
66
+ if (a.has_token) {
67
+ API.get("/api/google/email?account=" + encodeURIComponent(a.account))
68
+ .then(r => { emailSpan.textContent = r.email ? " " + r.email : ""; })
69
+ .catch(() => { emailSpan.textContent = ""; });
70
+ }
71
+ });
72
+ body.appendChild(rows);
73
+
74
+ // Add-account row
75
+ const labelIn = el("input", { placeholder: "new label, e.g. work (not an email)" });
76
+ const addBtn = el("button", { class: "btn" }, "Add account");
77
+ addBtn.addEventListener("click", () => {
78
+ const label = (labelIn.value || "").trim().toLowerCase();
79
+ if (!LABEL_RE.test(label)) { toast("use a short label like 'work' - lowercase, no @", "bad"); return; }
80
+ if ((data.accounts || []).some(a => a.account === label)) { toast("that label already exists - use Re-connect", "bad"); return; }
81
+ doLogin(body, label);
82
+ });
83
+ body.appendChild(el("div", { class: "field", style: "margin-top:12px" },
84
+ el("label", null, "Add another Google account"),
85
+ el("div", { class: "rowflex" }, labelIn, addBtn)));
86
+ }
87
+
88
+ async function doLogin(body, account) {
89
+ body.innerHTML = "";
90
+ body.appendChild(el("div", { class: "meta" }, "Opening a browser for " + account + "..."));
91
+ let job;
92
+ try { job = await API.post("/api/google/login", { account }); }
93
+ catch (e) { toast("could not start sign-in: " + e.message, "bad"); return renderList(body); }
94
+ const logbox = el("pre", { class: "log" }, "A browser window opened. Sign in to the Google account you want, then this updates automatically.");
95
+ body.innerHTML = ""; body.appendChild(logbox);
96
+ const poll = setInterval(async () => {
97
+ let s;
98
+ try { s = await API.get("/api/job/get?id=" + job.id); } catch (e) { return; }
99
+ if ((s.logs || []).length) logbox.textContent = s.logs.join("\n");
100
+ if (s.status === "done" || s.status === "failed") {
101
+ clearInterval(poll);
102
+ toast(s.status === "done" ? "account '" + account + "' connected" : "sign-in failed: " + (s.error || ""),
103
+ s.status === "done" ? "ok" : "bad");
104
+ App.refresh();
105
+ renderList(body);
106
+ }
107
+ }, 2000);
108
+ }
109
+
110
+ async function doRemove(body, account) {
111
+ if (!confirm("Remove the Google account '" + account + "'? This deletes its token for ALL Google tools.")) return;
112
+ try {
113
+ const r = await API.post("/api/google/remove", { account });
114
+ toast(r.ok ? "removed '" + account + "'" : "remove failed: " + ((r.error && r.error.message) || ""), r.ok ? "ok" : "bad");
115
+ } catch (e) { toast("remove failed: " + e.message, "bad"); }
116
+ App.refresh();
117
+ renderList(body);
118
+ }
119
+
120
+ if (window.Actions) window.Actions.googleAccounts = () => open();
121
+ })();
@@ -0,0 +1,67 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Agents &amp; Tools - Setup &amp; Health</title>
7
+ <link rel="stylesheet" href="/static/styles.css">
8
+ </head>
9
+ <body>
10
+ <header class="topbar">
11
+ <div class="brand">
12
+ <span class="logo">A&amp;T</span>
13
+ <div>
14
+ <h1>Setup &amp; Health Dashboard</h1>
15
+ <p class="sub" id="basePath">loading...</p>
16
+ </div>
17
+ </div>
18
+ <div class="topactions">
19
+ <button id="copilotBtn" class="btn ghost" title="Ask the setup copilot (uses your configured LLM)">Copilot</button>
20
+ <button id="recheckBtn" class="btn" title="Re-run live validation for everything">Re-check all</button>
21
+ <button id="reloadBtn" class="btn ghost" title="Reload inventory">Refresh</button>
22
+ </div>
23
+ </header>
24
+
25
+ <section id="intro" class="intro">
26
+ <div class="intro-main">
27
+ <strong>This is your setup console.</strong> Each card below is a tool or agent your AI
28
+ assistant can use - but only once it has the credential or login it needs. Green cards are
29
+ ready. Fix the amber ones with the buttons on their card, and they turn green.
30
+ </div>
31
+ <div class="legend">
32
+ <span><span class="dot green"></span> ready to use</span>
33
+ <span><span class="dot amber"></span> needs setup</span>
34
+ <span><span class="dot red"></span> not working</span>
35
+ </div>
36
+ </section>
37
+
38
+ <section id="summary" class="summary"></section>
39
+
40
+ <div id="freshBanner" class="banner hidden"></div>
41
+
42
+ <nav class="tabs" id="tabs">
43
+ <button class="tab active" data-tab="tools">Tools</button>
44
+ <button class="tab" data-tab="agents">Agents</button>
45
+ <button class="tab" data-tab="skills">Skills</button>
46
+ <button class="tab" data-tab="providers">LLM Providers</button>
47
+ <button class="tab" data-tab="context">Context &amp; State</button>
48
+ </nav>
49
+
50
+ <div class="toolbar" id="toolbar">
51
+ <input type="search" id="filterInput" placeholder="Filter by name or description...">
52
+ <label class="chk"><input type="checkbox" id="onlyNeedsSetup"> Show only what needs setup</label>
53
+ </div>
54
+
55
+ <main id="content" class="content"><div class="loading">Loading inventory...</div></main>
56
+
57
+ <div id="modalRoot"></div>
58
+ <div id="toasts" class="toasts"></div>
59
+
60
+ <script src="/static/api.js"></script>
61
+ <script src="/static/app.js"></script>
62
+ <script src="/static/actions.js"></script>
63
+ <script src="/static/google.js"></script>
64
+ <script src="/static/procesio_env.js"></script>
65
+ <script src="/static/copilot.js"></script>
66
+ </body>
67
+ </html>