@agenticmail/enterprise 0.3.2 → 0.4.0

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 (1106) hide show
  1. package/.github/CODEOWNERS +23 -0
  2. package/.github/workflows/publish-community-skills.yml +121 -0
  3. package/.github/workflows/validate-community-skills.yml +172 -0
  4. package/ARCHITECTURE.md +184 -167
  5. package/CLAUDE.md +40 -0
  6. package/CONTRIBUTING.md +254 -0
  7. package/DEPLOYMENT.md +1031 -0
  8. package/README.md +355 -174
  9. package/community-skills/_template/README.md +31 -0
  10. package/community-skills/_template/agenticmail-skill.json +48 -0
  11. package/community-skills/activecampaign/README.md +21 -0
  12. package/community-skills/activecampaign/agenticmail-skill.json +56 -0
  13. package/community-skills/adobe-sign/README.md +21 -0
  14. package/community-skills/adobe-sign/agenticmail-skill.json +72 -0
  15. package/community-skills/adp/README.md +21 -0
  16. package/community-skills/adp/agenticmail-skill.json +65 -0
  17. package/community-skills/airtable-bases/README.md +29 -0
  18. package/community-skills/airtable-bases/agenticmail-skill.json +69 -0
  19. package/community-skills/apollo-io/README.md +21 -0
  20. package/community-skills/apollo-io/agenticmail-skill.json +50 -0
  21. package/community-skills/asana-tasks/README.md +30 -0
  22. package/community-skills/asana-tasks/agenticmail-skill.json +70 -0
  23. package/community-skills/auth0/README.md +21 -0
  24. package/community-skills/auth0/agenticmail-skill.json +56 -0
  25. package/community-skills/aws-services/README.md +38 -0
  26. package/community-skills/aws-services/agenticmail-skill.json +70 -0
  27. package/community-skills/azure-devops/README.md +21 -0
  28. package/community-skills/azure-devops/agenticmail-skill.json +57 -0
  29. package/community-skills/bamboohr/README.md +21 -0
  30. package/community-skills/bamboohr/agenticmail-skill.json +56 -0
  31. package/community-skills/basecamp/README.md +21 -0
  32. package/community-skills/basecamp/agenticmail-skill.json +56 -0
  33. package/community-skills/bigcommerce/README.md +21 -0
  34. package/community-skills/bigcommerce/agenticmail-skill.json +55 -0
  35. package/community-skills/bitbucket-repos/README.md +29 -0
  36. package/community-skills/bitbucket-repos/agenticmail-skill.json +70 -0
  37. package/community-skills/box/README.md +21 -0
  38. package/community-skills/box/agenticmail-skill.json +48 -0
  39. package/community-skills/brex/README.md +21 -0
  40. package/community-skills/brex/agenticmail-skill.json +48 -0
  41. package/community-skills/buffer/README.md +21 -0
  42. package/community-skills/buffer/agenticmail-skill.json +50 -0
  43. package/community-skills/calendly/README.md +20 -0
  44. package/community-skills/calendly/agenticmail-skill.json +43 -0
  45. package/community-skills/canva-design/README.md +33 -0
  46. package/community-skills/canva-design/agenticmail-skill.json +60 -0
  47. package/community-skills/chargebee/README.md +21 -0
  48. package/community-skills/chargebee/agenticmail-skill.json +55 -0
  49. package/community-skills/circleci-pipelines/README.md +28 -0
  50. package/community-skills/circleci-pipelines/agenticmail-skill.json +66 -0
  51. package/community-skills/clickup/README.md +21 -0
  52. package/community-skills/clickup/agenticmail-skill.json +48 -0
  53. package/community-skills/close-crm/README.md +21 -0
  54. package/community-skills/close-crm/agenticmail-skill.json +49 -0
  55. package/community-skills/cloudflare-cdn/README.md +37 -0
  56. package/community-skills/cloudflare-cdn/agenticmail-skill.json +67 -0
  57. package/community-skills/confluence-wiki/README.md +31 -0
  58. package/community-skills/confluence-wiki/agenticmail-skill.json +74 -0
  59. package/community-skills/contentful/README.md +21 -0
  60. package/community-skills/contentful/agenticmail-skill.json +62 -0
  61. package/community-skills/copper-crm/README.md +21 -0
  62. package/community-skills/copper-crm/agenticmail-skill.json +56 -0
  63. package/community-skills/crisp/README.md +21 -0
  64. package/community-skills/crisp/agenticmail-skill.json +56 -0
  65. package/community-skills/crowdstrike/README.md +21 -0
  66. package/community-skills/crowdstrike/agenticmail-skill.json +69 -0
  67. package/community-skills/datadog-monitoring/README.md +37 -0
  68. package/community-skills/datadog-monitoring/agenticmail-skill.json +73 -0
  69. package/community-skills/digitalocean/README.md +21 -0
  70. package/community-skills/digitalocean/agenticmail-skill.json +48 -0
  71. package/community-skills/discord/README.md +45 -0
  72. package/community-skills/discord/agenticmail-skill.json +65 -0
  73. package/community-skills/docker-containers/README.md +38 -0
  74. package/community-skills/docker-containers/agenticmail-skill.json +70 -0
  75. package/community-skills/docusign-esign/README.md +35 -0
  76. package/community-skills/docusign-esign/agenticmail-skill.json +66 -0
  77. package/community-skills/drift/README.md +21 -0
  78. package/community-skills/drift/agenticmail-skill.json +50 -0
  79. package/community-skills/dropbox-storage/README.md +36 -0
  80. package/community-skills/dropbox-storage/agenticmail-skill.json +67 -0
  81. package/community-skills/figma-design/README.md +36 -0
  82. package/community-skills/figma-design/agenticmail-skill.json +66 -0
  83. package/community-skills/firebase/README.md +21 -0
  84. package/community-skills/firebase/agenticmail-skill.json +56 -0
  85. package/community-skills/flyio/README.md +21 -0
  86. package/community-skills/flyio/agenticmail-skill.json +56 -0
  87. package/community-skills/freshbooks/README.md +21 -0
  88. package/community-skills/freshbooks/agenticmail-skill.json +55 -0
  89. package/community-skills/freshdesk/README.md +21 -0
  90. package/community-skills/freshdesk/agenticmail-skill.json +57 -0
  91. package/community-skills/freshsales/README.md +21 -0
  92. package/community-skills/freshsales/agenticmail-skill.json +55 -0
  93. package/community-skills/freshservice/README.md +21 -0
  94. package/community-skills/freshservice/agenticmail-skill.json +56 -0
  95. package/community-skills/front/README.md +21 -0
  96. package/community-skills/front/agenticmail-skill.json +48 -0
  97. package/community-skills/github/README.md +49 -0
  98. package/community-skills/github/agenticmail-skill.json +73 -0
  99. package/community-skills/github-actions/README.md +29 -0
  100. package/community-skills/github-actions/agenticmail-skill.json +72 -0
  101. package/community-skills/gitlab-ci/README.md +51 -0
  102. package/community-skills/gitlab-ci/agenticmail-skill.json +66 -0
  103. package/community-skills/gong/README.md +21 -0
  104. package/community-skills/gong/agenticmail-skill.json +50 -0
  105. package/community-skills/google-ads/README.md +36 -0
  106. package/community-skills/google-ads/agenticmail-skill.json +58 -0
  107. package/community-skills/google-analytics/README.md +28 -0
  108. package/community-skills/google-analytics/agenticmail-skill.json +69 -0
  109. package/community-skills/google-cloud/README.md +33 -0
  110. package/community-skills/google-cloud/agenticmail-skill.json +59 -0
  111. package/community-skills/google-drive/README.md +36 -0
  112. package/community-skills/google-drive/agenticmail-skill.json +65 -0
  113. package/community-skills/gotomeeting/README.md +20 -0
  114. package/community-skills/gotomeeting/agenticmail-skill.json +45 -0
  115. package/community-skills/grafana/README.md +21 -0
  116. package/community-skills/grafana/agenticmail-skill.json +56 -0
  117. package/community-skills/greenhouse/README.md +21 -0
  118. package/community-skills/greenhouse/agenticmail-skill.json +49 -0
  119. package/community-skills/gusto/README.md +21 -0
  120. package/community-skills/gusto/agenticmail-skill.json +49 -0
  121. package/community-skills/hashicorp-vault/README.md +21 -0
  122. package/community-skills/hashicorp-vault/agenticmail-skill.json +58 -0
  123. package/community-skills/heroku/README.md +21 -0
  124. package/community-skills/heroku/agenticmail-skill.json +48 -0
  125. package/community-skills/hibob/README.md +21 -0
  126. package/community-skills/hibob/agenticmail-skill.json +48 -0
  127. package/community-skills/hootsuite/README.md +21 -0
  128. package/community-skills/hootsuite/agenticmail-skill.json +48 -0
  129. package/community-skills/hubspot-crm/README.md +36 -0
  130. package/community-skills/hubspot-crm/agenticmail-skill.json +70 -0
  131. package/community-skills/huggingface/README.md +21 -0
  132. package/community-skills/huggingface/agenticmail-skill.json +48 -0
  133. package/community-skills/index.json +1320 -0
  134. package/community-skills/intercom-support/README.md +36 -0
  135. package/community-skills/intercom-support/agenticmail-skill.json +64 -0
  136. package/community-skills/jira/README.md +53 -0
  137. package/community-skills/jira/agenticmail-skill.json +72 -0
  138. package/community-skills/klaviyo/README.md +21 -0
  139. package/community-skills/klaviyo/agenticmail-skill.json +48 -0
  140. package/community-skills/kubernetes-cluster/README.md +36 -0
  141. package/community-skills/kubernetes-cluster/agenticmail-skill.json +72 -0
  142. package/community-skills/lattice/README.md +21 -0
  143. package/community-skills/lattice/agenticmail-skill.json +49 -0
  144. package/community-skills/launchdarkly/README.md +21 -0
  145. package/community-skills/launchdarkly/agenticmail-skill.json +48 -0
  146. package/community-skills/lever/README.md +21 -0
  147. package/community-skills/lever/agenticmail-skill.json +49 -0
  148. package/community-skills/linear/README.md +29 -0
  149. package/community-skills/linear/agenticmail-skill.json +81 -0
  150. package/community-skills/linkedin/README.md +21 -0
  151. package/community-skills/linkedin/agenticmail-skill.json +48 -0
  152. package/community-skills/livechat/README.md +20 -0
  153. package/community-skills/livechat/agenticmail-skill.json +43 -0
  154. package/community-skills/loom-video/README.md +20 -0
  155. package/community-skills/loom-video/agenticmail-skill.json +44 -0
  156. package/community-skills/mailchimp-campaigns/README.md +37 -0
  157. package/community-skills/mailchimp-campaigns/agenticmail-skill.json +69 -0
  158. package/community-skills/mailgun/README.md +21 -0
  159. package/community-skills/mailgun/agenticmail-skill.json +71 -0
  160. package/community-skills/microsoft-teams/README.md +51 -0
  161. package/community-skills/microsoft-teams/agenticmail-skill.json +66 -0
  162. package/community-skills/miro-boards/README.md +20 -0
  163. package/community-skills/miro-boards/agenticmail-skill.json +44 -0
  164. package/community-skills/mixpanel-analytics/README.md +34 -0
  165. package/community-skills/mixpanel-analytics/agenticmail-skill.json +64 -0
  166. package/community-skills/monday-boards/README.md +28 -0
  167. package/community-skills/monday-boards/agenticmail-skill.json +68 -0
  168. package/community-skills/mongodb-atlas/README.md +21 -0
  169. package/community-skills/mongodb-atlas/agenticmail-skill.json +58 -0
  170. package/community-skills/neon/README.md +21 -0
  171. package/community-skills/neon/agenticmail-skill.json +50 -0
  172. package/community-skills/netlify/README.md +21 -0
  173. package/community-skills/netlify/agenticmail-skill.json +48 -0
  174. package/community-skills/netsuite/README.md +21 -0
  175. package/community-skills/netsuite/agenticmail-skill.json +57 -0
  176. package/community-skills/newrelic/README.md +21 -0
  177. package/community-skills/newrelic/agenticmail-skill.json +58 -0
  178. package/community-skills/notion/README.md +49 -0
  179. package/community-skills/notion/agenticmail-skill.json +72 -0
  180. package/community-skills/okta/README.md +21 -0
  181. package/community-skills/okta/agenticmail-skill.json +57 -0
  182. package/community-skills/openai/README.md +21 -0
  183. package/community-skills/openai/agenticmail-skill.json +48 -0
  184. package/community-skills/opsgenie/README.md +21 -0
  185. package/community-skills/opsgenie/agenticmail-skill.json +48 -0
  186. package/community-skills/outreach/README.md +21 -0
  187. package/community-skills/outreach/agenticmail-skill.json +50 -0
  188. package/community-skills/paddle/README.md +21 -0
  189. package/community-skills/paddle/agenticmail-skill.json +55 -0
  190. package/community-skills/pagerduty/README.md +21 -0
  191. package/community-skills/pagerduty/agenticmail-skill.json +48 -0
  192. package/community-skills/pandadoc/README.md +21 -0
  193. package/community-skills/pandadoc/agenticmail-skill.json +48 -0
  194. package/community-skills/paypal/README.md +21 -0
  195. package/community-skills/paypal/agenticmail-skill.json +55 -0
  196. package/community-skills/personio/README.md +21 -0
  197. package/community-skills/personio/agenticmail-skill.json +48 -0
  198. package/community-skills/pinecone/README.md +21 -0
  199. package/community-skills/pinecone/agenticmail-skill.json +48 -0
  200. package/community-skills/pipedrive-deals/README.md +33 -0
  201. package/community-skills/pipedrive-deals/agenticmail-skill.json +60 -0
  202. package/community-skills/plaid/README.md +21 -0
  203. package/community-skills/plaid/agenticmail-skill.json +65 -0
  204. package/community-skills/postmark/README.md +21 -0
  205. package/community-skills/postmark/agenticmail-skill.json +48 -0
  206. package/community-skills/power-automate/README.md +21 -0
  207. package/community-skills/power-automate/agenticmail-skill.json +59 -0
  208. package/community-skills/quickbooks-accounting/README.md +38 -0
  209. package/community-skills/quickbooks-accounting/agenticmail-skill.json +70 -0
  210. package/community-skills/recurly/README.md +21 -0
  211. package/community-skills/recurly/agenticmail-skill.json +48 -0
  212. package/community-skills/reddit/README.md +21 -0
  213. package/community-skills/reddit/agenticmail-skill.json +48 -0
  214. package/community-skills/render/README.md +21 -0
  215. package/community-skills/render/agenticmail-skill.json +48 -0
  216. package/community-skills/ringcentral/README.md +20 -0
  217. package/community-skills/ringcentral/agenticmail-skill.json +43 -0
  218. package/community-skills/rippling/README.md +21 -0
  219. package/community-skills/rippling/agenticmail-skill.json +48 -0
  220. package/community-skills/salesforce/README.md +53 -0
  221. package/community-skills/salesforce/agenticmail-skill.json +73 -0
  222. package/community-skills/salesloft/README.md +21 -0
  223. package/community-skills/salesloft/agenticmail-skill.json +48 -0
  224. package/community-skills/sanity/README.md +21 -0
  225. package/community-skills/sanity/agenticmail-skill.json +62 -0
  226. package/community-skills/sap/README.md +21 -0
  227. package/community-skills/sap/agenticmail-skill.json +63 -0
  228. package/community-skills/segment-cdp/README.md +37 -0
  229. package/community-skills/segment-cdp/agenticmail-skill.json +66 -0
  230. package/community-skills/sendgrid-email/README.md +51 -0
  231. package/community-skills/sendgrid-email/agenticmail-skill.json +71 -0
  232. package/community-skills/sentry/README.md +21 -0
  233. package/community-skills/sentry/agenticmail-skill.json +58 -0
  234. package/community-skills/servicenow/README.md +21 -0
  235. package/community-skills/servicenow/agenticmail-skill.json +56 -0
  236. package/community-skills/shopify/README.md +21 -0
  237. package/community-skills/shopify/agenticmail-skill.json +56 -0
  238. package/community-skills/shortcut/README.md +21 -0
  239. package/community-skills/shortcut/agenticmail-skill.json +48 -0
  240. package/community-skills/slack/README.md +45 -0
  241. package/community-skills/slack/agenticmail-skill.json +73 -0
  242. package/community-skills/smartsheet/README.md +21 -0
  243. package/community-skills/smartsheet/agenticmail-skill.json +48 -0
  244. package/community-skills/snowflake-warehouse/README.md +37 -0
  245. package/community-skills/snowflake-warehouse/agenticmail-skill.json +71 -0
  246. package/community-skills/snyk/README.md +21 -0
  247. package/community-skills/snyk/agenticmail-skill.json +48 -0
  248. package/community-skills/splunk/README.md +21 -0
  249. package/community-skills/splunk/agenticmail-skill.json +56 -0
  250. package/community-skills/square/README.md +21 -0
  251. package/community-skills/square/agenticmail-skill.json +55 -0
  252. package/community-skills/statuspage/README.md +21 -0
  253. package/community-skills/statuspage/agenticmail-skill.json +56 -0
  254. package/community-skills/stripe/README.md +45 -0
  255. package/community-skills/stripe/agenticmail-skill.json +66 -0
  256. package/community-skills/supabase/README.md +21 -0
  257. package/community-skills/supabase/agenticmail-skill.json +56 -0
  258. package/community-skills/teamwork/README.md +21 -0
  259. package/community-skills/teamwork/agenticmail-skill.json +56 -0
  260. package/community-skills/telegram-bot/README.md +20 -0
  261. package/community-skills/telegram-bot/agenticmail-skill.json +52 -0
  262. package/community-skills/terraform-iac/README.md +34 -0
  263. package/community-skills/terraform-iac/agenticmail-skill.json +66 -0
  264. package/community-skills/todoist-tasks/README.md +29 -0
  265. package/community-skills/todoist-tasks/agenticmail-skill.json +72 -0
  266. package/community-skills/trello-cards/README.md +30 -0
  267. package/community-skills/trello-cards/agenticmail-skill.json +72 -0
  268. package/community-skills/twilio-sms/README.md +47 -0
  269. package/community-skills/twilio-sms/agenticmail-skill.json +63 -0
  270. package/community-skills/twitter/README.md +21 -0
  271. package/community-skills/twitter/agenticmail-skill.json +48 -0
  272. package/community-skills/vercel-deployments/README.md +29 -0
  273. package/community-skills/vercel-deployments/agenticmail-skill.json +70 -0
  274. package/community-skills/weaviate/README.md +21 -0
  275. package/community-skills/weaviate/agenticmail-skill.json +56 -0
  276. package/community-skills/webex/README.md +20 -0
  277. package/community-skills/webex/agenticmail-skill.json +43 -0
  278. package/community-skills/webflow/README.md +21 -0
  279. package/community-skills/webflow/agenticmail-skill.json +48 -0
  280. package/community-skills/whatsapp-business/README.md +20 -0
  281. package/community-skills/whatsapp-business/agenticmail-skill.json +52 -0
  282. package/community-skills/whereby/README.md +20 -0
  283. package/community-skills/whereby/agenticmail-skill.json +43 -0
  284. package/community-skills/woocommerce/README.md +21 -0
  285. package/community-skills/woocommerce/agenticmail-skill.json +55 -0
  286. package/community-skills/wordpress/README.md +21 -0
  287. package/community-skills/wordpress/agenticmail-skill.json +56 -0
  288. package/community-skills/workday/README.md +21 -0
  289. package/community-skills/workday/agenticmail-skill.json +56 -0
  290. package/community-skills/wrike/README.md +21 -0
  291. package/community-skills/wrike/agenticmail-skill.json +48 -0
  292. package/community-skills/xero/README.md +21 -0
  293. package/community-skills/xero/agenticmail-skill.json +56 -0
  294. package/community-skills/youtube/README.md +21 -0
  295. package/community-skills/youtube/agenticmail-skill.json +52 -0
  296. package/community-skills/zendesk-tickets/README.md +37 -0
  297. package/community-skills/zendesk-tickets/agenticmail-skill.json +65 -0
  298. package/community-skills/zoho-crm/README.md +21 -0
  299. package/community-skills/zoho-crm/agenticmail-skill.json +74 -0
  300. package/community-skills/zoom-meetings/README.md +51 -0
  301. package/community-skills/zoom-meetings/agenticmail-skill.json +66 -0
  302. package/community-skills/zuora/README.md +21 -0
  303. package/community-skills/zuora/agenticmail-skill.json +55 -0
  304. package/dashboards/README.md +81 -70
  305. package/dashboards/django/app.py +117 -0
  306. package/dashboards/django/static/styles.css +284 -0
  307. package/dashboards/django/templates/agent_detail.html +501 -0
  308. package/dashboards/django/templates/agents.html +217 -0
  309. package/dashboards/django/templates/api_keys.html +41 -0
  310. package/dashboards/django/templates/audit.html +26 -0
  311. package/dashboards/django/templates/compliance.html +33 -0
  312. package/dashboards/django/templates/components/modal.html +6 -0
  313. package/dashboards/django/templates/components/pagination.html +9 -0
  314. package/dashboards/django/templates/components/stats.html +8 -0
  315. package/dashboards/django/templates/dashboard.html +24 -0
  316. package/dashboards/django/templates/dlp.html +70 -0
  317. package/dashboards/django/templates/guardrails.html +78 -0
  318. package/dashboards/django/templates/journal.html +39 -0
  319. package/dashboards/django/templates/layout.html +52 -0
  320. package/dashboards/django/templates/login.html +30 -0
  321. package/dashboards/django/templates/messages.html +38 -0
  322. package/dashboards/django/templates/settings.html +472 -0
  323. package/dashboards/django/templates/skills.html +66 -0
  324. package/dashboards/django/templates/users.html +34 -0
  325. package/dashboards/django/templates/vault.html +46 -0
  326. package/dashboards/django/utils/__init__.py +0 -0
  327. package/dashboards/django/utils/api.py +20 -0
  328. package/dashboards/django/utils/helpers.py +39 -0
  329. package/dashboards/django/views/__init__.py +38 -0
  330. package/dashboards/django/views/agents.py +343 -0
  331. package/dashboards/django/views/api_keys.py +47 -0
  332. package/dashboards/django/views/audit.py +35 -0
  333. package/dashboards/django/views/auth.py +34 -0
  334. package/dashboards/django/views/compliance.py +37 -0
  335. package/dashboards/django/views/dashboard.py +27 -0
  336. package/dashboards/django/views/dlp.py +53 -0
  337. package/dashboards/django/views/guardrails.py +61 -0
  338. package/dashboards/django/views/journal.py +41 -0
  339. package/dashboards/django/views/messages.py +65 -0
  340. package/dashboards/django/views/settings_view.py +335 -0
  341. package/dashboards/django/views/skills.py +50 -0
  342. package/dashboards/django/views/users.py +42 -0
  343. package/dashboards/django/views/vault.py +50 -0
  344. package/dashboards/dotnet/AgenticMailDashboard.csproj +10 -0
  345. package/dashboards/dotnet/Program.cs +53 -233
  346. package/dashboards/dotnet/Routes/AgentRoutes.cs +771 -0
  347. package/dashboards/dotnet/Routes/ApiKeyRoutes.cs +185 -0
  348. package/dashboards/dotnet/Routes/AuditRoutes.cs +86 -0
  349. package/dashboards/dotnet/Routes/AuthRoutes.cs +50 -0
  350. package/dashboards/dotnet/Routes/ComplianceRoutes.cs +143 -0
  351. package/dashboards/dotnet/Routes/DashboardRoutes.cs +81 -0
  352. package/dashboards/dotnet/Routes/DlpRoutes.cs +230 -0
  353. package/dashboards/dotnet/Routes/GuardrailRoutes.cs +285 -0
  354. package/dashboards/dotnet/Routes/JournalRoutes.cs +118 -0
  355. package/dashboards/dotnet/Routes/MessageRoutes.cs +167 -0
  356. package/dashboards/dotnet/Routes/SettingRoutes.cs +907 -0
  357. package/dashboards/dotnet/Routes/SkillRoutes.cs +198 -0
  358. package/dashboards/dotnet/Routes/UserRoutes.cs +111 -0
  359. package/dashboards/dotnet/Routes/VaultRoutes.cs +162 -0
  360. package/dashboards/dotnet/Services/ApiClient.cs +103 -0
  361. package/dashboards/dotnet/Services/HtmlBuilder.cs +249 -0
  362. package/dashboards/dotnet/wwwroot/styles.css +284 -0
  363. package/dashboards/express/app.js +37 -126
  364. package/dashboards/express/middleware/auth.js +10 -0
  365. package/dashboards/express/package-lock.json +922 -0
  366. package/dashboards/express/package.json +17 -0
  367. package/dashboards/express/public/styles.css +284 -0
  368. package/dashboards/express/routes/agents.js +771 -0
  369. package/dashboards/express/routes/apiKeys.js +107 -0
  370. package/dashboards/express/routes/audit.js +75 -0
  371. package/dashboards/express/routes/auth.js +38 -0
  372. package/dashboards/express/routes/compliance.js +93 -0
  373. package/dashboards/express/routes/dashboard.js +65 -0
  374. package/dashboards/express/routes/dlp.js +165 -0
  375. package/dashboards/express/routes/guardrails.js +195 -0
  376. package/dashboards/express/routes/journal.js +95 -0
  377. package/dashboards/express/routes/messages.js +97 -0
  378. package/dashboards/express/routes/settings.js +830 -0
  379. package/dashboards/express/routes/skills.js +141 -0
  380. package/dashboards/express/routes/users.js +69 -0
  381. package/dashboards/express/routes/vault.js +141 -0
  382. package/dashboards/express/utils/api.js +44 -0
  383. package/dashboards/express/utils/helpers.js +46 -0
  384. package/dashboards/express/views/components/modal.js +255 -0
  385. package/dashboards/express/views/components/stats.js +22 -0
  386. package/dashboards/express/views/components/table.js +31 -0
  387. package/dashboards/express/views/layout.js +73 -0
  388. package/dashboards/express/views/login.js +45 -0
  389. package/dashboards/go/go.mod +3 -0
  390. package/dashboards/go/handlers/agents.go +790 -0
  391. package/dashboards/go/handlers/apikeys.go +38 -0
  392. package/dashboards/go/handlers/audit.go +52 -0
  393. package/dashboards/go/handlers/auth.go +39 -0
  394. package/dashboards/go/handlers/compliance.go +58 -0
  395. package/dashboards/go/handlers/dashboard.go +43 -0
  396. package/dashboards/go/handlers/dlp.go +78 -0
  397. package/dashboards/go/handlers/guardrails.go +89 -0
  398. package/dashboards/go/handlers/journal.go +60 -0
  399. package/dashboards/go/handlers/messages.go +59 -0
  400. package/dashboards/go/handlers/settings.go +951 -0
  401. package/dashboards/go/handlers/skills.go +129 -0
  402. package/dashboards/go/handlers/users.go +54 -0
  403. package/dashboards/go/handlers/vault.go +85 -0
  404. package/dashboards/go/main.go +35 -485
  405. package/dashboards/go/middleware/auth.go +17 -0
  406. package/dashboards/go/services/api.go +38 -0
  407. package/dashboards/go/services/session.go +52 -0
  408. package/dashboards/go/static/styles.css +284 -0
  409. package/dashboards/go/templates/components.go +45 -0
  410. package/dashboards/go/templates/helpers.go +35 -0
  411. package/dashboards/go/templates/layout.go +59 -0
  412. package/dashboards/html/index.html +203 -450
  413. package/dashboards/html/package.json +11 -0
  414. package/dashboards/html/public/styles.css +149 -0
  415. package/dashboards/html/src/api.js +36 -0
  416. package/dashboards/html/src/components/badge.js +13 -0
  417. package/dashboards/html/src/components/layout.js +11 -0
  418. package/dashboards/html/src/components/modal.js +9 -0
  419. package/dashboards/html/src/components/pagination.js +12 -0
  420. package/dashboards/html/src/components/stat-card.js +14 -0
  421. package/dashboards/html/src/components/table.js +6 -0
  422. package/dashboards/html/src/main.js +83 -0
  423. package/dashboards/html/src/pages/agents.js +831 -0
  424. package/dashboards/html/src/pages/api-keys.js +80 -0
  425. package/dashboards/html/src/pages/audit.js +50 -0
  426. package/dashboards/html/src/pages/compliance.js +69 -0
  427. package/dashboards/html/src/pages/dashboard.js +25 -0
  428. package/dashboards/html/src/pages/dlp.js +112 -0
  429. package/dashboards/html/src/pages/guardrails.js +127 -0
  430. package/dashboards/html/src/pages/journal.js +54 -0
  431. package/dashboards/html/src/pages/login.js +84 -0
  432. package/dashboards/html/src/pages/messages.js +90 -0
  433. package/dashboards/html/src/pages/settings.js +656 -0
  434. package/dashboards/html/src/pages/skills.js +114 -0
  435. package/dashboards/html/src/pages/users.js +62 -0
  436. package/dashboards/html/src/pages/vault.js +105 -0
  437. package/dashboards/html/src/router.js +40 -0
  438. package/dashboards/html/src/utils/escape.js +7 -0
  439. package/dashboards/html/src/utils/time.js +16 -0
  440. package/dashboards/html/src/utils/toast.js +10 -0
  441. package/dashboards/java/AgenticMailDashboard.java +123 -346
  442. package/dashboards/java/handlers/AgentsHandler.java +807 -0
  443. package/dashboards/java/handlers/ApiKeysHandler.java +201 -0
  444. package/dashboards/java/handlers/AuditHandler.java +95 -0
  445. package/dashboards/java/handlers/AuthHandler.java +71 -0
  446. package/dashboards/java/handlers/ComplianceHandler.java +192 -0
  447. package/dashboards/java/handlers/DashboardHandler.java +98 -0
  448. package/dashboards/java/handlers/DlpHandler.java +230 -0
  449. package/dashboards/java/handlers/GuardrailsHandler.java +272 -0
  450. package/dashboards/java/handlers/JournalHandler.java +130 -0
  451. package/dashboards/java/handlers/MessagesHandler.java +168 -0
  452. package/dashboards/java/handlers/SettingsHandler.java +1017 -0
  453. package/dashboards/java/handlers/SkillsHandler.java +198 -0
  454. package/dashboards/java/handlers/UsersHandler.java +118 -0
  455. package/dashboards/java/handlers/VaultHandler.java +168 -0
  456. package/dashboards/java/services/ApiClient.java +233 -0
  457. package/dashboards/java/services/SessionManager.java +138 -0
  458. package/dashboards/java/static/styles.css +288 -0
  459. package/dashboards/java/templates/Components.java +142 -0
  460. package/dashboards/java/templates/Helpers.java +106 -0
  461. package/dashboards/java/templates/Layout.java +98 -0
  462. package/dashboards/laravel/controllers/AgentController.php +250 -0
  463. package/dashboards/laravel/controllers/ApiKeyController.php +73 -0
  464. package/dashboards/laravel/controllers/AuditController.php +31 -0
  465. package/dashboards/laravel/controllers/AuthController.php +44 -0
  466. package/dashboards/laravel/controllers/ComplianceController.php +55 -0
  467. package/dashboards/laravel/controllers/DashboardController.php +28 -0
  468. package/dashboards/laravel/controllers/DlpController.php +88 -0
  469. package/dashboards/laravel/controllers/GuardrailController.php +110 -0
  470. package/dashboards/laravel/controllers/JournalController.php +44 -0
  471. package/dashboards/laravel/controllers/MessageController.php +47 -0
  472. package/dashboards/laravel/controllers/SettingController.php +258 -0
  473. package/dashboards/laravel/controllers/SkillController.php +74 -0
  474. package/dashboards/laravel/controllers/UserController.php +47 -0
  475. package/dashboards/laravel/controllers/VaultController.php +94 -0
  476. package/dashboards/laravel/index.php +319 -0
  477. package/dashboards/laravel/lib/Api.php +73 -0
  478. package/dashboards/laravel/lib/Helpers.php +123 -0
  479. package/dashboards/laravel/public/styles.css +291 -0
  480. package/dashboards/laravel/views/agent-detail.php +534 -0
  481. package/dashboards/laravel/views/agents.php +204 -0
  482. package/dashboards/laravel/views/api-keys.php +55 -0
  483. package/dashboards/laravel/views/audit.php +30 -0
  484. package/dashboards/laravel/views/compliance.php +48 -0
  485. package/dashboards/laravel/views/components/modal.php +59 -0
  486. package/dashboards/laravel/views/components/stats.php +21 -0
  487. package/dashboards/laravel/views/components/table.php +35 -0
  488. package/dashboards/laravel/views/dashboard.php +31 -0
  489. package/dashboards/laravel/views/dlp.php +87 -0
  490. package/dashboards/laravel/views/guardrails.php +95 -0
  491. package/dashboards/laravel/views/journal.php +50 -0
  492. package/dashboards/laravel/views/layout.php +82 -0
  493. package/dashboards/laravel/views/login.php +45 -0
  494. package/dashboards/laravel/views/messages.php +60 -0
  495. package/dashboards/laravel/views/settings.php +622 -0
  496. package/dashboards/laravel/views/skills.php +74 -0
  497. package/dashboards/laravel/views/users.php +42 -0
  498. package/dashboards/laravel/views/vault.php +80 -0
  499. package/dashboards/php/components/layout.php +80 -0
  500. package/dashboards/php/components/modal.php +22 -0
  501. package/dashboards/php/components/stats.php +20 -0
  502. package/dashboards/php/components/table.php +33 -0
  503. package/dashboards/php/index.php +663 -381
  504. package/dashboards/php/lib/api.php +37 -0
  505. package/dashboards/php/lib/auth.php +47 -0
  506. package/dashboards/php/lib/helpers.php +69 -0
  507. package/dashboards/php/pages/agent-detail.php +552 -0
  508. package/dashboards/php/pages/agents.php +185 -0
  509. package/dashboards/php/pages/api-keys.php +34 -0
  510. package/dashboards/php/pages/audit.php +31 -0
  511. package/dashboards/php/pages/compliance.php +38 -0
  512. package/dashboards/php/pages/dashboard.php +29 -0
  513. package/dashboards/php/pages/dlp.php +65 -0
  514. package/dashboards/php/pages/guardrails.php +70 -0
  515. package/dashboards/php/pages/journal.php +53 -0
  516. package/dashboards/php/pages/login.php +34 -0
  517. package/dashboards/php/pages/messages.php +53 -0
  518. package/dashboards/php/pages/settings.php +687 -0
  519. package/dashboards/php/pages/skills.php +70 -0
  520. package/dashboards/php/pages/users.php +37 -0
  521. package/dashboards/php/pages/vault.php +70 -0
  522. package/dashboards/php/public/styles.css +81 -0
  523. package/dashboards/python/app.py +61 -259
  524. package/dashboards/python/routes/__init__.py +0 -0
  525. package/dashboards/python/routes/agents.py +296 -0
  526. package/dashboards/python/routes/api_keys.py +49 -0
  527. package/dashboards/python/routes/audit.py +33 -0
  528. package/dashboards/python/routes/auth.py +30 -0
  529. package/dashboards/python/routes/compliance.py +50 -0
  530. package/dashboards/python/routes/dashboard.py +32 -0
  531. package/dashboards/python/routes/dlp.py +64 -0
  532. package/dashboards/python/routes/guardrails.py +79 -0
  533. package/dashboards/python/routes/journal.py +40 -0
  534. package/dashboards/python/routes/messages.py +46 -0
  535. package/dashboards/python/routes/settings.py +260 -0
  536. package/dashboards/python/routes/skills.py +59 -0
  537. package/dashboards/python/routes/users.py +43 -0
  538. package/dashboards/python/routes/vault.py +59 -0
  539. package/dashboards/python/static/styles.css +288 -0
  540. package/dashboards/python/templates/agent_detail.html +552 -0
  541. package/dashboards/python/templates/agents.html +246 -0
  542. package/dashboards/python/templates/api_keys.html +64 -0
  543. package/dashboards/python/templates/audit.html +50 -0
  544. package/dashboards/python/templates/compliance.html +74 -0
  545. package/dashboards/python/templates/components/modal.html +43 -0
  546. package/dashboards/python/templates/components/stats.html +26 -0
  547. package/dashboards/python/templates/components/table.html +43 -0
  548. package/dashboards/python/templates/dashboard.html +34 -0
  549. package/dashboards/python/templates/dlp.html +159 -0
  550. package/dashboards/python/templates/guardrails.html +131 -0
  551. package/dashboards/python/templates/journal.html +66 -0
  552. package/dashboards/python/templates/layout.html +86 -0
  553. package/dashboards/python/templates/login.html +36 -0
  554. package/dashboards/python/templates/messages.html +90 -0
  555. package/dashboards/python/templates/settings.html +624 -0
  556. package/dashboards/python/templates/skills.html +89 -0
  557. package/dashboards/python/templates/users.html +70 -0
  558. package/dashboards/python/templates/vault.html +73 -0
  559. package/dashboards/python/utils/__init__.py +0 -0
  560. package/dashboards/python/utils/api.py +35 -0
  561. package/dashboards/python/utils/helpers.py +90 -0
  562. package/dashboards/rails/app.rb +56 -0
  563. package/dashboards/rails/helpers/api.rb +39 -0
  564. package/dashboards/rails/helpers/auth.rb +11 -0
  565. package/dashboards/rails/helpers/view.rb +95 -0
  566. package/dashboards/rails/public/styles.css +299 -0
  567. package/dashboards/rails/routes/agents.rb +173 -0
  568. package/dashboards/rails/routes/api_keys.rb +30 -0
  569. package/dashboards/rails/routes/audit.rb +15 -0
  570. package/dashboards/rails/routes/auth.rb +29 -0
  571. package/dashboards/rails/routes/compliance.rb +25 -0
  572. package/dashboards/rails/routes/dashboard.rb +13 -0
  573. package/dashboards/rails/routes/dlp.rb +40 -0
  574. package/dashboards/rails/routes/guardrails.rb +51 -0
  575. package/dashboards/rails/routes/journal.rb +24 -0
  576. package/dashboards/rails/routes/messages.rb +22 -0
  577. package/dashboards/rails/routes/settings.rb +196 -0
  578. package/dashboards/rails/routes/skills.rb +38 -0
  579. package/dashboards/rails/routes/users.rb +18 -0
  580. package/dashboards/rails/routes/vault.rb +37 -0
  581. package/dashboards/rails/views/agent_detail.erb +550 -0
  582. package/dashboards/rails/views/agents.erb +214 -0
  583. package/dashboards/rails/views/api_keys.erb +52 -0
  584. package/dashboards/rails/views/audit.erb +38 -0
  585. package/dashboards/rails/views/compliance.erb +69 -0
  586. package/dashboards/rails/views/dashboard.erb +46 -0
  587. package/dashboards/rails/views/dlp.erb +104 -0
  588. package/dashboards/rails/views/guardrails.erb +107 -0
  589. package/dashboards/rails/views/journal.erb +65 -0
  590. package/dashboards/rails/views/layout.erb +53 -0
  591. package/dashboards/rails/views/login.erb +47 -0
  592. package/dashboards/rails/views/messages.erb +62 -0
  593. package/dashboards/rails/views/settings.erb +578 -0
  594. package/dashboards/rails/views/skills.erb +66 -0
  595. package/dashboards/rails/views/users.erb +53 -0
  596. package/dashboards/rails/views/vault.erb +66 -0
  597. package/dashboards/ruby/app.rb +53 -182
  598. package/dashboards/ruby/helpers/api.rb +63 -0
  599. package/dashboards/ruby/helpers/auth.rb +20 -0
  600. package/dashboards/ruby/helpers/view.rb +91 -0
  601. package/dashboards/ruby/public/styles.css +294 -0
  602. package/dashboards/ruby/routes/agents.rb +197 -0
  603. package/dashboards/ruby/routes/api_keys.rb +43 -0
  604. package/dashboards/ruby/routes/audit.rb +15 -0
  605. package/dashboards/ruby/routes/auth.rb +29 -0
  606. package/dashboards/ruby/routes/compliance.rb +28 -0
  607. package/dashboards/ruby/routes/dashboard.rb +13 -0
  608. package/dashboards/ruby/routes/dlp.rb +55 -0
  609. package/dashboards/ruby/routes/guardrails.rb +77 -0
  610. package/dashboards/ruby/routes/journal.rb +24 -0
  611. package/dashboards/ruby/routes/messages.rb +27 -0
  612. package/dashboards/ruby/routes/settings.rb +214 -0
  613. package/dashboards/ruby/routes/skills.rb +50 -0
  614. package/dashboards/ruby/routes/users.rb +26 -0
  615. package/dashboards/ruby/routes/vault.rb +49 -0
  616. package/dashboards/ruby/views/agent_detail.erb +550 -0
  617. package/dashboards/ruby/views/agents.erb +214 -0
  618. package/dashboards/ruby/views/api_keys.erb +59 -0
  619. package/dashboards/ruby/views/audit.erb +38 -0
  620. package/dashboards/ruby/views/compliance.erb +45 -0
  621. package/dashboards/ruby/views/dashboard.erb +46 -0
  622. package/dashboards/ruby/views/dlp.erb +88 -0
  623. package/dashboards/ruby/views/guardrails.erb +103 -0
  624. package/dashboards/ruby/views/journal.erb +53 -0
  625. package/dashboards/ruby/views/layout.erb +52 -0
  626. package/dashboards/ruby/views/login.erb +31 -0
  627. package/dashboards/ruby/views/messages.erb +51 -0
  628. package/dashboards/ruby/views/settings.erb +579 -0
  629. package/dashboards/ruby/views/skills.erb +66 -0
  630. package/dashboards/ruby/views/users.erb +53 -0
  631. package/dashboards/ruby/views/vault.erb +66 -0
  632. package/dashboards/shared/styles.css +322 -0
  633. package/dist/{chunk-TVF23PUW.js → chunk-7FVRYOP4.js} +22 -7
  634. package/dist/chunk-DRXMYYKN.js +79 -0
  635. package/dist/chunk-E23VJ3QX.js +9427 -0
  636. package/dist/chunk-EOBN6RCA.js +12652 -0
  637. package/dist/chunk-FLRYMSKY.js +23 -0
  638. package/dist/chunk-HAUHDCUB.js +764 -0
  639. package/dist/chunk-HSF6OJ5Z.js +154 -0
  640. package/dist/{chunk-PNKVD2UK.js → chunk-KFQGP6VL.js} +7 -0
  641. package/dist/chunk-LKAFZ343.js +591 -0
  642. package/dist/{chunk-GXIEEA2T.js → chunk-NTVN3JHS.js} +10 -10
  643. package/dist/chunk-RO537U6H.js +70 -0
  644. package/dist/chunk-SGBTJHEF.js +2287 -0
  645. package/dist/chunk-SMUXH6FM.js +1943 -0
  646. package/dist/chunk-TY7NVD4U.js +275 -0
  647. package/dist/chunk-X6UVWFHW.js +3455 -0
  648. package/dist/{chunk-7RGCCHIT.js → chunk-XMDE2NGH.js} +2 -1
  649. package/dist/chunk-ZNR5DDTA.js +239 -0
  650. package/dist/cidr-LISVZSM2.js +17 -0
  651. package/dist/cli-build-skill-XOYECCLE.js +235 -0
  652. package/dist/cli-recover-SSGGSKZJ.js +97 -0
  653. package/dist/cli-submit-skill-RSBLF5XN.js +162 -0
  654. package/dist/cli-validate-WJBUOEGW.js +148 -0
  655. package/dist/cli-verify-V3GPFMWU.js +98 -0
  656. package/dist/cli.js +50 -376
  657. package/dist/config-store-CRMKWBON.js +58 -0
  658. package/dist/dashboard/app.js +246 -0
  659. package/dist/dashboard/assets/logo.png +0 -0
  660. package/dist/dashboard/components/error-boundary.js +21 -0
  661. package/dist/dashboard/components/help-button.js +34 -0
  662. package/dist/dashboard/components/icons.js +53 -0
  663. package/dist/dashboard/components/modal.js +124 -0
  664. package/dist/dashboard/components/persona-fields.js +271 -0
  665. package/dist/dashboard/components/settings-help.js +191 -0
  666. package/dist/dashboard/components/tag-input.js +96 -0
  667. package/dist/dashboard/components/utils.js +148 -0
  668. package/dist/dashboard/index.html +407 -874
  669. package/dist/dashboard/pages/activity.js +62 -0
  670. package/dist/dashboard/pages/agent-detail.js +3577 -0
  671. package/dist/dashboard/pages/agents.js +1072 -0
  672. package/dist/dashboard/pages/approvals.js +81 -0
  673. package/dist/dashboard/pages/audit.js +133 -0
  674. package/dist/dashboard/pages/community-skills.js +665 -0
  675. package/dist/dashboard/pages/compliance.js +81 -0
  676. package/dist/dashboard/pages/dashboard.js +150 -0
  677. package/dist/dashboard/pages/dlp.js +107 -0
  678. package/dist/dashboard/pages/domain-status.js +123 -0
  679. package/dist/dashboard/pages/guardrails.js +995 -0
  680. package/dist/dashboard/pages/journal.js +51 -0
  681. package/dist/dashboard/pages/knowledge-contributions.js +763 -0
  682. package/dist/dashboard/pages/knowledge.js +46 -0
  683. package/dist/dashboard/pages/login.js +491 -0
  684. package/dist/dashboard/pages/messages.js +274 -0
  685. package/dist/dashboard/pages/settings.js +1554 -0
  686. package/dist/dashboard/pages/skill-connections.js +452 -0
  687. package/dist/dashboard/pages/skills.js +433 -0
  688. package/dist/dashboard/pages/users.js +49 -0
  689. package/dist/dashboard/pages/vault.js +538 -0
  690. package/dist/dashboard/pages/workforce.js +569 -0
  691. package/dist/dashboard/vendor/react-dom.production.min.js +267 -0
  692. package/dist/dashboard/vendor/react.production.min.js +31 -0
  693. package/dist/db-adapter-5PWMLY67.js +7 -0
  694. package/dist/domain-lock-URIFILHB.js +7 -0
  695. package/dist/{dynamodb-CCGL2E77.js → dynamodb-CD3LREWD.js} +4 -4
  696. package/dist/{factory-HINWFYZ3.js → factory-FVJH5RRY.js} +2 -2
  697. package/dist/firewall-AHIRE6UB.js +10 -0
  698. package/dist/index.js +133 -448
  699. package/dist/{managed-RZITNPXG.js → managed-QVTONZ7E.js} +4 -2
  700. package/dist/{mongodb-ODTXIVPV.js → mongodb-73MGW7LD.js} +4 -4
  701. package/dist/{mysql-RM3S2FV5.js → mysql-A2RYNBQG.js} +59 -6
  702. package/dist/{postgres-LN7A6MGQ.js → postgres-OE23X46P.js} +63 -6
  703. package/dist/registry/cli.js +411 -0
  704. package/dist/routes-NJK5OI5N.js +5673 -0
  705. package/dist/runtime-SMA6JUMP.js +46 -0
  706. package/dist/server-ZT5NWHT4.js +11 -0
  707. package/dist/setup-RCYNX5NA.js +20 -0
  708. package/dist/skills-QNR3CCHA.js +14 -0
  709. package/dist/soul-templates.json +1525 -0
  710. package/dist/{sqlite-VLKVAJA4.js → sqlite-SFVNZPHX.js} +56 -8
  711. package/dist/{turso-LDWODSDI.js → turso-L6WQAY7U.js} +59 -6
  712. package/live-test.mjs +1 -1
  713. package/package.json +11 -10
  714. package/schemas/agenticmail-skill.v1.schema.json +180 -0
  715. package/serve.mjs +12 -2
  716. package/src/admin/routes.ts +536 -5
  717. package/src/agent-tools/common.ts +232 -0
  718. package/src/agent-tools/index.ts +246 -0
  719. package/src/agent-tools/merge.ts +62 -0
  720. package/src/agent-tools/middleware.ts +436 -0
  721. package/src/agent-tools/security.ts +352 -0
  722. package/src/agent-tools/tools/bash.ts +154 -0
  723. package/src/agent-tools/tools/browser.ts +236 -0
  724. package/src/agent-tools/tools/edit.ts +100 -0
  725. package/src/agent-tools/tools/enterprise-calendar.ts +561 -0
  726. package/src/agent-tools/tools/enterprise-code-sandbox.ts +395 -0
  727. package/src/agent-tools/tools/enterprise-database.ts +377 -0
  728. package/src/agent-tools/tools/enterprise-diff.ts +580 -0
  729. package/src/agent-tools/tools/enterprise-documents.ts +896 -0
  730. package/src/agent-tools/tools/enterprise-finance.ts +484 -0
  731. package/src/agent-tools/tools/enterprise-http.ts +477 -0
  732. package/src/agent-tools/tools/enterprise-knowledge-search.ts +369 -0
  733. package/src/agent-tools/tools/enterprise-logs.ts +479 -0
  734. package/src/agent-tools/tools/enterprise-notifications.ts +532 -0
  735. package/src/agent-tools/tools/enterprise-security-scan.ts +528 -0
  736. package/src/agent-tools/tools/enterprise-spreadsheet.ts +825 -0
  737. package/src/agent-tools/tools/enterprise-translation.ts +530 -0
  738. package/src/agent-tools/tools/enterprise-vision.ts +348 -0
  739. package/src/agent-tools/tools/enterprise-web-research.ts +422 -0
  740. package/src/agent-tools/tools/enterprise-workflow.ts +308 -0
  741. package/src/agent-tools/tools/glob.ts +129 -0
  742. package/src/agent-tools/tools/grep.ts +178 -0
  743. package/src/agent-tools/tools/memory.ts +194 -0
  744. package/src/agent-tools/tools/read.ts +160 -0
  745. package/src/agent-tools/tools/web-fetch-utils.ts +202 -0
  746. package/src/agent-tools/tools/web-fetch.ts +456 -0
  747. package/src/agent-tools/tools/web-search.ts +480 -0
  748. package/src/agent-tools/tools/web-shared.ts +232 -0
  749. package/src/agent-tools/tools/write.ts +68 -0
  750. package/src/agent-tools/types.ts +193 -0
  751. package/src/auth/routes.ts +916 -51
  752. package/src/cli.ts +74 -14
  753. package/src/dashboard/app.js +246 -0
  754. package/src/dashboard/assets/logo.png +0 -0
  755. package/src/dashboard/components/error-boundary.js +21 -0
  756. package/src/dashboard/components/help-button.js +34 -0
  757. package/src/dashboard/components/icons.js +53 -0
  758. package/src/dashboard/components/modal.js +124 -0
  759. package/src/dashboard/components/persona-fields.js +271 -0
  760. package/src/dashboard/components/settings-help.js +191 -0
  761. package/src/dashboard/components/tag-input.js +96 -0
  762. package/src/dashboard/components/utils.js +148 -0
  763. package/src/dashboard/index.html +407 -874
  764. package/src/dashboard/pages/activity.js +62 -0
  765. package/src/dashboard/pages/agent-detail.js +3577 -0
  766. package/src/dashboard/pages/agents.js +1072 -0
  767. package/src/dashboard/pages/approvals.js +81 -0
  768. package/src/dashboard/pages/audit.js +133 -0
  769. package/src/dashboard/pages/community-skills.js +665 -0
  770. package/src/dashboard/pages/compliance.js +81 -0
  771. package/src/dashboard/pages/dashboard.js +150 -0
  772. package/src/dashboard/pages/dlp.js +107 -0
  773. package/src/dashboard/pages/domain-status.js +123 -0
  774. package/src/dashboard/pages/guardrails.js +995 -0
  775. package/src/dashboard/pages/journal.js +51 -0
  776. package/src/dashboard/pages/knowledge-contributions.js +763 -0
  777. package/src/dashboard/pages/knowledge.js +46 -0
  778. package/src/dashboard/pages/login.js +491 -0
  779. package/src/dashboard/pages/messages.js +274 -0
  780. package/src/dashboard/pages/settings.js +1554 -0
  781. package/src/dashboard/pages/skill-connections.js +452 -0
  782. package/src/dashboard/pages/skills.js +433 -0
  783. package/src/dashboard/pages/users.js +49 -0
  784. package/src/dashboard/pages/vault.js +538 -0
  785. package/src/dashboard/pages/workforce.js +569 -0
  786. package/src/dashboard/vendor/react-dom.production.min.js +267 -0
  787. package/src/dashboard/vendor/react.production.min.js +31 -0
  788. package/src/db/adapter.ts +134 -1
  789. package/src/db/dynamodb.ts +2 -2
  790. package/src/db/mongodb.ts +2 -2
  791. package/src/db/mysql.ts +55 -1
  792. package/src/db/postgres.ts +59 -1
  793. package/src/db/proxy.ts +39 -0
  794. package/src/db/sql-schema.ts +2 -1
  795. package/src/db/sqlite.ts +51 -3
  796. package/src/db/turso.ts +55 -1
  797. package/src/deploy/fly.ts +2 -2
  798. package/src/deploy/managed.ts +32 -11
  799. package/src/domain-lock/cli-recover.ts +124 -0
  800. package/src/domain-lock/cli-verify.ts +122 -0
  801. package/src/domain-lock/index.ts +220 -0
  802. package/src/engine/activity-routes.ts +116 -0
  803. package/src/engine/activity.ts +62 -2
  804. package/src/engine/agent-config.ts +190 -24
  805. package/src/engine/agent-memory.ts +1062 -0
  806. package/src/engine/agent-routes.ts +379 -0
  807. package/src/engine/approvals.ts +309 -2
  808. package/src/engine/catalog-routes.ts +155 -0
  809. package/src/engine/cli-build-skill.ts +285 -0
  810. package/src/engine/cli-submit-skill.ts +200 -0
  811. package/src/engine/cli-validate.ts +188 -0
  812. package/src/engine/communication-routes.ts +139 -0
  813. package/src/engine/communication.ts +759 -0
  814. package/src/engine/community-registry.ts +1509 -0
  815. package/src/engine/community-routes.ts +233 -0
  816. package/src/engine/compliance-routes.ts +93 -0
  817. package/src/engine/compliance.ts +325 -0
  818. package/src/engine/db-adapter.ts +349 -1
  819. package/src/engine/db-schema.ts +971 -23
  820. package/src/engine/deploy-schema-routes.ts +176 -0
  821. package/src/engine/deployer.ts +6 -6
  822. package/src/engine/dlp-routes.ts +59 -0
  823. package/src/engine/dlp.ts +231 -0
  824. package/src/engine/guardrail-routes.ts +125 -0
  825. package/src/engine/guardrails.ts +403 -0
  826. package/src/engine/index.ts +131 -10
  827. package/src/engine/journal-routes.ts +56 -0
  828. package/src/engine/journal.ts +249 -0
  829. package/src/engine/knowledge-contribution-routes.ts +385 -0
  830. package/src/engine/knowledge-contribution.ts +1319 -0
  831. package/src/engine/knowledge-routes.ts +68 -0
  832. package/src/engine/knowledge.ts +73 -1
  833. package/src/engine/lifecycle.ts +487 -31
  834. package/src/engine/memory-routes.ts +142 -0
  835. package/src/engine/oauth-connect-routes.ts +366 -0
  836. package/src/engine/oauth-connect.ts +304 -0
  837. package/src/engine/onboarding-routes.ts +140 -0
  838. package/src/engine/onboarding.ts +574 -0
  839. package/src/engine/org-approval-routes.ts +146 -0
  840. package/src/engine/org-policies.ts +497 -0
  841. package/src/engine/policy-import-routes.ts +125 -0
  842. package/src/engine/policy-import.ts +1186 -0
  843. package/src/engine/policy-routes.ts +163 -0
  844. package/src/engine/routes.ts +239 -482
  845. package/src/engine/skill-updater-routes.ts +132 -0
  846. package/src/engine/skill-updater.ts +480 -0
  847. package/src/engine/skill-validator.ts +331 -0
  848. package/src/engine/skills/enterprise-calendar.ts +142 -0
  849. package/src/engine/skills/enterprise-code-sandbox.ts +112 -0
  850. package/src/engine/skills/enterprise-database.ts +122 -0
  851. package/src/engine/skills/enterprise-diff.ts +94 -0
  852. package/src/engine/skills/enterprise-documents.ts +161 -0
  853. package/src/engine/skills/enterprise-finance.ts +109 -0
  854. package/src/engine/skills/enterprise-http.ts +98 -0
  855. package/src/engine/skills/enterprise-knowledge-search.ts +106 -0
  856. package/src/engine/skills/enterprise-logs.ts +115 -0
  857. package/src/engine/skills/enterprise-notifications.ts +119 -0
  858. package/src/engine/skills/enterprise-security-scan.ts +124 -0
  859. package/src/engine/skills/enterprise-spreadsheet.ts +170 -0
  860. package/src/engine/skills/enterprise-translation.ts +111 -0
  861. package/src/engine/skills/enterprise-vision.ts +107 -0
  862. package/src/engine/skills/enterprise-web-research.ts +114 -0
  863. package/src/engine/skills/enterprise-workflow.ts +109 -0
  864. package/src/engine/skills/gws-admin.ts +17 -0
  865. package/src/engine/skills/gws-calendar.ts +19 -0
  866. package/src/engine/skills/gws-chat.ts +16 -0
  867. package/src/engine/skills/gws-docs.ts +17 -0
  868. package/src/engine/skills/gws-drive.ts +20 -0
  869. package/src/engine/skills/gws-forms.ts +16 -0
  870. package/src/engine/skills/gws-gmail.ts +20 -0
  871. package/src/engine/skills/gws-groups.ts +16 -0
  872. package/src/engine/skills/gws-keep.ts +16 -0
  873. package/src/engine/skills/gws-meet.ts +16 -0
  874. package/src/engine/skills/gws-sheets.ts +18 -0
  875. package/src/engine/skills/gws-sites.ts +15 -0
  876. package/src/engine/skills/gws-slides.ts +16 -0
  877. package/src/engine/skills/gws-vault.ts +16 -0
  878. package/src/engine/skills/index.ts +121 -0
  879. package/src/engine/skills/m365-admin.ts +17 -0
  880. package/src/engine/skills/m365-bookings.ts +16 -0
  881. package/src/engine/skills/m365-copilot.ts +16 -0
  882. package/src/engine/skills/m365-excel.ts +59 -0
  883. package/src/engine/skills/m365-forms.ts +16 -0
  884. package/src/engine/skills/m365-onedrive.ts +59 -0
  885. package/src/engine/skills/m365-onenote.ts +16 -0
  886. package/src/engine/skills/m365-outlook.ts +26 -0
  887. package/src/engine/skills/m365-planner.ts +17 -0
  888. package/src/engine/skills/m365-power-automate.ts +17 -0
  889. package/src/engine/skills/m365-power-bi.ts +18 -0
  890. package/src/engine/skills/m365-powerpoint.ts +32 -0
  891. package/src/engine/skills/m365-sharepoint.ts +19 -0
  892. package/src/engine/skills/m365-teams.ts +20 -0
  893. package/src/engine/skills/m365-todo.ts +16 -0
  894. package/src/engine/skills/m365-whiteboard.ts +15 -0
  895. package/src/engine/skills/m365-word.ts +41 -0
  896. package/src/engine/skills.ts +353 -17
  897. package/src/engine/soul-library.ts +142 -0
  898. package/src/engine/soul-templates.json +1525 -0
  899. package/src/engine/storage-manager.ts +252 -0
  900. package/src/engine/storage-routes.ts +113 -0
  901. package/src/engine/storage.ts +528 -0
  902. package/src/engine/tenant.ts +69 -5
  903. package/src/engine/tool-catalog.ts +177 -13
  904. package/src/engine/vault-routes.ts +130 -0
  905. package/src/engine/vault.ts +544 -0
  906. package/src/engine/workforce-routes.ts +282 -0
  907. package/src/engine/workforce.ts +957 -0
  908. package/src/index.ts +9 -1
  909. package/src/lib/cidr.ts +122 -0
  910. package/src/lib/config-store.ts +86 -0
  911. package/src/mcp/adapters/activecampaign.adapter.ts +391 -0
  912. package/src/mcp/adapters/adobe-sign.adapter.ts +469 -0
  913. package/src/mcp/adapters/adp.adapter.ts +358 -0
  914. package/src/mcp/adapters/airtable.adapter.ts +273 -0
  915. package/src/mcp/adapters/apollo.adapter.ts +420 -0
  916. package/src/mcp/adapters/asana.adapter.ts +315 -0
  917. package/src/mcp/adapters/auth0.adapter.ts +386 -0
  918. package/src/mcp/adapters/aws.adapter.ts +345 -0
  919. package/src/mcp/adapters/azure-devops.adapter.ts +389 -0
  920. package/src/mcp/adapters/bamboohr.adapter.ts +376 -0
  921. package/src/mcp/adapters/basecamp.adapter.ts +366 -0
  922. package/src/mcp/adapters/bigcommerce.adapter.ts +429 -0
  923. package/src/mcp/adapters/bitbucket.adapter.ts +260 -0
  924. package/src/mcp/adapters/box.adapter.ts +350 -0
  925. package/src/mcp/adapters/brex.adapter.ts +367 -0
  926. package/src/mcp/adapters/buffer.adapter.ts +303 -0
  927. package/src/mcp/adapters/calendly.adapter.ts +262 -0
  928. package/src/mcp/adapters/canva.adapter.ts +256 -0
  929. package/src/mcp/adapters/chargebee.adapter.ts +448 -0
  930. package/src/mcp/adapters/circleci.adapter.ts +216 -0
  931. package/src/mcp/adapters/clickup.adapter.ts +335 -0
  932. package/src/mcp/adapters/close.adapter.ts +390 -0
  933. package/src/mcp/adapters/cloudflare.adapter.ts +377 -0
  934. package/src/mcp/adapters/confluence.adapter.ts +301 -0
  935. package/src/mcp/adapters/contentful.adapter.ts +355 -0
  936. package/src/mcp/adapters/copper.adapter.ts +468 -0
  937. package/src/mcp/adapters/crisp.adapter.ts +415 -0
  938. package/src/mcp/adapters/crowdstrike.adapter.ts +413 -0
  939. package/src/mcp/adapters/datadog.adapter.ts +373 -0
  940. package/src/mcp/adapters/digitalocean.adapter.ts +336 -0
  941. package/src/mcp/adapters/discord.adapter.ts +248 -0
  942. package/src/mcp/adapters/docker.adapter.ts +238 -0
  943. package/src/mcp/adapters/docusign.adapter.ts +431 -0
  944. package/src/mcp/adapters/drift.adapter.ts +386 -0
  945. package/src/mcp/adapters/dropbox.adapter.ts +315 -0
  946. package/src/mcp/adapters/figma.adapter.ts +302 -0
  947. package/src/mcp/adapters/firebase.adapter.ts +446 -0
  948. package/src/mcp/adapters/flyio.adapter.ts +302 -0
  949. package/src/mcp/adapters/freshbooks.adapter.ts +474 -0
  950. package/src/mcp/adapters/freshdesk.adapter.ts +441 -0
  951. package/src/mcp/adapters/freshsales.adapter.ts +457 -0
  952. package/src/mcp/adapters/freshservice.adapter.ts +481 -0
  953. package/src/mcp/adapters/front.adapter.ts +357 -0
  954. package/src/mcp/adapters/github-actions.adapter.ts +329 -0
  955. package/src/mcp/adapters/github.adapter.ts +387 -0
  956. package/src/mcp/adapters/gitlab.adapter.ts +368 -0
  957. package/src/mcp/adapters/gong.adapter.ts +386 -0
  958. package/src/mcp/adapters/google-ads.adapter.ts +363 -0
  959. package/src/mcp/adapters/google-analytics.adapter.ts +316 -0
  960. package/src/mcp/adapters/google-cloud.adapter.ts +312 -0
  961. package/src/mcp/adapters/google-drive.adapter.ts +387 -0
  962. package/src/mcp/adapters/gotomeeting.adapter.ts +255 -0
  963. package/src/mcp/adapters/grafana.adapter.ts +361 -0
  964. package/src/mcp/adapters/greenhouse.adapter.ts +354 -0
  965. package/src/mcp/adapters/gusto.adapter.ts +329 -0
  966. package/src/mcp/adapters/hashicorp-vault.adapter.ts +355 -0
  967. package/src/mcp/adapters/heroku.adapter.ts +291 -0
  968. package/src/mcp/adapters/hibob.adapter.ts +334 -0
  969. package/src/mcp/adapters/hootsuite.adapter.ts +322 -0
  970. package/src/mcp/adapters/hubspot.adapter.ts +400 -0
  971. package/src/mcp/adapters/huggingface.adapter.ts +349 -0
  972. package/src/mcp/adapters/index.ts +530 -0
  973. package/src/mcp/adapters/intercom.adapter.ts +269 -0
  974. package/src/mcp/adapters/jira.adapter.ts +482 -0
  975. package/src/mcp/adapters/klaviyo.adapter.ts +353 -0
  976. package/src/mcp/adapters/kubernetes.adapter.ts +431 -0
  977. package/src/mcp/adapters/lattice.adapter.ts +339 -0
  978. package/src/mcp/adapters/launchdarkly.adapter.ts +368 -0
  979. package/src/mcp/adapters/lever.adapter.ts +347 -0
  980. package/src/mcp/adapters/linear.adapter.ts +300 -0
  981. package/src/mcp/adapters/linkedin.adapter.ts +331 -0
  982. package/src/mcp/adapters/livechat.adapter.ts +259 -0
  983. package/src/mcp/adapters/loom.adapter.ts +230 -0
  984. package/src/mcp/adapters/mailchimp.adapter.ts +394 -0
  985. package/src/mcp/adapters/mailgun.adapter.ts +425 -0
  986. package/src/mcp/adapters/microsoft-teams.adapter.ts +251 -0
  987. package/src/mcp/adapters/miro.adapter.ts +274 -0
  988. package/src/mcp/adapters/mixpanel.adapter.ts +324 -0
  989. package/src/mcp/adapters/monday.adapter.ts +308 -0
  990. package/src/mcp/adapters/mongodb-atlas.adapter.ts +345 -0
  991. package/src/mcp/adapters/neon.adapter.ts +312 -0
  992. package/src/mcp/adapters/netlify.adapter.ts +324 -0
  993. package/src/mcp/adapters/netsuite.adapter.ts +411 -0
  994. package/src/mcp/adapters/newrelic.adapter.ts +339 -0
  995. package/src/mcp/adapters/notion.adapter.ts +338 -0
  996. package/src/mcp/adapters/okta.adapter.ts +394 -0
  997. package/src/mcp/adapters/openai.adapter.ts +315 -0
  998. package/src/mcp/adapters/opsgenie.adapter.ts +375 -0
  999. package/src/mcp/adapters/outreach.adapter.ts +372 -0
  1000. package/src/mcp/adapters/paddle.adapter.ts +467 -0
  1001. package/src/mcp/adapters/pagerduty.adapter.ts +412 -0
  1002. package/src/mcp/adapters/pandadoc.adapter.ts +389 -0
  1003. package/src/mcp/adapters/paypal.adapter.ts +465 -0
  1004. package/src/mcp/adapters/personio.adapter.ts +401 -0
  1005. package/src/mcp/adapters/pinecone.adapter.ts +340 -0
  1006. package/src/mcp/adapters/pipedrive.adapter.ts +324 -0
  1007. package/src/mcp/adapters/plaid.adapter.ts +444 -0
  1008. package/src/mcp/adapters/postmark.adapter.ts +387 -0
  1009. package/src/mcp/adapters/power-automate.adapter.ts +388 -0
  1010. package/src/mcp/adapters/quickbooks.adapter.ts +431 -0
  1011. package/src/mcp/adapters/recurly.adapter.ts +433 -0
  1012. package/src/mcp/adapters/reddit.adapter.ts +371 -0
  1013. package/src/mcp/adapters/render.adapter.ts +332 -0
  1014. package/src/mcp/adapters/ringcentral.adapter.ts +281 -0
  1015. package/src/mcp/adapters/rippling.adapter.ts +287 -0
  1016. package/src/mcp/adapters/salesforce.adapter.ts +321 -0
  1017. package/src/mcp/adapters/salesloft.adapter.ts +413 -0
  1018. package/src/mcp/adapters/sanity.adapter.ts +363 -0
  1019. package/src/mcp/adapters/sap.adapter.ts +483 -0
  1020. package/src/mcp/adapters/segment.adapter.ts +260 -0
  1021. package/src/mcp/adapters/sendgrid.adapter.ts +265 -0
  1022. package/src/mcp/adapters/sentry.adapter.ts +331 -0
  1023. package/src/mcp/adapters/servicenow.adapter.ts +468 -0
  1024. package/src/mcp/adapters/shopify.adapter.ts +451 -0
  1025. package/src/mcp/adapters/shortcut.adapter.ts +290 -0
  1026. package/src/mcp/adapters/slack.adapter.ts +380 -0
  1027. package/src/mcp/adapters/smartsheet.adapter.ts +326 -0
  1028. package/src/mcp/adapters/snowflake.adapter.ts +347 -0
  1029. package/src/mcp/adapters/snyk.adapter.ts +394 -0
  1030. package/src/mcp/adapters/splunk.adapter.ts +403 -0
  1031. package/src/mcp/adapters/square.adapter.ts +467 -0
  1032. package/src/mcp/adapters/statuspage.adapter.ts +401 -0
  1033. package/src/mcp/adapters/stripe.adapter.ts +380 -0
  1034. package/src/mcp/adapters/supabase.adapter.ts +334 -0
  1035. package/src/mcp/adapters/teamwork.adapter.ts +404 -0
  1036. package/src/mcp/adapters/telegram.adapter.ts +299 -0
  1037. package/src/mcp/adapters/terraform.adapter.ts +300 -0
  1038. package/src/mcp/adapters/todoist.adapter.ts +239 -0
  1039. package/src/mcp/adapters/trello.adapter.ts +316 -0
  1040. package/src/mcp/adapters/twilio.adapter.ts +233 -0
  1041. package/src/mcp/adapters/twitter.adapter.ts +348 -0
  1042. package/src/mcp/adapters/vercel.adapter.ts +219 -0
  1043. package/src/mcp/adapters/weaviate.adapter.ts +371 -0
  1044. package/src/mcp/adapters/webex.adapter.ts +237 -0
  1045. package/src/mcp/adapters/webflow.adapter.ts +287 -0
  1046. package/src/mcp/adapters/whatsapp.adapter.ts +273 -0
  1047. package/src/mcp/adapters/whereby.adapter.ts +240 -0
  1048. package/src/mcp/adapters/woocommerce.adapter.ts +454 -0
  1049. package/src/mcp/adapters/wordpress.adapter.ts +455 -0
  1050. package/src/mcp/adapters/workday.adapter.ts +354 -0
  1051. package/src/mcp/adapters/wrike.adapter.ts +349 -0
  1052. package/src/mcp/adapters/xero.adapter.ts +472 -0
  1053. package/src/mcp/adapters/youtube.adapter.ts +401 -0
  1054. package/src/mcp/adapters/zendesk.adapter.ts +399 -0
  1055. package/src/mcp/adapters/zoho-crm.adapter.ts +410 -0
  1056. package/src/mcp/adapters/zoom.adapter.ts +241 -0
  1057. package/src/mcp/adapters/zuora.adapter.ts +476 -0
  1058. package/src/mcp/framework/api-executor.ts +192 -0
  1059. package/src/mcp/framework/aws-sigv4.ts +216 -0
  1060. package/src/mcp/framework/credential-resolver.ts +128 -0
  1061. package/src/mcp/framework/skill-mcp-framework.ts +226 -0
  1062. package/src/mcp/framework/types.ts +130 -0
  1063. package/src/mcp/index.ts +124 -0
  1064. package/src/middleware/egress-filter.ts +81 -0
  1065. package/src/middleware/firewall.ts +121 -0
  1066. package/src/middleware/index.ts +33 -0
  1067. package/src/registry/cli.ts +63 -0
  1068. package/src/registry/server.ts +504 -0
  1069. package/src/runtime/agent-loop.ts +504 -0
  1070. package/src/runtime/email-channel.ts +120 -0
  1071. package/src/runtime/followup.ts +211 -0
  1072. package/src/runtime/gateway.ts +260 -0
  1073. package/src/runtime/hooks.ts +472 -0
  1074. package/src/runtime/index.ts +679 -0
  1075. package/src/runtime/llm-client.ts +1019 -0
  1076. package/src/runtime/providers.ts +231 -0
  1077. package/src/runtime/session-manager.ts +340 -0
  1078. package/src/runtime/subagent.ts +154 -0
  1079. package/src/runtime/tool-executor.ts +202 -0
  1080. package/src/runtime/types.ts +215 -0
  1081. package/src/server.ts +157 -45
  1082. package/src/setup/company.ts +127 -8
  1083. package/src/setup/database.ts +2 -1
  1084. package/src/setup/domain.ts +33 -4
  1085. package/src/setup/index.ts +19 -7
  1086. package/src/setup/provision.ts +128 -8
  1087. package/src/setup/registration.ts +227 -0
  1088. package/src/types/hono-env.ts +14 -0
  1089. package/src/types/optional-deps.d.ts +10 -0
  1090. package/start-live.mjs +12 -3
  1091. package/test-integration.mjs +628 -257
  1092. package/dist/chunk-77IDQJL3.js +0 -7
  1093. package/dist/chunk-BE7MXVLA.js +0 -757
  1094. package/dist/chunk-BS2WCSHO.js +0 -48
  1095. package/dist/chunk-FL3VQBGL.js +0 -757
  1096. package/dist/chunk-IQWA44WT.js +0 -970
  1097. package/dist/chunk-N2JVTNNJ.js +0 -2553
  1098. package/dist/chunk-YFDSE4BW.js +0 -1355
  1099. package/dist/db-adapter-DEWEFNIV.js +0 -7
  1100. package/dist/factory-V37IG5AT.js +0 -9
  1101. package/dist/routes-2JEPIIKC.js +0 -441
  1102. package/dist/server-32YYCI3A.js +0 -8
  1103. package/dist/server-H3C6WUOS.js +0 -8
  1104. package/dist/sqlite-3K5YOZ4K.js +0 -439
  1105. package/src/engine/agenticmail-bridge.ts +0 -296
  1106. package/src/engine/openclaw-hook.ts +0 -371
@@ -0,0 +1,1062 @@
1
+ /**
2
+ * Agent Memory Manager -- Persistent Memory & Learning System
3
+ *
4
+ * Provides growing, persistent memory for AI agents that evolves over time,
5
+ * similar to how human employees learn and adapt in an organization.
6
+ *
7
+ * Features:
8
+ * - Category-based memory organization (org_knowledge, interaction_pattern, preference, correction, skill, context, reflection)
9
+ * - Importance levels (critical, high, normal, low)
10
+ * - Confidence scores that decay over time for unaccessed entries
11
+ * - Access tracking for frequently used knowledge
12
+ * - Context generation for injection into agent prompts
13
+ * - Pruning of expired/low-confidence entries
14
+ */
15
+
16
+ import type { EngineDatabase } from './db-adapter.js';
17
+
18
+ // ─── Types ──────────────────────────────────────────────
19
+
20
+ export type MemoryCategory =
21
+ | 'org_knowledge'
22
+ | 'interaction_pattern'
23
+ | 'preference'
24
+ | 'correction'
25
+ | 'skill'
26
+ | 'context'
27
+ | 'reflection';
28
+
29
+ export type MemoryImportance = 'critical' | 'high' | 'normal' | 'low';
30
+
31
+ export type MemorySource =
32
+ | 'onboarding'
33
+ | 'interaction'
34
+ | 'admin'
35
+ | 'self_reflection'
36
+ | 'correction';
37
+
38
+ export const MEMORY_CATEGORIES: Record<MemoryCategory, { label: string; description: string }> = {
39
+ org_knowledge: {
40
+ label: 'Organization Knowledge',
41
+ description: 'Policies, procedures, and organizational information',
42
+ },
43
+ interaction_pattern: {
44
+ label: 'Interaction Patterns',
45
+ description: 'Learned patterns from past interactions',
46
+ },
47
+ preference: {
48
+ label: 'Preferences',
49
+ description: 'User and organizational preferences',
50
+ },
51
+ correction: {
52
+ label: 'Corrections',
53
+ description: 'Corrections and feedback received',
54
+ },
55
+ skill: {
56
+ label: 'Skills',
57
+ description: 'Learned abilities and competencies',
58
+ },
59
+ context: {
60
+ label: 'Context',
61
+ description: 'Contextual information and background knowledge',
62
+ },
63
+ reflection: {
64
+ label: 'Reflections',
65
+ description: 'Self-reflective insights and learnings',
66
+ },
67
+ };
68
+
69
+ export interface AgentMemoryEntry {
70
+ id: string;
71
+ agentId: string;
72
+ orgId: string;
73
+ category: MemoryCategory;
74
+ title: string;
75
+ content: string;
76
+ source: MemorySource;
77
+ importance: MemoryImportance;
78
+ confidence: number; // 0.0-1.0
79
+ accessCount: number;
80
+ lastAccessedAt?: string;
81
+ expiresAt?: string;
82
+ tags: string[];
83
+ metadata: Record<string, any>;
84
+ createdAt: string;
85
+ updatedAt: string;
86
+ }
87
+
88
+ export interface MemoryStats {
89
+ totalEntries: number;
90
+ byCategory: Record<string, number>;
91
+ byImportance: Record<string, number>;
92
+ bySource: Record<string, number>;
93
+ avgConfidence: number;
94
+ }
95
+
96
+ /** Input shape for createMemory — id, timestamps, and accessCount are generated automatically. */
97
+ export type CreateMemoryInput = Omit<AgentMemoryEntry, 'id' | 'createdAt' | 'updatedAt' | 'accessCount'>;
98
+
99
+ /** Input shape for updateMemory — partial updates merged with existing entry. */
100
+ export type UpdateMemoryInput = Partial<Omit<AgentMemoryEntry, 'id' | 'agentId' | 'orgId' | 'createdAt'>>;
101
+
102
+ /** Query options for filtering memory entries. */
103
+ export interface MemoryQueryOptions {
104
+ agentId: string;
105
+ category?: string;
106
+ importance?: string;
107
+ source?: string;
108
+ query?: string;
109
+ limit?: number;
110
+ }
111
+
112
+ /** Minimal policy shape expected by createFromPolicy (matches OrgPolicy fields used). */
113
+ export interface PolicyForMemory {
114
+ id: string;
115
+ orgId: string;
116
+ name: string;
117
+ category: string;
118
+ content: string;
119
+ enforcement: string;
120
+ }
121
+
122
+ // ─── Importance Weight Map ──────────────────────────────
123
+
124
+ const IMPORTANCE_WEIGHT: Record<MemoryImportance, number> = {
125
+ critical: 4,
126
+ high: 3,
127
+ normal: 2,
128
+ low: 1,
129
+ };
130
+
131
+ // ─── Full-Text Search Engine (BM25F + Stemming + Inverted Index) ─────
132
+ //
133
+ // Comprehensive text relevance scoring for agent memory retrieval.
134
+ // Zero dependencies — pure TypeScript implementation.
135
+ //
136
+ // Features:
137
+ // - Pre-built inverted index maintained incrementally (no re-indexing on query)
138
+ // - Lightweight Porter-style stemmer (suffix stripping for English)
139
+ // - Field weighting via BM25F: title ×3, tags ×2, content ×1
140
+ // - Pre-computed IDF values updated on index mutations
141
+ // - Prefix matching: "deploy" matches "deployment", "deployments"
142
+ // - Per-agent partitioning for scoped searches
143
+ // - Bigram proximity boost: terms appearing adjacent score higher
144
+
145
+ // ── BM25 Parameters ──
146
+
147
+ const BM25_K1 = 1.2; // Term frequency saturation
148
+ const BM25_B = 0.75; // Document length normalization
149
+ const FIELD_WEIGHT_TITLE = 3.0;
150
+ const FIELD_WEIGHT_TAGS = 2.0;
151
+ const FIELD_WEIGHT_CONTENT = 1.0;
152
+ const PREFIX_MATCH_PENALTY = 0.7; // Prefix matches score 70% of exact matches
153
+
154
+ // ── Stop Words ──
155
+
156
+ const STOP_WORDS = new Set([
157
+ 'a', 'about', 'above', 'after', 'again', 'against', 'all', 'am', 'an',
158
+ 'and', 'any', 'are', 'as', 'at', 'be', 'because', 'been', 'before',
159
+ 'being', 'below', 'between', 'both', 'but', 'by', 'can', 'could', 'did',
160
+ 'do', 'does', 'doing', 'down', 'during', 'each', 'either', 'every',
161
+ 'few', 'for', 'from', 'further', 'get', 'got', 'had', 'has', 'have',
162
+ 'having', 'he', 'her', 'here', 'hers', 'herself', 'him', 'himself',
163
+ 'his', 'how', 'i', 'if', 'in', 'into', 'is', 'it', 'its', 'itself',
164
+ 'just', 'may', 'me', 'might', 'more', 'most', 'must', 'my', 'myself',
165
+ 'neither', 'no', 'nor', 'not', 'now', 'of', 'off', 'on', 'once', 'only',
166
+ 'or', 'other', 'ought', 'our', 'ours', 'ourselves', 'out', 'over', 'own',
167
+ 'same', 'shall', 'she', 'should', 'so', 'some', 'such', 'than', 'that',
168
+ 'the', 'their', 'theirs', 'them', 'themselves', 'then', 'there', 'these',
169
+ 'they', 'this', 'those', 'through', 'to', 'too', 'under', 'until', 'up',
170
+ 'us', 'very', 'was', 'we', 'were', 'what', 'when', 'where', 'which',
171
+ 'while', 'who', 'whom', 'why', 'will', 'with', 'would', 'yet', 'you',
172
+ 'your', 'yours', 'yourself', 'yourselves',
173
+ ]);
174
+
175
+ // ── Porter Stemmer (lightweight suffix stripping) ──
176
+ // Handles common English suffixes to normalize "deployments" → "deploy",
177
+ // "running" → "run", "policies" → "polici", "configured" → "configur".
178
+ // Not a full Porter stemmer — covers the 80/20 of suffixes that matter most.
179
+
180
+ const STEM_RULES: [RegExp, string, number][] = [
181
+ // Step 1: plurals and past participles
182
+ [/ies$/, 'i', 3], // policies → polici,eries → eri
183
+ [/sses$/, 'ss', 4], // addresses → address
184
+ [/([^s])s$/, '$1', 3], // items → item, but not "ss"
185
+ [/eed$/, 'ee', 4], // agreed → agree
186
+ [/ed$/, '', 3], // configured → configur, but min length 3
187
+ [/ing$/, '', 4], // running → runn → run (handled below)
188
+ // Step 2: derivational suffixes
189
+ [/ational$/, 'ate', 6], // relational → relate
190
+ [/tion$/, 't', 5], // adoption → adopt
191
+ [/ness$/, '', 5], // awareness → aware
192
+ [/ment$/, '', 5], // deployment → deploy
193
+ [/able$/, '', 5], // configurable → configur
194
+ [/ible$/, '', 5], // accessible → access
195
+ [/ful$/, '', 5], // powerful → power
196
+ [/ous$/, '', 5], // dangerous → danger
197
+ [/ive$/, '', 5], // interactive → interact
198
+ [/ize$/, '', 4], // normalize → normal
199
+ [/ise$/, '', 4], // organise → organ
200
+ [/ally$/, '', 5], // automatically → automat
201
+ [/ly$/, '', 4], // quickly → quick
202
+ [/er$/, '', 4], // handler → handl
203
+ ];
204
+
205
+ /** Clean up common doubling artifacts after suffix stripping. */
206
+ const DOUBLE_CONSONANT = /([^aeiou])\1$/;
207
+
208
+ function stem(word: string): string {
209
+ if (word.length < 3) return word;
210
+ let stemmed = word;
211
+ for (const [pattern, replacement, minLen] of STEM_RULES) {
212
+ if (stemmed.length >= minLen && pattern.test(stemmed)) {
213
+ stemmed = stemmed.replace(pattern, replacement);
214
+ break; // Apply only the first matching rule
215
+ }
216
+ }
217
+ // Clean doubled consonants: runn → run, configurr → configur
218
+ if (stemmed.length > 2 && DOUBLE_CONSONANT.test(stemmed)) {
219
+ stemmed = stemmed.slice(0, -1);
220
+ }
221
+ return stemmed;
222
+ }
223
+
224
+ // ── Tokenizer ──
225
+
226
+ /** Tokenize text into stemmed, lowercase terms, filtering stop words. */
227
+ function tokenize(text: string): string[] {
228
+ return text.toLowerCase()
229
+ .split(/[^a-z0-9]+/)
230
+ .filter((t) => t.length > 1 && !STOP_WORDS.has(t))
231
+ .map(stem);
232
+ }
233
+
234
+ /** Tokenize preserving original (unstemmed) forms alongside stems. */
235
+ function tokenizeWithOriginals(text: string): { stem: string; original: string }[] {
236
+ return text.toLowerCase()
237
+ .split(/[^a-z0-9]+/)
238
+ .filter((t) => t.length > 1 && !STOP_WORDS.has(t))
239
+ .map((t) => ({ stem: stem(t), original: t }));
240
+ }
241
+
242
+ // ── Inverted Index Data Structures ──
243
+
244
+ interface DocRecord {
245
+ /** Weighted term frequencies across all fields: title (3x), tags (2x), content (1x) */
246
+ weightedTf: Map<string, number>;
247
+ /** Total weighted document length (for BM25 length normalization) */
248
+ weightedLen: number;
249
+ /** All unique stems in the document (for prefix matching) */
250
+ allStems: Set<string>;
251
+ /** Ordered list of stems for bigram proximity detection */
252
+ stemSequence: string[];
253
+ }
254
+
255
+ /**
256
+ * Pre-built inverted index for fast text search.
257
+ * Maintained incrementally — no re-indexing needed on queries.
258
+ *
259
+ * Structure:
260
+ * term → Set<docId> (posting list — which docs contain this term)
261
+ * prefixMap: prefix → Set<stem> (3-char prefixes → full stems for prefix matching)
262
+ * docs: docId → DocRecord (per-doc weighted TF and length)
263
+ * idf: term → number (pre-computed IDF, refreshed on mutations)
264
+ */
265
+ class MemorySearchIndex {
266
+ /** Posting lists: stemmed term → Set of memory IDs containing it */
267
+ private postings = new Map<string, Set<string>>();
268
+ /** Per-document metadata for BM25 scoring */
269
+ private docs = new Map<string, DocRecord>();
270
+ /** Pre-computed IDF values. Stale flag triggers lazy recomputation. */
271
+ private idf = new Map<string, number>();
272
+ private idfStale = true;
273
+ /** 3-character prefix map for prefix matching: prefix → Set of full stems */
274
+ private prefixMap = new Map<string, Set<string>>();
275
+ /** Total weighted document length (for computing average) */
276
+ private totalWeightedLen = 0;
277
+
278
+ get docCount(): number { return this.docs.size; }
279
+ get avgDocLen(): number { return this.docs.size > 0 ? this.totalWeightedLen / this.docs.size : 1; }
280
+
281
+ /**
282
+ * Index a memory entry. Extracts stems from title, content, and tags
283
+ * with field-specific weighting and builds posting lists.
284
+ */
285
+ addDocument(id: string, entry: { title: string; content: string; tags: string[] }): void {
286
+ // Remove old version if updating
287
+ if (this.docs.has(id)) this.removeDocument(id);
288
+
289
+ const titleTokens = tokenize(entry.title);
290
+ const contentTokens = tokenize(entry.content);
291
+ const tagTokens = entry.tags.flatMap((t) => tokenize(t));
292
+
293
+ // Build weighted term frequency map
294
+ const weightedTf = new Map<string, number>();
295
+ for (const t of titleTokens) weightedTf.set(t, (weightedTf.get(t) || 0) + FIELD_WEIGHT_TITLE);
296
+ for (const t of tagTokens) weightedTf.set(t, (weightedTf.get(t) || 0) + FIELD_WEIGHT_TAGS);
297
+ for (const t of contentTokens) weightedTf.set(t, (weightedTf.get(t) || 0) + FIELD_WEIGHT_CONTENT);
298
+
299
+ const weightedLen = titleTokens.length * FIELD_WEIGHT_TITLE
300
+ + tagTokens.length * FIELD_WEIGHT_TAGS
301
+ + contentTokens.length * FIELD_WEIGHT_CONTENT;
302
+
303
+ const allStems = new Set<string>();
304
+ for (const t of weightedTf.keys()) allStems.add(t);
305
+
306
+ // Stem sequence for bigram proximity (title first, then content — most important ordering)
307
+ const stemSequence = [...titleTokens, ...contentTokens];
308
+
309
+ const docRecord: DocRecord = { weightedTf, weightedLen, allStems, stemSequence };
310
+ this.docs.set(id, docRecord);
311
+ this.totalWeightedLen += weightedLen;
312
+
313
+ // Update posting lists
314
+ for (const term of allStems) {
315
+ let posting = this.postings.get(term);
316
+ if (!posting) { posting = new Set(); this.postings.set(term, posting); }
317
+ posting.add(id);
318
+
319
+ // Update prefix map (3-char prefixes for prefix matching)
320
+ if (term.length >= 3) {
321
+ const prefix = term.slice(0, 3);
322
+ let prefixSet = this.prefixMap.get(prefix);
323
+ if (!prefixSet) { prefixSet = new Set(); this.prefixMap.set(prefix, prefixSet); }
324
+ prefixSet.add(term);
325
+ }
326
+ }
327
+
328
+ this.idfStale = true;
329
+ }
330
+
331
+ /** Remove a document from the index. */
332
+ removeDocument(id: string): void {
333
+ const doc = this.docs.get(id);
334
+ if (!doc) return;
335
+
336
+ this.totalWeightedLen -= doc.weightedLen;
337
+ this.docs.delete(id);
338
+
339
+ // Remove from posting lists
340
+ for (const term of doc.allStems) {
341
+ const posting = this.postings.get(term);
342
+ if (posting) {
343
+ posting.delete(id);
344
+ if (posting.size === 0) {
345
+ this.postings.delete(term);
346
+ // Clean prefix map
347
+ if (term.length >= 3) {
348
+ const prefixSet = this.prefixMap.get(term.slice(0, 3));
349
+ if (prefixSet) { prefixSet.delete(term); if (prefixSet.size === 0) this.prefixMap.delete(term.slice(0, 3)); }
350
+ }
351
+ }
352
+ }
353
+ }
354
+
355
+ this.idfStale = true;
356
+ }
357
+
358
+ /** Recompute IDF values for all terms. Called lazily before search. */
359
+ private refreshIdf(): void {
360
+ if (!this.idfStale) return;
361
+ const N = this.docs.size;
362
+ this.idf.clear();
363
+ for (const [term, posting] of this.postings) {
364
+ const df = posting.size;
365
+ // BM25 IDF: log((N - df + 0.5) / (df + 0.5) + 1)
366
+ this.idf.set(term, Math.log((N - df + 0.5) / (df + 0.5) + 1));
367
+ }
368
+ this.idfStale = false;
369
+ }
370
+
371
+ /**
372
+ * Expand query terms with prefix matches.
373
+ * "deploy" → ["deploy", "deployment", "deploying", ...] (if they exist in the index)
374
+ */
375
+ private expandQueryTerms(queryStems: string[]): Map<string, number> {
376
+ const expanded = new Map<string, number>();
377
+
378
+ for (const qs of queryStems) {
379
+ // Exact match always gets full weight
380
+ if (this.postings.has(qs)) {
381
+ expanded.set(qs, Math.max(expanded.get(qs) || 0, 1.0));
382
+ }
383
+
384
+ // Prefix expansion: find all stems that start with the query stem (min 3 chars)
385
+ if (qs.length >= 3) {
386
+ const prefix = qs.slice(0, 3);
387
+ const candidates = this.prefixMap.get(prefix);
388
+ if (candidates) {
389
+ for (const candidate of candidates) {
390
+ if (candidate !== qs && candidate.startsWith(qs)) {
391
+ expanded.set(candidate, Math.max(expanded.get(candidate) || 0, PREFIX_MATCH_PENALTY));
392
+ }
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ return expanded;
399
+ }
400
+
401
+ /**
402
+ * Compute bigram proximity boost: if two query terms appear adjacent
403
+ * in the document's stem sequence, boost the score.
404
+ */
405
+ private bigramProximityBoost(docId: string, queryStems: string[]): number {
406
+ if (queryStems.length < 2) return 0;
407
+ const doc = this.docs.get(docId);
408
+ if (!doc || doc.stemSequence.length < 2) return 0;
409
+
410
+ let boost = 0;
411
+ const seq = doc.stemSequence;
412
+ const querySet = new Set(queryStems);
413
+
414
+ for (let i = 0; i < seq.length - 1; i++) {
415
+ if (querySet.has(seq[i]) && querySet.has(seq[i + 1]) && seq[i] !== seq[i + 1]) {
416
+ boost += 0.5; // Each adjacent pair of query terms adds 0.5
417
+ }
418
+ }
419
+
420
+ return Math.min(boost, 2.0); // Cap at 2.0 bonus
421
+ }
422
+
423
+ /**
424
+ * Search the index for documents matching a query.
425
+ * Returns scored results sorted by BM25F relevance.
426
+ *
427
+ * @param query - Raw query string
428
+ * @param candidateIds - Optional: only score these document IDs (for agent-scoped search)
429
+ * @returns Array of { id, score } sorted by descending score
430
+ */
431
+ search(query: string, candidateIds?: Set<string>): Array<{ id: string; score: number }> {
432
+ const queryStems = tokenize(query);
433
+ if (queryStems.length === 0) return [];
434
+
435
+ this.refreshIdf();
436
+
437
+ const expandedTerms = this.expandQueryTerms(queryStems);
438
+ if (expandedTerms.size === 0) return [];
439
+
440
+ const avgDl = this.avgDocLen;
441
+
442
+ // Collect candidate document IDs from posting lists
443
+ const candidates = new Set<string>();
444
+ for (const term of expandedTerms.keys()) {
445
+ const posting = this.postings.get(term);
446
+ if (posting) {
447
+ for (const docId of posting) {
448
+ if (!candidateIds || candidateIds.has(docId)) candidates.add(docId);
449
+ }
450
+ }
451
+ }
452
+
453
+ // Score each candidate
454
+ const results: Array<{ id: string; score: number }> = [];
455
+
456
+ for (const docId of candidates) {
457
+ const doc = this.docs.get(docId);
458
+ if (!doc) continue;
459
+
460
+ let score = 0;
461
+
462
+ for (const [term, weight] of expandedTerms) {
463
+ const tf = doc.weightedTf.get(term) || 0;
464
+ if (tf === 0) continue;
465
+ const termIdf = this.idf.get(term) || 0;
466
+
467
+ // BM25F: IDF × (weightedTF × (k1 + 1)) / (weightedTF + k1 × (1 - b + b × docLen/avgDocLen))
468
+ const numerator = tf * (BM25_K1 + 1);
469
+ const denominator = tf + BM25_K1 * (1 - BM25_B + BM25_B * (doc.weightedLen / avgDl));
470
+ score += termIdf * (numerator / denominator) * weight;
471
+ }
472
+
473
+ // Bigram proximity boost
474
+ score += this.bigramProximityBoost(docId, queryStems);
475
+
476
+ if (score > 0) results.push({ id: docId, score });
477
+ }
478
+
479
+ results.sort((a, b) => b.score - a.score);
480
+ return results;
481
+ }
482
+
483
+ /** Check if a document exists in the index. */
484
+ has(id: string): boolean { return this.docs.has(id); }
485
+ }
486
+
487
+ // ─── Agent Memory Manager ───────────────────────────────
488
+
489
+ export class AgentMemoryManager {
490
+ private memories = new Map<string, AgentMemoryEntry>();
491
+ /** Per-agent index: agentId → Set of memory IDs for O(1) agent lookups */
492
+ private agentIndex = new Map<string, Set<string>>();
493
+ /** Full-text search index (BM25F + stemming + inverted index) */
494
+ private searchIndex = new MemorySearchIndex();
495
+ private engineDb?: EngineDatabase;
496
+
497
+ // ─── Database Lifecycle ─────────────────────────────
498
+
499
+ async setDb(db: EngineDatabase): Promise<void> {
500
+ this.engineDb = db;
501
+ await this.loadFromDb();
502
+ }
503
+
504
+ private async loadFromDb(): Promise<void> {
505
+ if (!this.engineDb) return;
506
+ try {
507
+ const rows = await this.engineDb.query<any>('SELECT * FROM agent_memory');
508
+ for (const r of rows) {
509
+ const entry = this.rowToEntry(r);
510
+ this.memories.set(entry.id, entry);
511
+ this.indexAdd(entry.agentId, entry.id);
512
+ this.searchIndex.addDocument(entry.id, entry);
513
+ }
514
+ } catch {
515
+ /* table may not exist yet */
516
+ }
517
+ }
518
+
519
+ /** Add a memory ID to the per-agent index. */
520
+ private indexAdd(agentId: string, memoryId: string): void {
521
+ let set = this.agentIndex.get(agentId);
522
+ if (!set) { set = new Set(); this.agentIndex.set(agentId, set); }
523
+ set.add(memoryId);
524
+ }
525
+
526
+ /** Remove a memory ID from the per-agent index. */
527
+ private indexRemove(agentId: string, memoryId: string): void {
528
+ const set = this.agentIndex.get(agentId);
529
+ if (set) { set.delete(memoryId); if (set.size === 0) this.agentIndex.delete(agentId); }
530
+ }
531
+
532
+ /** Get all memory entries for an agent via the index — O(n) where n is that agent's entries, not total. */
533
+ private getAgentMemories(agentId: string): AgentMemoryEntry[] {
534
+ const ids = this.agentIndex.get(agentId);
535
+ if (!ids || ids.size === 0) return [];
536
+ const result: AgentMemoryEntry[] = [];
537
+ for (const id of ids) {
538
+ const entry = this.memories.get(id);
539
+ if (entry) result.push(entry);
540
+ }
541
+ return result;
542
+ }
543
+
544
+ // ─── CRUD Operations ────────────────────────────────
545
+
546
+ /**
547
+ * Creates a new memory entry with auto-generated id and timestamps.
548
+ * Persists to both the in-memory Map and the database.
549
+ */
550
+ async createMemory(input: CreateMemoryInput): Promise<AgentMemoryEntry> {
551
+ const now = new Date().toISOString();
552
+ const entry: AgentMemoryEntry = {
553
+ ...input,
554
+ id: crypto.randomUUID(),
555
+ accessCount: 0,
556
+ createdAt: now,
557
+ updatedAt: now,
558
+ };
559
+
560
+ this.memories.set(entry.id, entry);
561
+ this.indexAdd(entry.agentId, entry.id);
562
+ this.searchIndex.addDocument(entry.id, entry);
563
+
564
+ await this.engineDb?.execute(
565
+ `INSERT INTO agent_memory (id, agent_id, org_id, category, title, content, source, importance, confidence, access_count, last_accessed_at, expires_at, tags, metadata, created_at, updated_at)
566
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
567
+ [
568
+ entry.id, entry.agentId, entry.orgId, entry.category,
569
+ entry.title, entry.content, entry.source, entry.importance,
570
+ entry.confidence, entry.accessCount, entry.lastAccessedAt || null,
571
+ entry.expiresAt || null, JSON.stringify(entry.tags),
572
+ JSON.stringify(entry.metadata), entry.createdAt, entry.updatedAt,
573
+ ]
574
+ ).catch((err) => {
575
+ console.error('[agent-memory] Failed to persist memory entry:', err);
576
+ });
577
+
578
+ return entry;
579
+ }
580
+
581
+ /**
582
+ * Updates an existing memory entry by merging provided fields.
583
+ * Returns the updated entry or null if not found.
584
+ */
585
+ async updateMemory(id: string, updates: UpdateMemoryInput): Promise<AgentMemoryEntry | null> {
586
+ const existing = this.memories.get(id);
587
+ if (!existing) return null;
588
+
589
+ const now = new Date().toISOString();
590
+ const updated: AgentMemoryEntry = {
591
+ ...existing,
592
+ ...updates,
593
+ id: existing.id,
594
+ agentId: existing.agentId,
595
+ orgId: existing.orgId,
596
+ createdAt: existing.createdAt,
597
+ updatedAt: now,
598
+ };
599
+
600
+ this.memories.set(id, updated);
601
+
602
+ // Re-index if text fields changed
603
+ if (updates.title !== undefined || updates.content !== undefined || updates.tags !== undefined) {
604
+ this.searchIndex.addDocument(id, updated);
605
+ }
606
+
607
+ await this.engineDb?.execute(
608
+ `UPDATE agent_memory SET
609
+ category = ?, title = ?, content = ?, source = ?,
610
+ importance = ?, confidence = ?, access_count = ?,
611
+ last_accessed_at = ?, expires_at = ?, tags = ?,
612
+ metadata = ?, updated_at = ?
613
+ WHERE id = ?`,
614
+ [
615
+ updated.category, updated.title, updated.content, updated.source,
616
+ updated.importance, updated.confidence, updated.accessCount,
617
+ updated.lastAccessedAt || null, updated.expiresAt || null,
618
+ JSON.stringify(updated.tags), JSON.stringify(updated.metadata),
619
+ updated.updatedAt, id,
620
+ ]
621
+ ).catch((err) => {
622
+ console.error('[agent-memory] Failed to update memory entry:', err);
623
+ });
624
+
625
+ return updated;
626
+ }
627
+
628
+ /**
629
+ * Deletes a memory entry from both the in-memory Map and the database.
630
+ * Returns true if the entry existed and was deleted.
631
+ */
632
+ async deleteMemory(id: string): Promise<boolean> {
633
+ const entry = this.memories.get(id);
634
+ const existed = this.memories.delete(id);
635
+ if (entry) this.indexRemove(entry.agentId, id);
636
+ this.searchIndex.removeDocument(id);
637
+
638
+ await this.engineDb?.execute(
639
+ 'DELETE FROM agent_memory WHERE id = ?',
640
+ [id]
641
+ ).catch((err) => {
642
+ console.error('[agent-memory] Failed to delete memory entry:', err);
643
+ });
644
+
645
+ return existed;
646
+ }
647
+
648
+ /**
649
+ * Retrieves a single memory entry by id.
650
+ * Returns from the in-memory Map (async for interface compatibility).
651
+ */
652
+ async getMemory(id: string): Promise<AgentMemoryEntry | undefined> {
653
+ return this.memories.get(id);
654
+ }
655
+
656
+ // ─── Query Operations ───────────────────────────────
657
+
658
+ /**
659
+ * Queries memory entries for a specific agent with optional filters.
660
+ * Supports filtering by category, importance, source, and text search on title/content.
661
+ */
662
+ async queryMemories(opts: MemoryQueryOptions): Promise<AgentMemoryEntry[]> {
663
+ let results = this.getAgentMemories(opts.agentId);
664
+
665
+ if (opts.category) {
666
+ results = results.filter((m) => m.category === opts.category);
667
+ }
668
+
669
+ if (opts.importance) {
670
+ results = results.filter((m) => m.importance === opts.importance);
671
+ }
672
+
673
+ if (opts.source) {
674
+ results = results.filter((m) => m.source === opts.source);
675
+ }
676
+
677
+ if (opts.query) {
678
+ // Use the pre-built inverted index for BM25F search
679
+ const candidateIds = new Set(results.map((m) => m.id));
680
+ const searchResults = this.searchIndex.search(opts.query, candidateIds);
681
+
682
+ if (searchResults.length > 0) {
683
+ // Combine BM25F relevance with importance weight
684
+ const scored = searchResults
685
+ .map((r) => {
686
+ const entry = this.memories.get(r.id);
687
+ return entry ? { entry, score: r.score * IMPORTANCE_WEIGHT[entry.importance] } : null;
688
+ })
689
+ .filter((r): r is { entry: AgentMemoryEntry; score: number } => r !== null);
690
+
691
+ scored.sort((a, b) => b.score - a.score);
692
+ return scored.slice(0, opts.limit || 100).map((d) => d.entry);
693
+ }
694
+ }
695
+
696
+ // No query — sort by importance weight descending, then by creation date descending
697
+ results.sort((a, b) => {
698
+ const weightDiff = IMPORTANCE_WEIGHT[b.importance] - IMPORTANCE_WEIGHT[a.importance];
699
+ if (weightDiff !== 0) return weightDiff;
700
+ return new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime();
701
+ });
702
+
703
+ const limit = opts.limit || 100;
704
+ return results.slice(0, limit);
705
+ }
706
+
707
+ /**
708
+ * Returns memories created within the last N hours for an agent.
709
+ */
710
+ async getRecentMemories(agentId: string, hours: number = 24): Promise<AgentMemoryEntry[]> {
711
+ const cutoff = new Date(Date.now() - hours * 3600_000).toISOString();
712
+ return this.getAgentMemories(agentId)
713
+ .filter((m) => m.createdAt >= cutoff)
714
+ .sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());
715
+ }
716
+
717
+ // ─── Access Tracking ────────────────────────────────
718
+
719
+ /**
720
+ * Increments the access count and updates lastAccessedAt for a memory entry.
721
+ * Used to track frequently referenced knowledge.
722
+ */
723
+ async recordAccess(memoryId: string): Promise<void> {
724
+ const entry = this.memories.get(memoryId);
725
+ if (!entry) return;
726
+
727
+ const now = new Date().toISOString();
728
+ entry.accessCount += 1;
729
+ entry.lastAccessedAt = now;
730
+ entry.updatedAt = now;
731
+
732
+ await this.engineDb?.execute(
733
+ `UPDATE agent_memory SET access_count = ?, last_accessed_at = ?, updated_at = ? WHERE id = ?`,
734
+ [entry.accessCount, entry.lastAccessedAt, entry.updatedAt, memoryId]
735
+ ).catch((err) => {
736
+ console.error('[agent-memory] Failed to record access:', err);
737
+ });
738
+ }
739
+
740
+ // ─── Context Generation ─────────────────────────────
741
+
742
+ /**
743
+ * Generates a markdown context string suitable for injection into an agent's system prompt.
744
+ *
745
+ * Ranking strategy:
746
+ * 1. Critical importance entries always come first
747
+ * 2. Remaining entries scored by: confidence * accessWeight * recencyWeight
748
+ * 3. If a query is provided, entries matching query terms get a relevance boost
749
+ * 4. Output is grouped by category with markdown headers
750
+ * 5. Truncated to maxTokens (estimated at ~4 chars per token)
751
+ */
752
+ async generateMemoryContext(
753
+ agentId: string,
754
+ query?: string,
755
+ maxTokens: number = 1500,
756
+ ): Promise<string> {
757
+ const entries = this.getAgentMemories(agentId)
758
+ .filter((m) => m.confidence >= 0.1);
759
+
760
+ if (entries.length === 0) return '';
761
+
762
+ const now = Date.now();
763
+
764
+ // Pre-compute BM25F relevance scores via the inverted index if query provided
765
+ let relevanceMap: Map<string, number> | undefined;
766
+ if (query) {
767
+ const candidateIds = new Set(entries.map((e) => e.id));
768
+ const searchResults = this.searchIndex.search(query, candidateIds);
769
+ if (searchResults.length > 0) {
770
+ relevanceMap = new Map();
771
+ // Normalize scores: divide by max so top result = 1.0
772
+ const maxScore = searchResults[0].score;
773
+ for (const r of searchResults) {
774
+ relevanceMap.set(r.id, maxScore > 0 ? r.score / maxScore : 0);
775
+ }
776
+ }
777
+ }
778
+
779
+ // Score each entry for ranking: combines recency, access, confidence, importance, and BM25F relevance
780
+ const scored = entries.map((entry) => {
781
+ // Access weight: logarithmic scaling of access count
782
+ const accessWeight = 1 + Math.log1p(entry.accessCount) * 0.3;
783
+
784
+ // Recency weight: entries accessed/created more recently score higher
785
+ const lastTouch = entry.lastAccessedAt || entry.createdAt;
786
+ const ageHours = Math.max(1, (now - new Date(lastTouch).getTime()) / 3600_000);
787
+ const recencyWeight = 1 / (1 + Math.log1p(ageHours / 24) * 0.2);
788
+
789
+ // Base score from confidence, access weight, and recency
790
+ let score = entry.confidence * accessWeight * recencyWeight;
791
+
792
+ // Importance multiplier
793
+ score *= IMPORTANCE_WEIGHT[entry.importance];
794
+
795
+ // BM25F query relevance boost (from pre-built inverted index)
796
+ if (relevanceMap) {
797
+ const relevance = relevanceMap.get(entry.id) || 0;
798
+ if (relevance > 0) {
799
+ // Normalized relevance (0–1) → multiplier (1x–4x boost)
800
+ score *= 1 + relevance * 3;
801
+ }
802
+ }
803
+
804
+ return { entry, score };
805
+ });
806
+
807
+ // Sort by score descending
808
+ scored.sort((a, b) => b.score - a.score);
809
+
810
+ // Group by category preserving score order
811
+ const grouped = new Map<MemoryCategory, AgentMemoryEntry[]>();
812
+ for (const { entry } of scored) {
813
+ const group = grouped.get(entry.category) || [];
814
+ group.push(entry);
815
+ grouped.set(entry.category, group);
816
+ }
817
+
818
+ // Build markdown output
819
+ const maxChars = maxTokens * 4;
820
+ const lines: string[] = ['## Agent Memory', ''];
821
+ let charCount = lines.join('\n').length;
822
+
823
+ for (const [category, categoryEntries] of Array.from(grouped.entries())) {
824
+ const meta = MEMORY_CATEGORIES[category];
825
+ if (!meta) continue;
826
+
827
+ const header = `### ${meta.label}`;
828
+ if (charCount + header.length + 2 > maxChars) break;
829
+
830
+ lines.push(header);
831
+ lines.push('');
832
+ charCount += header.length + 2;
833
+
834
+ for (const entry of categoryEntries) {
835
+ const badge = entry.importance === 'critical' ? '[CRITICAL] '
836
+ : entry.importance === 'high' ? '[HIGH] '
837
+ : '';
838
+ const entryLine = `- **${badge}${entry.title}**: ${entry.content}`;
839
+
840
+ if (charCount + entryLine.length + 1 > maxChars) break;
841
+
842
+ lines.push(entryLine);
843
+ charCount += entryLine.length + 1;
844
+ }
845
+
846
+ lines.push('');
847
+ charCount += 1;
848
+ }
849
+
850
+ return lines.join('\n').trim();
851
+ }
852
+
853
+ // ─── Memory Lifecycle ───────────────────────────────
854
+
855
+ /**
856
+ * Decays confidence scores for entries that have not been accessed in 7+ days.
857
+ * Critical importance entries are exempt from decay.
858
+ *
859
+ * @param agentId - The agent whose memories to decay
860
+ * @param decayRate - How much to reduce confidence (default 0.05)
861
+ * @returns Number of entries that were decayed
862
+ */
863
+ async decayConfidence(agentId: string, decayRate: number = 0.05): Promise<number> {
864
+ const cutoff = new Date(Date.now() - 7 * 86_400_000).toISOString();
865
+ const now = new Date().toISOString();
866
+ const decayed: { id: string; confidence: number }[] = [];
867
+
868
+ for (const entry of this.getAgentMemories(agentId)) {
869
+ if (entry.importance === 'critical') continue;
870
+
871
+ const lastTouch = entry.lastAccessedAt || entry.createdAt;
872
+ if (lastTouch >= cutoff) continue;
873
+
874
+ const newConfidence = Math.max(0, entry.confidence - decayRate);
875
+ if (newConfidence === entry.confidence) continue;
876
+
877
+ entry.confidence = parseFloat(newConfidence.toFixed(4));
878
+ entry.updatedAt = now;
879
+ decayed.push({ id: entry.id, confidence: entry.confidence });
880
+ }
881
+
882
+ // Batch DB update — single statement per entry but without await-per-row overhead
883
+ if (decayed.length > 0 && this.engineDb) {
884
+ await Promise.all(
885
+ decayed.map((d) =>
886
+ this.engineDb!.execute(
887
+ 'UPDATE agent_memory SET confidence = ?, updated_at = ? WHERE id = ?',
888
+ [d.confidence, now, d.id]
889
+ ).catch((err) => console.error('[agent-memory] Failed to decay confidence:', err))
890
+ )
891
+ );
892
+ }
893
+
894
+ return decayed.length;
895
+ }
896
+
897
+ /**
898
+ * Prunes (deletes) memory entries that are expired or have very low confidence.
899
+ * An entry is pruned if:
900
+ * - confidence < 0.1, OR
901
+ * - expiresAt is set and has passed
902
+ *
903
+ * @param agentId - Optional: limit pruning to a specific agent. If omitted, prunes all.
904
+ * @returns Number of entries pruned
905
+ */
906
+ async pruneExpired(agentId?: string): Promise<number> {
907
+ const now = new Date().toISOString();
908
+ const toDelete: { id: string; agentId: string }[] = [];
909
+
910
+ const entries = agentId
911
+ ? this.getAgentMemories(agentId)
912
+ : Array.from(this.memories.values());
913
+
914
+ for (const entry of entries) {
915
+ const isLowConfidence = entry.confidence < 0.1;
916
+ const isExpired = entry.expiresAt && entry.expiresAt <= now;
917
+
918
+ if (isLowConfidence || isExpired) {
919
+ toDelete.push({ id: entry.id, agentId: entry.agentId });
920
+ }
921
+ }
922
+
923
+ // Delete from Map + agent index + search index
924
+ for (const item of toDelete) {
925
+ this.memories.delete(item.id);
926
+ this.indexRemove(item.agentId, item.id);
927
+ this.searchIndex.removeDocument(item.id);
928
+ }
929
+
930
+ // Batch DB deletes
931
+ if (toDelete.length > 0 && this.engineDb) {
932
+ await Promise.all(
933
+ toDelete.map((item) =>
934
+ this.engineDb!.execute('DELETE FROM agent_memory WHERE id = ?', [item.id])
935
+ .catch((err) => console.error('[agent-memory] Failed to prune memory entry:', err))
936
+ )
937
+ );
938
+ }
939
+
940
+ return toDelete.length;
941
+ }
942
+
943
+ // ─── Statistics ─────────────────────────────────────
944
+
945
+ /**
946
+ * Returns aggregate statistics for a specific agent's memory entries.
947
+ */
948
+ async getStats(agentId: string): Promise<MemoryStats> {
949
+ return this.computeStats(this.getAgentMemories(agentId));
950
+ }
951
+
952
+ /**
953
+ * Returns per-agent memory statistics for all agents in an organization.
954
+ */
955
+ async getStatsByOrg(orgId: string): Promise<Array<{ agentId: string; stats: MemoryStats }>> {
956
+ // Group entries by agentId for the given org
957
+ const agentMap = new Map<string, AgentMemoryEntry[]>();
958
+
959
+ for (const entry of this.memories.values()) {
960
+ if (entry.orgId !== orgId) continue;
961
+ const group = agentMap.get(entry.agentId) || [];
962
+ group.push(entry);
963
+ agentMap.set(entry.agentId, group);
964
+ }
965
+
966
+ const results: Array<{ agentId: string; stats: MemoryStats }> = [];
967
+ for (const [agentId, entries] of Array.from(agentMap.entries())) {
968
+ results.push({ agentId, stats: this.computeStats(entries) });
969
+ }
970
+
971
+ return results;
972
+ }
973
+
974
+ /**
975
+ * Computes statistics from a set of memory entries.
976
+ */
977
+ private computeStats(entries: AgentMemoryEntry[]): MemoryStats {
978
+ const byCategory: Record<string, number> = {};
979
+ const byImportance: Record<string, number> = {};
980
+ const bySource: Record<string, number> = {};
981
+ let totalConfidence = 0;
982
+
983
+ for (const entry of entries) {
984
+ byCategory[entry.category] = (byCategory[entry.category] || 0) + 1;
985
+ byImportance[entry.importance] = (byImportance[entry.importance] || 0) + 1;
986
+ bySource[entry.source] = (bySource[entry.source] || 0) + 1;
987
+ totalConfidence += entry.confidence;
988
+ }
989
+
990
+ return {
991
+ totalEntries: entries.length,
992
+ byCategory,
993
+ byImportance,
994
+ bySource,
995
+ avgConfidence: entries.length > 0
996
+ ? parseFloat((totalConfidence / entries.length).toFixed(4))
997
+ : 0,
998
+ };
999
+ }
1000
+
1001
+ // ─── Policy Integration ─────────────────────────────
1002
+
1003
+ /**
1004
+ * Creates a memory entry from an organization policy.
1005
+ * Used during onboarding to seed agent memory with policy knowledge.
1006
+ *
1007
+ * Importance is derived from policy enforcement level:
1008
+ * - mandatory -> critical
1009
+ * - recommended -> high
1010
+ * - informational / other -> normal
1011
+ */
1012
+ async createFromPolicy(agentId: string, policy: PolicyForMemory): Promise<AgentMemoryEntry> {
1013
+ const importance: MemoryImportance =
1014
+ policy.enforcement === 'mandatory' ? 'critical'
1015
+ : policy.enforcement === 'recommended' ? 'high'
1016
+ : 'normal';
1017
+
1018
+ return this.createMemory({
1019
+ agentId,
1020
+ orgId: policy.orgId,
1021
+ category: 'org_knowledge',
1022
+ title: policy.name,
1023
+ content: policy.content,
1024
+ source: 'onboarding',
1025
+ importance,
1026
+ confidence: 1.0,
1027
+ lastAccessedAt: undefined,
1028
+ expiresAt: undefined,
1029
+ tags: ['policy', policy.category],
1030
+ metadata: {
1031
+ policyId: policy.id,
1032
+ enforcement: policy.enforcement,
1033
+ },
1034
+ });
1035
+ }
1036
+
1037
+ // ─── Row Mapper ─────────────────────────────────────
1038
+
1039
+ /**
1040
+ * Converts a database row into an AgentMemoryEntry.
1041
+ */
1042
+ private rowToEntry(row: any): AgentMemoryEntry {
1043
+ return {
1044
+ id: row.id,
1045
+ agentId: row.agent_id,
1046
+ orgId: row.org_id,
1047
+ category: row.category as MemoryCategory,
1048
+ title: row.title,
1049
+ content: row.content,
1050
+ source: row.source as MemorySource,
1051
+ importance: row.importance as MemoryImportance,
1052
+ confidence: row.confidence,
1053
+ accessCount: row.access_count || 0,
1054
+ lastAccessedAt: row.last_accessed_at || undefined,
1055
+ expiresAt: row.expires_at || undefined,
1056
+ tags: JSON.parse(row.tags || '[]'),
1057
+ metadata: JSON.parse(row.metadata || '{}'),
1058
+ createdAt: row.created_at,
1059
+ updatedAt: row.updated_at,
1060
+ };
1061
+ }
1062
+ }