@wickdninja/sweny-providers 0.1.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 (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +259 -0
  3. package/dist/access/allow-all.d.ts +3 -0
  4. package/dist/access/allow-all.d.ts.map +1 -0
  5. package/dist/access/allow-all.js +19 -0
  6. package/dist/access/allow-all.js.map +1 -0
  7. package/dist/access/index.d.ts +5 -0
  8. package/dist/access/index.d.ts.map +1 -0
  9. package/dist/access/index.js +4 -0
  10. package/dist/access/index.js.map +1 -0
  11. package/dist/access/role-based.d.ts +8 -0
  12. package/dist/access/role-based.d.ts.map +1 -0
  13. package/dist/access/role-based.js +42 -0
  14. package/dist/access/role-based.js.map +1 -0
  15. package/dist/access/types.d.ts +41 -0
  16. package/dist/access/types.d.ts.map +1 -0
  17. package/dist/access/types.js +20 -0
  18. package/dist/access/types.js.map +1 -0
  19. package/dist/agent-tool/factory.d.ts +4 -0
  20. package/dist/agent-tool/factory.d.ts.map +1 -0
  21. package/dist/agent-tool/factory.js +4 -0
  22. package/dist/agent-tool/factory.js.map +1 -0
  23. package/dist/agent-tool/index.d.ts +3 -0
  24. package/dist/agent-tool/index.d.ts.map +1 -0
  25. package/dist/agent-tool/index.js +2 -0
  26. package/dist/agent-tool/index.js.map +1 -0
  27. package/dist/agent-tool/types.d.ts +15 -0
  28. package/dist/agent-tool/types.d.ts.map +1 -0
  29. package/dist/agent-tool/types.js +2 -0
  30. package/dist/agent-tool/types.js.map +1 -0
  31. package/dist/auth/api-key.d.ts +6 -0
  32. package/dist/auth/api-key.d.ts.map +1 -0
  33. package/dist/auth/api-key.js +36 -0
  34. package/dist/auth/api-key.js.map +1 -0
  35. package/dist/auth/index.d.ts +4 -0
  36. package/dist/auth/index.d.ts.map +1 -0
  37. package/dist/auth/index.js +3 -0
  38. package/dist/auth/index.js.map +1 -0
  39. package/dist/auth/no-auth.d.ts +3 -0
  40. package/dist/auth/no-auth.d.ts.map +1 -0
  41. package/dist/auth/no-auth.js +21 -0
  42. package/dist/auth/no-auth.js.map +1 -0
  43. package/dist/auth/types.d.ts +58 -0
  44. package/dist/auth/types.d.ts.map +1 -0
  45. package/dist/auth/types.js +2 -0
  46. package/dist/auth/types.js.map +1 -0
  47. package/dist/coding-agent/claude-code.d.ts +8 -0
  48. package/dist/coding-agent/claude-code.d.ts.map +1 -0
  49. package/dist/coding-agent/claude-code.js +37 -0
  50. package/dist/coding-agent/claude-code.js.map +1 -0
  51. package/dist/coding-agent/index.d.ts +4 -0
  52. package/dist/coding-agent/index.d.ts.map +1 -0
  53. package/dist/coding-agent/index.js +2 -0
  54. package/dist/coding-agent/index.js.map +1 -0
  55. package/dist/coding-agent/types.d.ts +10 -0
  56. package/dist/coding-agent/types.d.ts.map +1 -0
  57. package/dist/coding-agent/types.js +2 -0
  58. package/dist/coding-agent/types.js.map +1 -0
  59. package/dist/credential-vault/aws-secrets-manager.d.ts +19 -0
  60. package/dist/credential-vault/aws-secrets-manager.d.ts.map +1 -0
  61. package/dist/credential-vault/aws-secrets-manager.js +96 -0
  62. package/dist/credential-vault/aws-secrets-manager.js.map +1 -0
  63. package/dist/credential-vault/env-vault.d.ts +15 -0
  64. package/dist/credential-vault/env-vault.d.ts.map +1 -0
  65. package/dist/credential-vault/env-vault.js +25 -0
  66. package/dist/credential-vault/env-vault.js.map +1 -0
  67. package/dist/credential-vault/index.d.ts +6 -0
  68. package/dist/credential-vault/index.d.ts.map +1 -0
  69. package/dist/credential-vault/index.js +3 -0
  70. package/dist/credential-vault/index.js.map +1 -0
  71. package/dist/credential-vault/types.d.ts +30 -0
  72. package/dist/credential-vault/types.d.ts.map +1 -0
  73. package/dist/credential-vault/types.js +2 -0
  74. package/dist/credential-vault/types.js.map +1 -0
  75. package/dist/errors.d.ts +18 -0
  76. package/dist/errors.d.ts.map +1 -0
  77. package/dist/errors.js +35 -0
  78. package/dist/errors.js.map +1 -0
  79. package/dist/incident/index.d.ts +4 -0
  80. package/dist/incident/index.d.ts.map +1 -0
  81. package/dist/incident/index.js +3 -0
  82. package/dist/incident/index.js.map +1 -0
  83. package/dist/incident/opsgenie.d.ts +19 -0
  84. package/dist/incident/opsgenie.d.ts.map +1 -0
  85. package/dist/incident/opsgenie.js +102 -0
  86. package/dist/incident/opsgenie.js.map +1 -0
  87. package/dist/incident/pagerduty.d.ts +19 -0
  88. package/dist/incident/pagerduty.d.ts.map +1 -0
  89. package/dist/incident/pagerduty.js +112 -0
  90. package/dist/incident/pagerduty.js.map +1 -0
  91. package/dist/incident/types.d.ts +67 -0
  92. package/dist/incident/types.d.ts.map +1 -0
  93. package/dist/incident/types.js +2 -0
  94. package/dist/incident/types.js.map +1 -0
  95. package/dist/index.d.ts +28 -0
  96. package/dist/index.d.ts.map +1 -0
  97. package/dist/index.js +16 -0
  98. package/dist/index.js.map +1 -0
  99. package/dist/issue-tracking/github-issues.d.ts +22 -0
  100. package/dist/issue-tracking/github-issues.d.ts.map +1 -0
  101. package/dist/issue-tracking/github-issues.js +134 -0
  102. package/dist/issue-tracking/github-issues.js.map +1 -0
  103. package/dist/issue-tracking/index.d.ts +6 -0
  104. package/dist/issue-tracking/index.d.ts.map +1 -0
  105. package/dist/issue-tracking/index.js +5 -0
  106. package/dist/issue-tracking/index.js.map +1 -0
  107. package/dist/issue-tracking/jira.d.ts +22 -0
  108. package/dist/issue-tracking/jira.d.ts.map +1 -0
  109. package/dist/issue-tracking/jira.js +224 -0
  110. package/dist/issue-tracking/jira.js.map +1 -0
  111. package/dist/issue-tracking/linear.d.ts +16 -0
  112. package/dist/issue-tracking/linear.d.ts.map +1 -0
  113. package/dist/issue-tracking/linear.js +309 -0
  114. package/dist/issue-tracking/linear.js.map +1 -0
  115. package/dist/issue-tracking/types.d.ts +163 -0
  116. package/dist/issue-tracking/types.d.ts.map +1 -0
  117. package/dist/issue-tracking/types.js +28 -0
  118. package/dist/issue-tracking/types.js.map +1 -0
  119. package/dist/logger.d.ts +8 -0
  120. package/dist/logger.d.ts.map +1 -0
  121. package/dist/logger.js +7 -0
  122. package/dist/logger.js.map +1 -0
  123. package/dist/messaging/index.d.ts +6 -0
  124. package/dist/messaging/index.d.ts.map +1 -0
  125. package/dist/messaging/index.js +3 -0
  126. package/dist/messaging/index.js.map +1 -0
  127. package/dist/messaging/slack.d.ts +8 -0
  128. package/dist/messaging/slack.d.ts.map +1 -0
  129. package/dist/messaging/slack.js +35 -0
  130. package/dist/messaging/slack.js.map +1 -0
  131. package/dist/messaging/teams.d.ts +22 -0
  132. package/dist/messaging/teams.d.ts.map +1 -0
  133. package/dist/messaging/teams.js +124 -0
  134. package/dist/messaging/teams.js.map +1 -0
  135. package/dist/messaging/types.d.ts +30 -0
  136. package/dist/messaging/types.d.ts.map +1 -0
  137. package/dist/messaging/types.js +2 -0
  138. package/dist/messaging/types.js.map +1 -0
  139. package/dist/notification/discord-webhook.d.ts +16 -0
  140. package/dist/notification/discord-webhook.d.ts.map +1 -0
  141. package/dist/notification/discord-webhook.js +33 -0
  142. package/dist/notification/discord-webhook.js.map +1 -0
  143. package/dist/notification/email.d.ts +22 -0
  144. package/dist/notification/email.d.ts.map +1 -0
  145. package/dist/notification/email.js +54 -0
  146. package/dist/notification/email.js.map +1 -0
  147. package/dist/notification/github-summary.d.ts +13 -0
  148. package/dist/notification/github-summary.d.ts.map +1 -0
  149. package/dist/notification/github-summary.js +25 -0
  150. package/dist/notification/github-summary.js.map +1 -0
  151. package/dist/notification/index.d.ts +8 -0
  152. package/dist/notification/index.d.ts.map +1 -0
  153. package/dist/notification/index.js +7 -0
  154. package/dist/notification/index.js.map +1 -0
  155. package/dist/notification/slack-webhook.d.ts +16 -0
  156. package/dist/notification/slack-webhook.d.ts.map +1 -0
  157. package/dist/notification/slack-webhook.js +31 -0
  158. package/dist/notification/slack-webhook.js.map +1 -0
  159. package/dist/notification/teams-webhook.d.ts +16 -0
  160. package/dist/notification/teams-webhook.d.ts.map +1 -0
  161. package/dist/notification/teams-webhook.js +60 -0
  162. package/dist/notification/teams-webhook.js.map +1 -0
  163. package/dist/notification/types.d.ts +18 -0
  164. package/dist/notification/types.d.ts.map +1 -0
  165. package/dist/notification/types.js +2 -0
  166. package/dist/notification/types.js.map +1 -0
  167. package/dist/notification/webhook.d.ts +28 -0
  168. package/dist/notification/webhook.d.ts.map +1 -0
  169. package/dist/notification/webhook.js +59 -0
  170. package/dist/notification/webhook.js.map +1 -0
  171. package/dist/observability/cloudwatch.d.ts +19 -0
  172. package/dist/observability/cloudwatch.d.ts.map +1 -0
  173. package/dist/observability/cloudwatch.js +181 -0
  174. package/dist/observability/cloudwatch.js.map +1 -0
  175. package/dist/observability/datadog.d.ts +22 -0
  176. package/dist/observability/datadog.d.ts.map +1 -0
  177. package/dist/observability/datadog.js +137 -0
  178. package/dist/observability/datadog.js.map +1 -0
  179. package/dist/observability/elastic.d.ts +42 -0
  180. package/dist/observability/elastic.d.ts.map +1 -0
  181. package/dist/observability/elastic.js +239 -0
  182. package/dist/observability/elastic.js.map +1 -0
  183. package/dist/observability/index.d.ts +9 -0
  184. package/dist/observability/index.d.ts.map +1 -0
  185. package/dist/observability/index.js +8 -0
  186. package/dist/observability/index.js.map +1 -0
  187. package/dist/observability/loki.d.ts +22 -0
  188. package/dist/observability/loki.d.ts.map +1 -0
  189. package/dist/observability/loki.js +203 -0
  190. package/dist/observability/loki.js.map +1 -0
  191. package/dist/observability/newrelic.d.ts +22 -0
  192. package/dist/observability/newrelic.d.ts.map +1 -0
  193. package/dist/observability/newrelic.js +145 -0
  194. package/dist/observability/newrelic.js.map +1 -0
  195. package/dist/observability/sentry.d.ts +25 -0
  196. package/dist/observability/sentry.d.ts.map +1 -0
  197. package/dist/observability/sentry.js +149 -0
  198. package/dist/observability/sentry.js.map +1 -0
  199. package/dist/observability/splunk.d.ts +22 -0
  200. package/dist/observability/splunk.d.ts.map +1 -0
  201. package/dist/observability/splunk.js +176 -0
  202. package/dist/observability/splunk.js.map +1 -0
  203. package/dist/observability/types.d.ts +54 -0
  204. package/dist/observability/types.d.ts.map +1 -0
  205. package/dist/observability/types.js +2 -0
  206. package/dist/observability/types.js.map +1 -0
  207. package/dist/source-control/github.d.ts +11 -0
  208. package/dist/source-control/github.d.ts.map +1 -0
  209. package/dist/source-control/github.js +161 -0
  210. package/dist/source-control/github.js.map +1 -0
  211. package/dist/source-control/gitlab.d.ts +25 -0
  212. package/dist/source-control/gitlab.d.ts.map +1 -0
  213. package/dist/source-control/gitlab.js +223 -0
  214. package/dist/source-control/gitlab.js.map +1 -0
  215. package/dist/source-control/index.d.ts +6 -0
  216. package/dist/source-control/index.d.ts.map +1 -0
  217. package/dist/source-control/index.js +3 -0
  218. package/dist/source-control/index.js.map +1 -0
  219. package/dist/source-control/types.d.ts +115 -0
  220. package/dist/source-control/types.d.ts.map +1 -0
  221. package/dist/source-control/types.js +2 -0
  222. package/dist/source-control/types.js.map +1 -0
  223. package/dist/storage/csi.d.ts +36 -0
  224. package/dist/storage/csi.d.ts.map +1 -0
  225. package/dist/storage/csi.js +39 -0
  226. package/dist/storage/csi.js.map +1 -0
  227. package/dist/storage/fs.d.ts +5 -0
  228. package/dist/storage/fs.d.ts.map +1 -0
  229. package/dist/storage/fs.js +11 -0
  230. package/dist/storage/fs.js.map +1 -0
  231. package/dist/storage/index.d.ts +13 -0
  232. package/dist/storage/index.d.ts.map +1 -0
  233. package/dist/storage/index.js +14 -0
  234. package/dist/storage/index.js.map +1 -0
  235. package/dist/storage/memory/fs.d.ts +15 -0
  236. package/dist/storage/memory/fs.d.ts.map +1 -0
  237. package/dist/storage/memory/fs.js +65 -0
  238. package/dist/storage/memory/fs.js.map +1 -0
  239. package/dist/storage/memory/s3.d.ts +17 -0
  240. package/dist/storage/memory/s3.d.ts.map +1 -0
  241. package/dist/storage/memory/s3.js +77 -0
  242. package/dist/storage/memory/s3.js.map +1 -0
  243. package/dist/storage/s3.d.ts +7 -0
  244. package/dist/storage/s3.d.ts.map +1 -0
  245. package/dist/storage/s3.js +12 -0
  246. package/dist/storage/s3.js.map +1 -0
  247. package/dist/storage/session/fs.d.ts +16 -0
  248. package/dist/storage/session/fs.d.ts.map +1 -0
  249. package/dist/storage/session/fs.js +81 -0
  250. package/dist/storage/session/fs.js.map +1 -0
  251. package/dist/storage/session/s3.d.ts +18 -0
  252. package/dist/storage/session/s3.d.ts.map +1 -0
  253. package/dist/storage/session/s3.js +121 -0
  254. package/dist/storage/session/s3.js.map +1 -0
  255. package/dist/storage/types.d.ts +206 -0
  256. package/dist/storage/types.d.ts.map +1 -0
  257. package/dist/storage/types.js +10 -0
  258. package/dist/storage/types.js.map +1 -0
  259. package/dist/storage/workspace/fs.d.ts +18 -0
  260. package/dist/storage/workspace/fs.d.ts.map +1 -0
  261. package/dist/storage/workspace/fs.js +153 -0
  262. package/dist/storage/workspace/fs.js.map +1 -0
  263. package/dist/storage/workspace/s3.d.ts +20 -0
  264. package/dist/storage/workspace/s3.d.ts.map +1 -0
  265. package/dist/storage/workspace/s3.js +180 -0
  266. package/dist/storage/workspace/s3.js.map +1 -0
  267. package/package.json +134 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 SWEny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,259 @@
1
+ # @swenyai/providers
2
+
3
+ Shared provider interfaces and implementations for [SWEny](https://sweny.ai) — pluggable integrations for the `@swenyai/engine` workflow runner.
4
+
5
+ Providers map to the three workflow phases:
6
+
7
+ - **Learn** — Observability providers query logs and metrics from your production systems
8
+ - **Act** — Issue tracking, source control, incident management, and coding agent providers take action based on AI analysis
9
+ - **Report** — Notification and messaging providers deliver results through your team's channels
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install @swenyai/providers
15
+ ```
16
+
17
+ ## Providers
18
+
19
+ ### Observability (7 providers)
20
+
21
+ | Provider | Factory | Config |
22
+ |----------|---------|--------|
23
+ | Datadog | `datadog()` | `apiKey`, `appKey`, `site` |
24
+ | Sentry | `sentry()` | `authToken`, `organization`, `project` |
25
+ | CloudWatch | `cloudwatch()` | `region`, `logGroupPrefix` |
26
+ | Splunk | `splunk()` | `baseUrl`, `token`, `index` |
27
+ | Elasticsearch | `elastic()` | `baseUrl`, `apiKey` or `username`/`password`, `index` |
28
+ | Grafana Loki | `loki()` | `baseUrl`, `apiKey`, `orgId` |
29
+ | New Relic | `newrelic()` | `apiKey`, `accountId`, `region` |
30
+
31
+ ```typescript
32
+ import { datadog, splunk, loki } from "@swenyai/providers/observability";
33
+ ```
34
+
35
+ ### Issue Tracking (3 providers)
36
+
37
+ | Provider | Factory | Config |
38
+ |----------|---------|--------|
39
+ | Linear | `linear()` | `apiKey` |
40
+ | GitHub Issues | `githubIssues()` | `token`, `owner`, `repo` |
41
+ | Jira | `jira()` | `baseUrl`, `email`, `apiToken` |
42
+
43
+ ```typescript
44
+ import { linear, githubIssues, jira } from "@swenyai/providers/issue-tracking";
45
+ ```
46
+
47
+ ### Source Control (2 providers)
48
+
49
+ | Provider | Factory | Config |
50
+ |----------|---------|--------|
51
+ | GitHub | `github()` | `token`, `owner`, `repo` |
52
+ | GitLab | `gitlab()` | `token`, `projectId`, `baseUrl` |
53
+
54
+ ```typescript
55
+ import { github, gitlab } from "@swenyai/providers/source-control";
56
+ ```
57
+
58
+ ### Incident Management (2 providers)
59
+
60
+ | Provider | Factory | Config |
61
+ |----------|---------|--------|
62
+ | PagerDuty | `pagerduty()` | `apiToken`, `routingKey` |
63
+ | OpsGenie | `opsgenie()` | `apiKey`, `region` |
64
+
65
+ ```typescript
66
+ import { pagerduty, opsgenie } from "@swenyai/providers/incident";
67
+ ```
68
+
69
+ ### Messaging (2 providers)
70
+
71
+ | Provider | Factory | Config |
72
+ |----------|---------|--------|
73
+ | Slack | `slack()` | `token` |
74
+ | Microsoft Teams | `teams()` | `tenantId`, `clientId`, `clientSecret` |
75
+
76
+ ```typescript
77
+ import { slack, teams } from "@swenyai/providers/messaging";
78
+ ```
79
+
80
+ ### Notification (6 providers)
81
+
82
+ | Provider | Factory | Config |
83
+ |----------|---------|--------|
84
+ | GitHub Summary | `githubSummary()` | — |
85
+ | Slack Webhook | `slackWebhook()` | `webhookUrl` |
86
+ | Teams Webhook | `teamsWebhook()` | `webhookUrl` |
87
+ | Discord Webhook | `discordWebhook()` | `webhookUrl` |
88
+ | Email (SendGrid) | `email()` | `apiKey`, `from`, `to` |
89
+ | Generic Webhook | `webhook()` | `url`, `headers`, `method`, `signingSecret` |
90
+
91
+ ```typescript
92
+ import { githubSummary, slackWebhook, teamsWebhook, discordWebhook, email, webhook } from "@swenyai/providers/notification";
93
+ ```
94
+
95
+ ### Storage (3 backends)
96
+
97
+ | Provider | Factory | Config |
98
+ |----------|---------|--------|
99
+ | Filesystem | `fsStorage()` | `baseDir` |
100
+ | AWS S3 | `s3Storage()` | `bucket`, `prefix`, `region` |
101
+ | CSI / Kubernetes PVC | `csiStorage()` | `mountPath`, `volumeName`, `namespace` |
102
+
103
+ ```typescript
104
+ import { fsStorage, s3Storage, csiStorage } from "@swenyai/providers/storage";
105
+ ```
106
+
107
+ ### Credential Vault (2 backends)
108
+
109
+ | Provider | Factory | Config |
110
+ |----------|---------|--------|
111
+ | Environment Variables | `envVault()` | `prefix` |
112
+ | AWS Secrets Manager | `awsSecretsManager()` | `region`, `prefix` |
113
+
114
+ ```typescript
115
+ import { envVault, awsSecretsManager } from "@swenyai/providers/credential-vault";
116
+ ```
117
+
118
+ ### Auth (2 providers)
119
+
120
+ | Provider | Factory |
121
+ |----------|---------|
122
+ | No Auth | `noAuth()` |
123
+ | API Key Auth | `apiKeyAuth()` |
124
+
125
+ ```typescript
126
+ import { noAuth, apiKeyAuth } from "@swenyai/providers/auth";
127
+ ```
128
+
129
+ ### Access (2 guards)
130
+
131
+ | Provider | Factory |
132
+ |----------|---------|
133
+ | Allow All | `allowAllGuard()` |
134
+ | Role-Based | `roleBasedGuard()` |
135
+
136
+ ```typescript
137
+ import { allowAllGuard, roleBasedGuard } from "@swenyai/providers/access";
138
+ ```
139
+
140
+ ### Coding Agent
141
+
142
+ | Provider | Factory |
143
+ |----------|---------|
144
+ | Claude Code | `claudeCode()` |
145
+
146
+ ```typescript
147
+ import { claudeCode } from "@swenyai/providers/coding-agent";
148
+ ```
149
+
150
+ ### Agent Tool
151
+
152
+ | Provider | Factory |
153
+ |----------|---------|
154
+ | Agent Tool | `agentTool()` |
155
+
156
+ ```typescript
157
+ import { agentTool } from "@swenyai/providers/agent-tool";
158
+ ```
159
+
160
+ ## Usage
161
+
162
+ Every provider follows the factory function pattern with Zod-validated config:
163
+
164
+ ```typescript
165
+ import { datadog } from "@swenyai/providers/observability";
166
+ import { jira } from "@swenyai/providers/issue-tracking";
167
+ import { github } from "@swenyai/providers/source-control";
168
+ import { pagerduty } from "@swenyai/providers/incident";
169
+
170
+ const obs = datadog({
171
+ apiKey: process.env.DD_API_KEY!,
172
+ appKey: process.env.DD_APP_KEY!,
173
+ site: "datadoghq.com",
174
+ });
175
+
176
+ const issues = jira({
177
+ baseUrl: "https://your-org.atlassian.net",
178
+ email: process.env.JIRA_EMAIL!,
179
+ apiToken: process.env.JIRA_API_TOKEN!,
180
+ });
181
+
182
+ const sc = github({
183
+ token: process.env.GITHUB_TOKEN!,
184
+ owner: "your-org",
185
+ repo: "your-repo",
186
+ });
187
+
188
+ const incidents = pagerduty({
189
+ apiToken: process.env.PD_API_TOKEN!,
190
+ routingKey: process.env.PD_ROUTING_KEY!,
191
+ });
192
+
193
+ // All providers expose verifyAccess() for health checks
194
+ await obs.verifyAccess();
195
+ await issues.verifyAccess();
196
+ await sc.verifyAccess();
197
+ await incidents.verifyAccess();
198
+
199
+ // Query observability logs
200
+ const logs = await obs.queryLogs({
201
+ timeRange: "24h",
202
+ serviceFilter: "*",
203
+ severity: "error",
204
+ });
205
+
206
+ // Create an issue
207
+ const issue = await issues.createIssue({
208
+ title: "Fix authentication timeout",
209
+ description: "Users are experiencing 504s on login",
210
+ projectId: "team-id",
211
+ });
212
+ ```
213
+
214
+ ## Optional dependencies
215
+
216
+ Heavy SDKs are optional peer dependencies. Only install what you use:
217
+
218
+ ```bash
219
+ # For S3 storage
220
+ npm install @aws-sdk/client-s3 @aws-sdk/s3-request-presigner
221
+
222
+ # For CSI / Kubernetes PVC storage
223
+ npm install @kubernetes/client-node
224
+
225
+ # For CloudWatch observability
226
+ npm install @aws-sdk/client-cloudwatch-logs
227
+
228
+ # For AWS Secrets Manager credential vault
229
+ npm install @aws-sdk/client-secrets-manager
230
+
231
+ # For Slack messaging
232
+ npm install @slack/web-api
233
+
234
+ # For GitHub Actions notification
235
+ npm install @actions/core
236
+
237
+ # For Microsoft Teams messaging
238
+ npm install @azure/identity @microsoft/microsoft-graph-client
239
+ ```
240
+
241
+ ## Implementing a custom provider
242
+
243
+ Each provider category defines a TypeScript interface. Implement the interface and pass your instance wherever a provider is expected:
244
+
245
+ ```typescript
246
+ import type { ObservabilityProvider } from "@swenyai/providers/observability";
247
+
248
+ export function myCustomProvider(config: MyConfig): ObservabilityProvider {
249
+ return {
250
+ async verifyAccess() { /* ... */ },
251
+ async queryLogs(opts) { /* ... */ },
252
+ async aggregate(opts) { /* ... */ },
253
+ };
254
+ }
255
+ ```
256
+
257
+ ## License
258
+
259
+ [MIT](../../LICENSE)
@@ -0,0 +1,3 @@
1
+ import type { AccessGuard } from "./types.js";
2
+ export declare function allowAllGuard(): AccessGuard;
3
+ //# sourceMappingURL=allow-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allow-all.d.ts","sourceRoot":"","sources":["../../src/access/allow-all.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAqB9C,wBAAgB,aAAa,IAAI,WAAW,CAE3C"}
@@ -0,0 +1,19 @@
1
+ import { AccessLevel } from "./types.js";
2
+ class AllowAllGuard {
3
+ resolveAccessLevel(_user) {
4
+ return AccessLevel.READ_WRITE;
5
+ }
6
+ assertNotForbidden(_user) {
7
+ // all users are allowed
8
+ }
9
+ assertCanQuery(_user) {
10
+ // all users can query
11
+ }
12
+ assertCanMutate(_user) {
13
+ // all users can mutate
14
+ }
15
+ }
16
+ export function allowAllGuard() {
17
+ return new AllowAllGuard();
18
+ }
19
+ //# sourceMappingURL=allow-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"allow-all.js","sourceRoot":"","sources":["../../src/access/allow-all.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,aAAa;IACjB,kBAAkB,CAAC,KAAmB;QACpC,OAAO,WAAW,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,kBAAkB,CAAC,KAAmB;QACpC,wBAAwB;IAC1B,CAAC;IAED,cAAc,CAAC,KAAmB;QAChC,sBAAsB;IACxB,CAAC;IAED,eAAe,CAAC,KAAmB;QACjC,uBAAuB;IACzB,CAAC;CACF;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,aAAa,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export type { AccessGuard } from "./types.js";
2
+ export { AccessLevel, AccessDeniedError } from "./types.js";
3
+ export { allowAllGuard } from "./allow-all.js";
4
+ export { roleBasedGuard, type RoleMapping } from "./role-based.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { AccessLevel, AccessDeniedError } from "./types.js";
2
+ export { allowAllGuard } from "./allow-all.js";
3
+ export { roleBasedGuard } from "./role-based.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/access/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAoB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AccessGuard } from "./types.js";
2
+ export interface RoleMapping {
3
+ admin?: string[];
4
+ readWrite?: string[];
5
+ readOnly?: string[];
6
+ }
7
+ export declare function roleBasedGuard(mapping: RoleMapping): AccessGuard;
8
+ //# sourceMappingURL=role-based.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-based.d.ts","sourceRoot":"","sources":["../../src/access/role-based.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAiDD,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAEhE"}
@@ -0,0 +1,42 @@
1
+ import { AccessLevel, AccessDeniedError } from "./types.js";
2
+ class RoleBasedGuard {
3
+ mapping;
4
+ constructor(mapping) {
5
+ this.mapping = mapping;
6
+ }
7
+ resolveAccessLevel(user) {
8
+ const userRoles = new Set(user.roles);
9
+ if (this.mapping.admin?.some((r) => userRoles.has(r))) {
10
+ return AccessLevel.ADMIN;
11
+ }
12
+ if (this.mapping.readWrite?.some((r) => userRoles.has(r))) {
13
+ return AccessLevel.READ_WRITE;
14
+ }
15
+ if (this.mapping.readOnly?.some((r) => userRoles.has(r))) {
16
+ return AccessLevel.READ_ONLY;
17
+ }
18
+ return AccessLevel.FORBIDDEN;
19
+ }
20
+ assertNotForbidden(user) {
21
+ const level = this.resolveAccessLevel(user);
22
+ if (level === AccessLevel.FORBIDDEN) {
23
+ throw new AccessDeniedError(`User "${user.userId}" does not have any permitted role`);
24
+ }
25
+ }
26
+ assertCanQuery(user) {
27
+ const level = this.resolveAccessLevel(user);
28
+ if (level === AccessLevel.FORBIDDEN) {
29
+ throw new AccessDeniedError(`User "${user.userId}" does not have read access`);
30
+ }
31
+ }
32
+ assertCanMutate(user) {
33
+ const level = this.resolveAccessLevel(user);
34
+ if (level === AccessLevel.FORBIDDEN || level === AccessLevel.READ_ONLY) {
35
+ throw new AccessDeniedError(`User "${user.userId}" does not have write access`);
36
+ }
37
+ }
38
+ }
39
+ export function roleBasedGuard(mapping) {
40
+ return new RoleBasedGuard(mapping);
41
+ }
42
+ //# sourceMappingURL=role-based.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-based.js","sourceRoot":"","sources":["../../src/access/role-based.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAQ5D,MAAM,cAAc;IACD,OAAO,CAAc;IAEtC,YAAY,OAAoB;QAC9B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,kBAAkB,CAAC,IAAkB;QACnC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,OAAO,WAAW,CAAC,KAAK,CAAC;QAC3B,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1D,OAAO,WAAW,CAAC,UAAU,CAAC;QAChC,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzD,OAAO,WAAW,CAAC,SAAS,CAAC;QAC/B,CAAC;QAED,OAAO,WAAW,CAAC,SAAS,CAAC;IAC/B,CAAC;IAED,kBAAkB,CAAC,IAAkB;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,iBAAiB,CAAC,SAAS,IAAI,CAAC,MAAM,oCAAoC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,cAAc,CAAC,IAAkB;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YACpC,MAAM,IAAI,iBAAiB,CAAC,SAAS,IAAI,CAAC,MAAM,6BAA6B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,eAAe,CAAC,IAAkB;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,WAAW,CAAC,SAAS,IAAI,KAAK,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YACvE,MAAM,IAAI,iBAAiB,CAAC,SAAS,IAAI,CAAC,MAAM,8BAA8B,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,OAAoB;IACjD,OAAO,IAAI,cAAc,CAAC,OAAO,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,41 @@
1
+ import type { UserIdentity } from "../auth/types.js";
2
+ /** Permission levels ordered from least to most privileged. */
3
+ export declare enum AccessLevel {
4
+ /** User is not allowed any access. */
5
+ FORBIDDEN = "forbidden",
6
+ /** User may only read / query data. */
7
+ READ_ONLY = "read_only",
8
+ /** User may read and write / mutate data. */
9
+ READ_WRITE = "read_write",
10
+ /** User has full administrative access. */
11
+ ADMIN = "admin"
12
+ }
13
+ /** Guard that resolves and enforces access levels for authenticated users. */
14
+ export interface AccessGuard {
15
+ /**
16
+ * Determine the access level for a user.
17
+ * @param user - The authenticated user identity.
18
+ * @returns The resolved access level.
19
+ */
20
+ resolveAccessLevel(user: UserIdentity): AccessLevel;
21
+ /**
22
+ * Assert that the user is not forbidden. Throws AccessDeniedError if forbidden.
23
+ * @param user - The authenticated user identity.
24
+ */
25
+ assertNotForbidden(user: UserIdentity): void;
26
+ /**
27
+ * Assert that the user has at least read-only access. Throws AccessDeniedError otherwise.
28
+ * @param user - The authenticated user identity.
29
+ */
30
+ assertCanQuery(user: UserIdentity): void;
31
+ /**
32
+ * Assert that the user has read-write or admin access. Throws AccessDeniedError otherwise.
33
+ * @param user - The authenticated user identity.
34
+ */
35
+ assertCanMutate(user: UserIdentity): void;
36
+ }
37
+ /** Error thrown when a user's access level is insufficient for an operation. */
38
+ export declare class AccessDeniedError extends Error {
39
+ constructor(message: string);
40
+ }
41
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/access/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,+DAA+D;AAC/D,oBAAY,WAAW;IACrB,sCAAsC;IACtC,SAAS,cAAc;IACvB,uCAAuC;IACvC,SAAS,cAAc;IACvB,6CAA6C;IAC7C,UAAU,eAAe;IACzB,2CAA2C;IAC3C,KAAK,UAAU;CAChB;AAED,8EAA8E;AAC9E,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,CAAC;IAEpD;;;OAGG;IACH,kBAAkB,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAE7C;;;OAGG;IACH,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAEzC;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;CAC3C;AAED,gFAAgF;AAChF,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B"}
@@ -0,0 +1,20 @@
1
+ /** Permission levels ordered from least to most privileged. */
2
+ export var AccessLevel;
3
+ (function (AccessLevel) {
4
+ /** User is not allowed any access. */
5
+ AccessLevel["FORBIDDEN"] = "forbidden";
6
+ /** User may only read / query data. */
7
+ AccessLevel["READ_ONLY"] = "read_only";
8
+ /** User may read and write / mutate data. */
9
+ AccessLevel["READ_WRITE"] = "read_write";
10
+ /** User has full administrative access. */
11
+ AccessLevel["ADMIN"] = "admin";
12
+ })(AccessLevel || (AccessLevel = {}));
13
+ /** Error thrown when a user's access level is insufficient for an operation. */
14
+ export class AccessDeniedError extends Error {
15
+ constructor(message) {
16
+ super(message);
17
+ this.name = "AccessDeniedError";
18
+ }
19
+ }
20
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/access/types.ts"],"names":[],"mappings":"AAEA,+DAA+D;AAC/D,MAAM,CAAN,IAAY,WASX;AATD,WAAY,WAAW;IACrB,sCAAsC;IACtC,sCAAuB,CAAA;IACvB,uCAAuC;IACvC,sCAAuB,CAAA;IACvB,6CAA6C;IAC7C,wCAAyB,CAAA;IACzB,2CAA2C;IAC3C,8BAAe,CAAA;AACjB,CAAC,EATW,WAAW,KAAX,WAAW,QAStB;AA8BD,gFAAgF;AAChF,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ import type { ZodRawShape } from "zod";
2
+ import type { AgentTool, ToolResult } from "./types.js";
3
+ export declare function agentTool<T extends ZodRawShape>(name: string, description: string, schema: T, execute: (args: Record<string, unknown>) => Promise<ToolResult>): AgentTool<T>;
4
+ //# sourceMappingURL=factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/agent-tool/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExD,wBAAgB,SAAS,CAAC,CAAC,SAAS,WAAW,EAC7C,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,GAC9D,SAAS,CAAC,CAAC,CAAC,CAEd"}
@@ -0,0 +1,4 @@
1
+ export function agentTool(name, description, schema, execute) {
2
+ return { name, description, schema, execute };
3
+ }
4
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/agent-tool/factory.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,SAAS,CACvB,IAAY,EACZ,WAAmB,EACnB,MAAS,EACT,OAA+D;IAE/D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAChD,CAAC"}
@@ -0,0 +1,3 @@
1
+ export type { AgentTool, ToolResult } from "./types.js";
2
+ export { agentTool } from "./factory.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agent-tool/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { agentTool } from "./factory.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agent-tool/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { ZodRawShape } from "zod";
2
+ export interface ToolResult {
3
+ content: {
4
+ type: "text";
5
+ text: string;
6
+ }[];
7
+ isError?: boolean;
8
+ }
9
+ export interface AgentTool<T extends ZodRawShape = ZodRawShape> {
10
+ name: string;
11
+ description: string;
12
+ schema: T;
13
+ execute(args: Record<string, unknown>): Promise<ToolResult>;
14
+ }
15
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent-tool/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,KAAK,CAAC;AAEvC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW;IAC5D,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,CAAC,CAAC;IACV,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;CAC7D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent-tool/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { AuthProvider, UserIdentity } from "./types.js";
2
+ export interface ApiKeyAuthOpts {
3
+ validate: (apiKey: string) => Promise<UserIdentity | null>;
4
+ }
5
+ export declare function apiKeyAuth(opts: ApiKeyAuthOpts): AuthProvider;
6
+ //# sourceMappingURL=api-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../src/auth/api-key.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;CAC5D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CA0C7D"}
@@ -0,0 +1,36 @@
1
+ export function apiKeyAuth(opts) {
2
+ const sessions = new Map();
3
+ return {
4
+ displayName: "API Key",
5
+ loginFields: [
6
+ {
7
+ key: "apiKey",
8
+ label: "API Key",
9
+ type: "password",
10
+ placeholder: "Enter your API key",
11
+ },
12
+ ],
13
+ async authenticate(userId) {
14
+ return sessions.get(userId) ?? null;
15
+ },
16
+ async login(_userId, credentials) {
17
+ const apiKey = credentials["apiKey"];
18
+ if (!apiKey) {
19
+ throw new Error("API key is required");
20
+ }
21
+ const identity = await opts.validate(apiKey);
22
+ if (!identity) {
23
+ throw new Error("Invalid API key");
24
+ }
25
+ sessions.set(identity.userId, identity);
26
+ return identity;
27
+ },
28
+ async hasValidSession(userId) {
29
+ return sessions.has(userId);
30
+ },
31
+ async clearSession(userId) {
32
+ sessions.delete(userId);
33
+ },
34
+ };
35
+ }
36
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../src/auth/api-key.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,UAAU,CAAC,IAAoB;IAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAEjD,OAAO;QACL,WAAW,EAAE,SAAS;QAEtB,WAAW,EAAE;YACX;gBACE,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,SAAS;gBAChB,IAAI,EAAE,UAAgC;gBACtC,WAAW,EAAE,oBAAoB;aAClC;SACF;QAED,KAAK,CAAC,YAAY,CAAC,MAAc;YAC/B,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;QACtC,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAe,EAAE,WAAmC;YAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACrC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC7C,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,CAAC;YAED,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACxC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,MAAc;YAClC,OAAO,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,MAAc;YAC/B,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { AuthProvider, UserIdentity, LoginField } from "./types.js";
2
+ export { noAuth } from "./no-auth.js";
3
+ export { apiKeyAuth, type ApiKeyAuthOpts } from "./api-key.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { noAuth } from "./no-auth.js";
2
+ export { apiKeyAuth } from "./api-key.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAuB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AuthProvider } from "./types.js";
2
+ export declare function noAuth(): AuthProvider;
3
+ //# sourceMappingURL=no-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-auth.d.ts","sourceRoot":"","sources":["../../src/auth/no-auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,YAAY,CAAC;AAS7D,wBAAgB,MAAM,IAAI,YAAY,CAgBrC"}
@@ -0,0 +1,21 @@
1
+ const LOCAL_USER = {
2
+ userId: "local",
3
+ displayName: "Local User",
4
+ roles: ["admin"],
5
+ metadata: {},
6
+ };
7
+ export function noAuth() {
8
+ return {
9
+ displayName: "No Auth",
10
+ async authenticate(_userId) {
11
+ return LOCAL_USER;
12
+ },
13
+ async hasValidSession(_userId) {
14
+ return true;
15
+ },
16
+ async clearSession(_userId) {
17
+ // nothing to clear
18
+ },
19
+ };
20
+ }
21
+ //# sourceMappingURL=no-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-auth.js","sourceRoot":"","sources":["../../src/auth/no-auth.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,GAAiB;IAC/B,MAAM,EAAE,OAAO;IACf,WAAW,EAAE,YAAY;IACzB,KAAK,EAAE,CAAC,OAAO,CAAC;IAChB,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,UAAU,MAAM;IACpB,OAAO;QACL,WAAW,EAAE,SAAS;QAEtB,KAAK,CAAC,YAAY,CAAC,OAAe;YAChC,OAAO,UAAU,CAAC;QACpB,CAAC;QAED,KAAK,CAAC,eAAe,CAAC,OAAe;YACnC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,KAAK,CAAC,YAAY,CAAC,OAAe;YAChC,mBAAmB;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}