@cat-factory/integrations 0.6.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 (242) hide show
  1. package/LICENSE +21 -0
  2. package/dist/index.d.ts +68 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +84 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/modules/datadog/DatadogClient.d.ts +54 -0
  7. package/dist/modules/datadog/DatadogClient.d.ts.map +1 -0
  8. package/dist/modules/datadog/DatadogClient.js +132 -0
  9. package/dist/modules/datadog/DatadogClient.js.map +1 -0
  10. package/dist/modules/datadog/DatadogReleaseHealthProvider.d.ts +30 -0
  11. package/dist/modules/datadog/DatadogReleaseHealthProvider.d.ts.map +1 -0
  12. package/dist/modules/datadog/DatadogReleaseHealthProvider.js +101 -0
  13. package/dist/modules/datadog/DatadogReleaseHealthProvider.js.map +1 -0
  14. package/dist/modules/datadog/datadog.logic.d.ts +37 -0
  15. package/dist/modules/datadog/datadog.logic.d.ts.map +1 -0
  16. package/dist/modules/datadog/datadog.logic.js +90 -0
  17. package/dist/modules/datadog/datadog.logic.js.map +1 -0
  18. package/dist/modules/documents/ConfluenceProvider.d.ts +29 -0
  19. package/dist/modules/documents/ConfluenceProvider.d.ts.map +1 -0
  20. package/dist/modules/documents/ConfluenceProvider.js +180 -0
  21. package/dist/modules/documents/ConfluenceProvider.js.map +1 -0
  22. package/dist/modules/documents/DocumentConnectionService.d.ts +30 -0
  23. package/dist/modules/documents/DocumentConnectionService.d.ts.map +1 -0
  24. package/dist/modules/documents/DocumentConnectionService.js +69 -0
  25. package/dist/modules/documents/DocumentConnectionService.js.map +1 -0
  26. package/dist/modules/documents/DocumentImportService.d.ts +34 -0
  27. package/dist/modules/documents/DocumentImportService.d.ts.map +1 -0
  28. package/dist/modules/documents/DocumentImportService.js +83 -0
  29. package/dist/modules/documents/DocumentImportService.js.map +1 -0
  30. package/dist/modules/documents/DocumentLinkService.d.ts +31 -0
  31. package/dist/modules/documents/DocumentLinkService.d.ts.map +1 -0
  32. package/dist/modules/documents/DocumentLinkService.js +75 -0
  33. package/dist/modules/documents/DocumentLinkService.js.map +1 -0
  34. package/dist/modules/documents/DocumentPlannerService.d.ts +23 -0
  35. package/dist/modules/documents/DocumentPlannerService.d.ts.map +1 -0
  36. package/dist/modules/documents/DocumentPlannerService.js +96 -0
  37. package/dist/modules/documents/DocumentPlannerService.js.map +1 -0
  38. package/dist/modules/documents/GitHubDocsProvider.d.ts +42 -0
  39. package/dist/modules/documents/GitHubDocsProvider.d.ts.map +1 -0
  40. package/dist/modules/documents/GitHubDocsProvider.js +86 -0
  41. package/dist/modules/documents/GitHubDocsProvider.js.map +1 -0
  42. package/dist/modules/documents/NotionProvider.d.ts +32 -0
  43. package/dist/modules/documents/NotionProvider.d.ts.map +1 -0
  44. package/dist/modules/documents/NotionProvider.js +221 -0
  45. package/dist/modules/documents/NotionProvider.js.map +1 -0
  46. package/dist/modules/documents/confluence.logic.d.ts +37 -0
  47. package/dist/modules/documents/confluence.logic.d.ts.map +1 -0
  48. package/dist/modules/documents/confluence.logic.js +133 -0
  49. package/dist/modules/documents/confluence.logic.js.map +1 -0
  50. package/dist/modules/documents/documents.logic.d.ts +22 -0
  51. package/dist/modules/documents/documents.logic.d.ts.map +1 -0
  52. package/dist/modules/documents/documents.logic.js +138 -0
  53. package/dist/modules/documents/documents.logic.js.map +1 -0
  54. package/dist/modules/documents/github-docs.logic.d.ts +52 -0
  55. package/dist/modules/documents/github-docs.logic.d.ts.map +1 -0
  56. package/dist/modules/documents/github-docs.logic.js +94 -0
  57. package/dist/modules/documents/github-docs.logic.js.map +1 -0
  58. package/dist/modules/documents/notion.logic.d.ts +31 -0
  59. package/dist/modules/documents/notion.logic.d.ts.map +1 -0
  60. package/dist/modules/documents/notion.logic.js +142 -0
  61. package/dist/modules/documents/notion.logic.js.map +1 -0
  62. package/dist/modules/email/EmailConnectionService.d.ts +34 -0
  63. package/dist/modules/email/EmailConnectionService.d.ts.map +1 -0
  64. package/dist/modules/email/EmailConnectionService.js +82 -0
  65. package/dist/modules/email/EmailConnectionService.js.map +1 -0
  66. package/dist/modules/email/adapters.d.ts +39 -0
  67. package/dist/modules/email/adapters.d.ts.map +1 -0
  68. package/dist/modules/email/adapters.js +79 -0
  69. package/dist/modules/email/adapters.js.map +1 -0
  70. package/dist/modules/environments/EnvironmentConnectionService.d.ts +42 -0
  71. package/dist/modules/environments/EnvironmentConnectionService.d.ts.map +1 -0
  72. package/dist/modules/environments/EnvironmentConnectionService.js +120 -0
  73. package/dist/modules/environments/EnvironmentConnectionService.js.map +1 -0
  74. package/dist/modules/environments/EnvironmentProvisioningService.d.ts +56 -0
  75. package/dist/modules/environments/EnvironmentProvisioningService.d.ts.map +1 -0
  76. package/dist/modules/environments/EnvironmentProvisioningService.js +153 -0
  77. package/dist/modules/environments/EnvironmentProvisioningService.js.map +1 -0
  78. package/dist/modules/environments/EnvironmentTeardownService.d.ts +24 -0
  79. package/dist/modules/environments/EnvironmentTeardownService.d.ts.map +1 -0
  80. package/dist/modules/environments/EnvironmentTeardownService.js +54 -0
  81. package/dist/modules/environments/EnvironmentTeardownService.js.map +1 -0
  82. package/dist/modules/environments/HttpEnvironmentProvider.d.ts +30 -0
  83. package/dist/modules/environments/HttpEnvironmentProvider.d.ts.map +1 -0
  84. package/dist/modules/environments/HttpEnvironmentProvider.js +316 -0
  85. package/dist/modules/environments/HttpEnvironmentProvider.js.map +1 -0
  86. package/dist/modules/environments/environments.logic.d.ts +50 -0
  87. package/dist/modules/environments/environments.logic.d.ts.map +1 -0
  88. package/dist/modules/environments/environments.logic.js +257 -0
  89. package/dist/modules/environments/environments.logic.js.map +1 -0
  90. package/dist/modules/github/GitHubInstallationService.d.ts +66 -0
  91. package/dist/modules/github/GitHubInstallationService.d.ts.map +1 -0
  92. package/dist/modules/github/GitHubInstallationService.js +143 -0
  93. package/dist/modules/github/GitHubInstallationService.js.map +1 -0
  94. package/dist/modules/github/GitHubService.d.ts +29 -0
  95. package/dist/modules/github/GitHubService.d.ts.map +1 -0
  96. package/dist/modules/github/GitHubService.js +61 -0
  97. package/dist/modules/github/GitHubService.js.map +1 -0
  98. package/dist/modules/github/GitHubSyncService.d.ts +97 -0
  99. package/dist/modules/github/GitHubSyncService.d.ts.map +1 -0
  100. package/dist/modules/github/GitHubSyncService.js +241 -0
  101. package/dist/modules/github/GitHubSyncService.js.map +1 -0
  102. package/dist/modules/github/RepoProvisioningService.d.ts +26 -0
  103. package/dist/modules/github/RepoProvisioningService.d.ts.map +1 -0
  104. package/dist/modules/github/RepoProvisioningService.js +36 -0
  105. package/dist/modules/github/RepoProvisioningService.js.map +1 -0
  106. package/dist/modules/github/WebhookService.d.ts +28 -0
  107. package/dist/modules/github/WebhookService.d.ts.map +1 -0
  108. package/dist/modules/github/WebhookService.js +156 -0
  109. package/dist/modules/github/WebhookService.js.map +1 -0
  110. package/dist/modules/github/projection.logic.d.ts +95 -0
  111. package/dist/modules/github/projection.logic.d.ts.map +1 -0
  112. package/dist/modules/github/projection.logic.js +94 -0
  113. package/dist/modules/github/projection.logic.js.map +1 -0
  114. package/dist/modules/github/provisioning.logic.d.ts +11 -0
  115. package/dist/modules/github/provisioning.logic.d.ts.map +1 -0
  116. package/dist/modules/github/provisioning.logic.js +18 -0
  117. package/dist/modules/github/provisioning.logic.js.map +1 -0
  118. package/dist/modules/incident/incident.logic.d.ts +16 -0
  119. package/dist/modules/incident/incident.logic.d.ts.map +1 -0
  120. package/dist/modules/incident/incident.logic.js +23 -0
  121. package/dist/modules/incident/incident.logic.js.map +1 -0
  122. package/dist/modules/incidentio/IncidentIoEnrichmentProvider.d.ts +26 -0
  123. package/dist/modules/incidentio/IncidentIoEnrichmentProvider.d.ts.map +1 -0
  124. package/dist/modules/incidentio/IncidentIoEnrichmentProvider.js +84 -0
  125. package/dist/modules/incidentio/IncidentIoEnrichmentProvider.js.map +1 -0
  126. package/dist/modules/pagerduty/PagerDutyEnrichmentProvider.d.ts +27 -0
  127. package/dist/modules/pagerduty/PagerDutyEnrichmentProvider.d.ts.map +1 -0
  128. package/dist/modules/pagerduty/PagerDutyEnrichmentProvider.js +65 -0
  129. package/dist/modules/pagerduty/PagerDutyEnrichmentProvider.js.map +1 -0
  130. package/dist/modules/providers/ApiKeyService.d.ts +73 -0
  131. package/dist/modules/providers/ApiKeyService.d.ts.map +1 -0
  132. package/dist/modules/providers/ApiKeyService.js +122 -0
  133. package/dist/modules/providers/ApiKeyService.js.map +1 -0
  134. package/dist/modules/providers/LocalModelEndpointService.d.ts +52 -0
  135. package/dist/modules/providers/LocalModelEndpointService.d.ts.map +1 -0
  136. package/dist/modules/providers/LocalModelEndpointService.js +131 -0
  137. package/dist/modules/providers/LocalModelEndpointService.js.map +1 -0
  138. package/dist/modules/providers/PersonalSubscriptionService.d.ts +94 -0
  139. package/dist/modules/providers/PersonalSubscriptionService.d.ts.map +1 -0
  140. package/dist/modules/providers/PersonalSubscriptionService.js +218 -0
  141. package/dist/modules/providers/PersonalSubscriptionService.js.map +1 -0
  142. package/dist/modules/providers/ProviderSubscriptionService.d.ts +75 -0
  143. package/dist/modules/providers/ProviderSubscriptionService.d.ts.map +1 -0
  144. package/dist/modules/providers/ProviderSubscriptionService.js +130 -0
  145. package/dist/modules/providers/ProviderSubscriptionService.js.map +1 -0
  146. package/dist/modules/providers/localModelUrl.d.ts +7 -0
  147. package/dist/modules/providers/localModelUrl.d.ts.map +1 -0
  148. package/dist/modules/providers/localModelUrl.js +67 -0
  149. package/dist/modules/providers/localModelUrl.js.map +1 -0
  150. package/dist/modules/providers/providers.logic.d.ts +23 -0
  151. package/dist/modules/providers/providers.logic.d.ts.map +1 -0
  152. package/dist/modules/providers/providers.logic.js +46 -0
  153. package/dist/modules/providers/providers.logic.js.map +1 -0
  154. package/dist/modules/runners/HttpRunnerPoolProvider.d.ts +51 -0
  155. package/dist/modules/runners/HttpRunnerPoolProvider.d.ts.map +1 -0
  156. package/dist/modules/runners/HttpRunnerPoolProvider.js +304 -0
  157. package/dist/modules/runners/HttpRunnerPoolProvider.js.map +1 -0
  158. package/dist/modules/runners/RunnerPoolConnectionService.d.ts +47 -0
  159. package/dist/modules/runners/RunnerPoolConnectionService.d.ts.map +1 -0
  160. package/dist/modules/runners/RunnerPoolConnectionService.js +98 -0
  161. package/dist/modules/runners/RunnerPoolConnectionService.js.map +1 -0
  162. package/dist/modules/runners/RunnerPoolTransport.d.ts +11 -0
  163. package/dist/modules/runners/RunnerPoolTransport.d.ts.map +1 -0
  164. package/dist/modules/runners/RunnerPoolTransport.js +61 -0
  165. package/dist/modules/runners/RunnerPoolTransport.js.map +1 -0
  166. package/dist/modules/runners/runners.logic.d.ts +16 -0
  167. package/dist/modules/runners/runners.logic.d.ts.map +1 -0
  168. package/dist/modules/runners/runners.logic.js +52 -0
  169. package/dist/modules/runners/runners.logic.js.map +1 -0
  170. package/dist/modules/slack/SlackApiClient.d.ts +67 -0
  171. package/dist/modules/slack/SlackApiClient.d.ts.map +1 -0
  172. package/dist/modules/slack/SlackApiClient.js +132 -0
  173. package/dist/modules/slack/SlackApiClient.js.map +1 -0
  174. package/dist/modules/slack/SlackConnectionService.d.ts +41 -0
  175. package/dist/modules/slack/SlackConnectionService.d.ts.map +1 -0
  176. package/dist/modules/slack/SlackConnectionService.js +136 -0
  177. package/dist/modules/slack/SlackConnectionService.js.map +1 -0
  178. package/dist/modules/slack/SlackMemberMappingService.d.ts +17 -0
  179. package/dist/modules/slack/SlackMemberMappingService.d.ts.map +1 -0
  180. package/dist/modules/slack/SlackMemberMappingService.js +28 -0
  181. package/dist/modules/slack/SlackMemberMappingService.js.map +1 -0
  182. package/dist/modules/slack/SlackNotificationChannel.d.ts +45 -0
  183. package/dist/modules/slack/SlackNotificationChannel.d.ts.map +1 -0
  184. package/dist/modules/slack/SlackNotificationChannel.js +84 -0
  185. package/dist/modules/slack/SlackNotificationChannel.js.map +1 -0
  186. package/dist/modules/slack/SlackSettingsService.d.ts +16 -0
  187. package/dist/modules/slack/SlackSettingsService.d.ts.map +1 -0
  188. package/dist/modules/slack/SlackSettingsService.js +41 -0
  189. package/dist/modules/slack/SlackSettingsService.js.map +1 -0
  190. package/dist/modules/slack/slack.logic.d.ts +55 -0
  191. package/dist/modules/slack/slack.logic.d.ts.map +1 -0
  192. package/dist/modules/slack/slack.logic.js +149 -0
  193. package/dist/modules/slack/slack.logic.js.map +1 -0
  194. package/dist/modules/tasks/GitHubIssuesProvider.d.ts +50 -0
  195. package/dist/modules/tasks/GitHubIssuesProvider.d.ts.map +1 -0
  196. package/dist/modules/tasks/GitHubIssuesProvider.js +92 -0
  197. package/dist/modules/tasks/GitHubIssuesProvider.js.map +1 -0
  198. package/dist/modules/tasks/JiraProvider.d.ts +29 -0
  199. package/dist/modules/tasks/JiraProvider.d.ts.map +1 -0
  200. package/dist/modules/tasks/JiraProvider.js +114 -0
  201. package/dist/modules/tasks/JiraProvider.js.map +1 -0
  202. package/dist/modules/tasks/TaskConnectionService.d.ts +30 -0
  203. package/dist/modules/tasks/TaskConnectionService.d.ts.map +1 -0
  204. package/dist/modules/tasks/TaskConnectionService.js +69 -0
  205. package/dist/modules/tasks/TaskConnectionService.js.map +1 -0
  206. package/dist/modules/tasks/TaskImportService.d.ts +34 -0
  207. package/dist/modules/tasks/TaskImportService.d.ts.map +1 -0
  208. package/dist/modules/tasks/TaskImportService.js +96 -0
  209. package/dist/modules/tasks/TaskImportService.js.map +1 -0
  210. package/dist/modules/tasks/TaskLinkService.d.ts +30 -0
  211. package/dist/modules/tasks/TaskLinkService.d.ts.map +1 -0
  212. package/dist/modules/tasks/TaskLinkService.js +56 -0
  213. package/dist/modules/tasks/TaskLinkService.js.map +1 -0
  214. package/dist/modules/tasks/github-issues.logic.d.ts +35 -0
  215. package/dist/modules/tasks/github-issues.logic.d.ts.map +1 -0
  216. package/dist/modules/tasks/github-issues.logic.js +67 -0
  217. package/dist/modules/tasks/github-issues.logic.js.map +1 -0
  218. package/dist/modules/tasks/jira.logic.d.ts +28 -0
  219. package/dist/modules/tasks/jira.logic.d.ts.map +1 -0
  220. package/dist/modules/tasks/jira.logic.js +151 -0
  221. package/dist/modules/tasks/jira.logic.js.map +1 -0
  222. package/dist/modules/tasks/tasks.logic.d.ts +12 -0
  223. package/dist/modules/tasks/tasks.logic.d.ts.map +1 -0
  224. package/dist/modules/tasks/tasks.logic.js +17 -0
  225. package/dist/modules/tasks/tasks.logic.js.map +1 -0
  226. package/dist/modules/tracker/TicketTrackerService.d.ts +45 -0
  227. package/dist/modules/tracker/TicketTrackerService.d.ts.map +1 -0
  228. package/dist/modules/tracker/TicketTrackerService.js +52 -0
  229. package/dist/modules/tracker/TicketTrackerService.js.map +1 -0
  230. package/dist/modules/tracker/base64.d.ts +2 -0
  231. package/dist/modules/tracker/base64.d.ts.map +1 -0
  232. package/dist/modules/tracker/base64.js +18 -0
  233. package/dist/modules/tracker/base64.js.map +1 -0
  234. package/dist/modules/tracker/github.create.logic.d.ts +16 -0
  235. package/dist/modules/tracker/github.create.logic.d.ts.map +1 -0
  236. package/dist/modules/tracker/github.create.logic.js +25 -0
  237. package/dist/modules/tracker/github.create.logic.js.map +1 -0
  238. package/dist/modules/tracker/jira.create.logic.d.ts +31 -0
  239. package/dist/modules/tracker/jira.create.logic.d.ts.map +1 -0
  240. package/dist/modules/tracker/jira.create.logic.js +59 -0
  241. package/dist/modules/tracker/jira.create.logic.js.map +1 -0
  242. package/package.json +36 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookService.js","sourceRoot":"","sources":["../../../src/modules/github/WebhookService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ import type { GitHubBranch, GitHubCheckRun, GitHubCommit, GitHubIssue, GitHubPullRequest, GitHubRepo } from '@cat-factory/kernel';
2
+ /** Parse a GitHub ISO-8601 timestamp to epoch ms, or null if absent/invalid. */
3
+ export declare function isoToEpochMs(value: unknown): number | null;
4
+ export interface GhRepoPayload {
5
+ id: number;
6
+ name: string;
7
+ private?: boolean;
8
+ default_branch?: string | null;
9
+ owner?: {
10
+ login?: string;
11
+ } | null;
12
+ }
13
+ export declare function toRepoProjection(p: GhRepoPayload, installationId: number, syncedAt: number): GitHubRepo;
14
+ export interface GhBranchPayload {
15
+ name: string;
16
+ commit?: {
17
+ sha?: string;
18
+ } | null;
19
+ protected?: boolean;
20
+ }
21
+ export declare function toBranchProjection(p: GhBranchPayload, repoGithubId: number, syncedAt: number): GitHubBranch;
22
+ export interface GhPullPayload {
23
+ id: number;
24
+ number: number;
25
+ title: string;
26
+ state: string;
27
+ merged?: boolean;
28
+ merged_at?: string | null;
29
+ updated_at?: string | null;
30
+ user?: {
31
+ login?: string;
32
+ } | null;
33
+ head?: {
34
+ ref?: string;
35
+ sha?: string;
36
+ repo?: {
37
+ id?: number;
38
+ } | null;
39
+ } | null;
40
+ base?: {
41
+ ref?: string;
42
+ repo?: {
43
+ id?: number;
44
+ } | null;
45
+ } | null;
46
+ }
47
+ /** Resolve the repo a PR belongs to (base repo, falling back to head repo). */
48
+ export declare function pullRepoGithubId(p: GhPullPayload): number | null;
49
+ export declare function toPullRequestProjection(p: GhPullPayload, repoGithubId: number, syncedAt: number): GitHubPullRequest;
50
+ export interface GhIssuePayload {
51
+ id: number;
52
+ number: number;
53
+ title: string;
54
+ state: string;
55
+ updated_at?: string | null;
56
+ user?: {
57
+ login?: string;
58
+ } | null;
59
+ labels?: ({
60
+ name?: string;
61
+ } | string)[] | null;
62
+ /** Present when this "issue" is actually a pull request. */
63
+ pull_request?: unknown;
64
+ }
65
+ /** GitHub's issues API returns PRs too; this flags those so we can skip them. */
66
+ export declare function isPullRequest(p: GhIssuePayload): boolean;
67
+ export declare function toIssueProjection(p: GhIssuePayload, repoGithubId: number, syncedAt: number): GitHubIssue;
68
+ export interface GhCommitPayload {
69
+ sha?: string;
70
+ /** REST list-commits shape. */
71
+ commit?: {
72
+ message?: string;
73
+ author?: {
74
+ name?: string;
75
+ date?: string;
76
+ } | null;
77
+ } | null;
78
+ author?: {
79
+ login?: string;
80
+ } | null;
81
+ /** Push-webhook shape. */
82
+ id?: string;
83
+ message?: string;
84
+ timestamp?: string;
85
+ }
86
+ export declare function toCommitProjection(p: GhCommitPayload, repoGithubId: number, syncedAt: number): GitHubCommit;
87
+ export interface GhCheckRunPayload {
88
+ id: number;
89
+ name: string;
90
+ status: string;
91
+ conclusion?: string | null;
92
+ head_sha: string;
93
+ }
94
+ export declare function toCheckRunProjection(p: GhCheckRunPayload, repoGithubId: number, syncedAt: number): GitHubCheckRun;
95
+ //# sourceMappingURL=projection.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/github/projection.logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Pure mappers: GitHub JSON payloads → projection entities. Shared by the
3
+ // worker's fetch client (mapping REST responses) and the webhook consumer
4
+ // (mapping the resource objects embedded in delivery payloads), which carry the
5
+ // same shapes. Only the fields we project are typed; everything else is ignored.
6
+ // These functions are deterministic and have no I/O, so they unit-test cleanly.
7
+ // ---------------------------------------------------------------------------
8
+ /** Parse a GitHub ISO-8601 timestamp to epoch ms, or null if absent/invalid. */
9
+ export function isoToEpochMs(value) {
10
+ if (typeof value !== 'string')
11
+ return null;
12
+ const ms = Date.parse(value);
13
+ return Number.isNaN(ms) ? null : ms;
14
+ }
15
+ export function toRepoProjection(p, installationId, syncedAt) {
16
+ return {
17
+ githubId: p.id,
18
+ installationId,
19
+ owner: p.owner?.login ?? '',
20
+ name: p.name,
21
+ defaultBranch: p.default_branch ?? null,
22
+ private: p.private ?? false,
23
+ blockId: null,
24
+ syncedAt,
25
+ };
26
+ }
27
+ export function toBranchProjection(p, repoGithubId, syncedAt) {
28
+ return {
29
+ repoGithubId,
30
+ name: p.name,
31
+ headSha: p.commit?.sha ?? '',
32
+ protected: p.protected ?? false,
33
+ syncedAt,
34
+ };
35
+ }
36
+ /** Resolve the repo a PR belongs to (base repo, falling back to head repo). */
37
+ export function pullRepoGithubId(p) {
38
+ return p.base?.repo?.id ?? p.head?.repo?.id ?? null;
39
+ }
40
+ export function toPullRequestProjection(p, repoGithubId, syncedAt) {
41
+ return {
42
+ repoGithubId,
43
+ number: p.number,
44
+ githubId: p.id,
45
+ title: p.title,
46
+ state: p.state === 'closed' ? 'closed' : 'open',
47
+ headRef: p.head?.ref ?? null,
48
+ baseRef: p.base?.ref ?? null,
49
+ headSha: p.head?.sha ?? null,
50
+ merged: p.merged ?? p.merged_at != null,
51
+ author: p.user?.login ?? null,
52
+ updatedAt: isoToEpochMs(p.updated_at),
53
+ syncedAt,
54
+ };
55
+ }
56
+ /** GitHub's issues API returns PRs too; this flags those so we can skip them. */
57
+ export function isPullRequest(p) {
58
+ return p.pull_request != null;
59
+ }
60
+ export function toIssueProjection(p, repoGithubId, syncedAt) {
61
+ const labels = (p.labels ?? [])
62
+ .map((l) => (typeof l === 'string' ? l : (l.name ?? '')))
63
+ .filter((l) => l !== '');
64
+ return {
65
+ repoGithubId,
66
+ number: p.number,
67
+ githubId: p.id,
68
+ title: p.title,
69
+ state: p.state === 'closed' ? 'closed' : 'open',
70
+ author: p.user?.login ?? null,
71
+ labels,
72
+ updatedAt: isoToEpochMs(p.updated_at),
73
+ syncedAt,
74
+ };
75
+ }
76
+ export function toCommitProjection(p, repoGithubId, syncedAt) {
77
+ const sha = p.sha ?? p.id ?? '';
78
+ const message = p.commit?.message ?? p.message ?? '';
79
+ const author = p.author?.login ?? p.commit?.author?.name ?? null;
80
+ const authoredAt = isoToEpochMs(p.commit?.author?.date ?? p.timestamp);
81
+ return { repoGithubId, sha, message, author, authoredAt, syncedAt };
82
+ }
83
+ export function toCheckRunProjection(p, repoGithubId, syncedAt) {
84
+ return {
85
+ repoGithubId,
86
+ githubId: p.id,
87
+ headSha: p.head_sha,
88
+ name: p.name,
89
+ status: p.status,
90
+ conclusion: p.conclusion ?? null,
91
+ syncedAt,
92
+ };
93
+ }
94
+ //# sourceMappingURL=projection.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projection.logic.js","sourceRoot":"","sources":["../../../src/modules/github/projection.logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { InstallationPermissions } from '@cat-factory/kernel';
2
+ /**
3
+ * Whether a token with these granted permissions may create a repository.
4
+ * `POST /orgs/{org}/repos` requires repository `Administration: write`, which the
5
+ * granted-permissions map reports as `administration: 'write'`. This is the
6
+ * *proactive* guard so we avoid a round trip that is certain to 403; callers
7
+ * should still treat a live 403 as authoritative, since org policies can block
8
+ * even a correctly-permissioned App.
9
+ */
10
+ export declare function canCreateRepo(permissions: InstallationPermissions): boolean;
11
+ //# sourceMappingURL=provisioning.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/github/provisioning.logic.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAA;AASlE;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAE3E"}
@@ -0,0 +1,18 @@
1
+ // Pure capability logic for the two-App provisioning model (ADR 0005). No I/O —
2
+ // just the rule for whether a token may create a repo, so it's trivially
3
+ // unit-testable and shared between the worker adapter and any future caller.
4
+ //
5
+ // Which App a workspace uses is decided per *installation* (the App that owns it,
6
+ // recorded on the binding), not by an org allow-list — see GitHubAppRegistry.
7
+ /**
8
+ * Whether a token with these granted permissions may create a repository.
9
+ * `POST /orgs/{org}/repos` requires repository `Administration: write`, which the
10
+ * granted-permissions map reports as `administration: 'write'`. This is the
11
+ * *proactive* guard so we avoid a round trip that is certain to 403; callers
12
+ * should still treat a live 403 as authoritative, since org policies can block
13
+ * even a correctly-permissioned App.
14
+ */
15
+ export function canCreateRepo(permissions) {
16
+ return permissions.administration === 'write';
17
+ }
18
+ //# sourceMappingURL=provisioning.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provisioning.logic.js","sourceRoot":"","sources":["../../../src/modules/github/provisioning.logic.ts"],"names":[],"mappings":"AAEA,gFAAgF;AAChF,yEAAyE;AACzE,6EAA6E;AAC7E,EAAE;AACF,kFAAkF;AAClF,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,WAAoC;IAChE,OAAO,WAAW,CAAC,cAAc,KAAK,OAAO,CAAA;AAC/C,CAAC"}
@@ -0,0 +1,16 @@
1
+ /** A vendor-agnostic incident candidate the picker ranks. */
2
+ export interface IncidentCandidate<T> {
3
+ /** The underlying vendor incident to return when chosen. */
4
+ raw: T;
5
+ /** Free text searched for a signal-id reference (title + summary/description). */
6
+ text: string;
7
+ /** Creation time (epoch ms); newest wins among equally-matching candidates. */
8
+ createdAtMs: number;
9
+ }
10
+ /**
11
+ * Pick the incident to enrich from the active candidates: the most recent one whose text
12
+ * references a regressed signal id, else the most recent active one. Returns null when
13
+ * there are no candidates.
14
+ */
15
+ export declare function pickIncidentToEnrich<T>(candidates: IncidentCandidate<T>[], signalIds: string[]): T | null;
16
+ //# sourceMappingURL=incident.logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident.logic.d.ts","sourceRoot":"","sources":["../../../src/modules/incident/incident.logic.ts"],"names":[],"mappings":"AAOA,6DAA6D;AAC7D,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,4DAA4D;IAC5D,GAAG,EAAE,CAAC,CAAA;IACN,kFAAkF;IAClF,IAAI,EAAE,MAAM,CAAA;IACZ,+EAA+E;IAC/E,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,UAAU,EAAE,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAClC,SAAS,EAAE,MAAM,EAAE,GAClB,CAAC,GAAG,IAAI,CAUV"}
@@ -0,0 +1,23 @@
1
+ // Shared, pure selection logic for the incident-enrichment providers (PagerDuty +
2
+ // incident.io). On a release regression the on-call investigation is annotated onto the
3
+ // incident the regression most likely belongs to. Neither vendor reliably carries the
4
+ // originating Datadog monitor/SLO id, so we PREFER an active incident whose text
5
+ // references one of the regressed signal ids (the precise match) and fall back to the
6
+ // most recent active incident in the window when none do.
7
+ /**
8
+ * Pick the incident to enrich from the active candidates: the most recent one whose text
9
+ * references a regressed signal id, else the most recent active one. Returns null when
10
+ * there are no candidates.
11
+ */
12
+ export function pickIncidentToEnrich(candidates, signalIds) {
13
+ if (candidates.length === 0)
14
+ return null;
15
+ const byRecency = [...candidates].sort((a, b) => b.createdAtMs - a.createdAtMs);
16
+ if (signalIds.length > 0) {
17
+ const referenced = byRecency.find((c) => signalIds.some((id) => id !== '' && c.text.includes(id)));
18
+ if (referenced)
19
+ return referenced.raw;
20
+ }
21
+ return byRecency[0].raw;
22
+ }
23
+ //# sourceMappingURL=incident.logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"incident.logic.js","sourceRoot":"","sources":["../../../src/modules/incident/incident.logic.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,wFAAwF;AACxF,sFAAsF;AACtF,iFAAiF;AACjF,sFAAsF;AACtF,0DAA0D;AAY1D;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAClC,UAAkC,EAClC,SAAmB;IAEnB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IACxC,MAAM,SAAS,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAA;IAC/E,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CACtC,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CACzD,CAAA;QACD,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC,GAAG,CAAA;IACvC,CAAC;IACD,OAAO,SAAS,CAAC,CAAC,CAAE,CAAC,GAAG,CAAA;AAC1B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import type { IncidentEnrichmentProvider, IncidentMatchQuery, IncidentUpdate } from '@cat-factory/kernel';
2
+ type FetchLike = typeof fetch;
3
+ export interface IncidentIoEnrichmentProviderOptions {
4
+ /** incident.io API key (Bearer). */
5
+ apiKey: string;
6
+ /** API base; defaults to the public endpoint. */
7
+ apiBase?: string;
8
+ fetchImpl?: FetchLike;
9
+ }
10
+ export declare class IncidentIoEnrichmentProvider implements IncidentEnrichmentProvider {
11
+ private readonly opts;
12
+ private readonly apiBase;
13
+ private readonly fetchImpl;
14
+ constructor(opts: IncidentIoEnrichmentProviderOptions);
15
+ /**
16
+ * Find the live incident the regression most likely belongs to — preferring one whose
17
+ * name/summary references a regressed signal id, else the most recent live incident in
18
+ * the window — and post the investigation as an incident update onto it. No-op when none
19
+ * matches.
20
+ */
21
+ enrich(query: IncidentMatchQuery, update: IncidentUpdate): Promise<void>;
22
+ private findActiveIncident;
23
+ private headers;
24
+ }
25
+ export {};
26
+ //# sourceMappingURL=IncidentIoEnrichmentProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncidentIoEnrichmentProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/incidentio/IncidentIoEnrichmentProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,cAAc,EACf,MAAM,qBAAqB,CAAA;AAS5B,KAAK,SAAS,GAAG,OAAO,KAAK,CAAA;AAE7B,MAAM,WAAW,mCAAmC;IAClD,oCAAoC;IACpC,MAAM,EAAE,MAAM,CAAA;IACd,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAYD,qBAAa,4BAA6B,YAAW,0BAA0B;IAIjE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAErC,YAA6B,IAAI,EAAE,mCAAmC,EAGrE;IAED;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7E;YAEa,kBAAkB;IAuChC,OAAO,CAAC,OAAO;CAMhB"}
@@ -0,0 +1,84 @@
1
+ import { pickIncidentToEnrich } from '../incident/incident.logic.js';
2
+ export class IncidentIoEnrichmentProvider {
3
+ opts;
4
+ apiBase;
5
+ fetchImpl;
6
+ constructor(opts) {
7
+ this.opts = opts;
8
+ this.apiBase = (opts.apiBase ?? 'https://api.incident.io').replace(/\/+$/, '');
9
+ this.fetchImpl = opts.fetchImpl ?? fetch;
10
+ }
11
+ /**
12
+ * Find the live incident the regression most likely belongs to — preferring one whose
13
+ * name/summary references a regressed signal id, else the most recent live incident in
14
+ * the window — and post the investigation as an incident update onto it. No-op when none
15
+ * matches.
16
+ */
17
+ async enrich(query, update) {
18
+ const incident = await this.findActiveIncident(query);
19
+ if (!incident)
20
+ return;
21
+ const res = await this.fetchImpl(`${this.apiBase}/v2/incident_updates`, {
22
+ method: 'POST',
23
+ headers: { ...this.headers(), 'content-type': 'application/json' },
24
+ body: JSON.stringify({
25
+ incident_id: incident.id,
26
+ message: renderUpdate(update),
27
+ }),
28
+ });
29
+ if (!res.ok) {
30
+ throw new Error(`incident.io update failed: HTTP ${res.status}`);
31
+ }
32
+ }
33
+ async findActiveIncident(query) {
34
+ // incident.io's list endpoint has no server-side recency filter we can rely on (its
35
+ // `status` filter keys on workspace-specific status ids, not categories), so we page
36
+ // through with the `after` cursor and filter client-side. Bounded to a handful of
37
+ // pages so a busy workspace's live incident isn't missed behind the first page (the
38
+ // old `page_size=25`-only read) while we still can't loop unboundedly.
39
+ const live = [];
40
+ let after;
41
+ for (let page = 0; page < 8; page++) {
42
+ const params = new URLSearchParams({ page_size: '50' });
43
+ if (after)
44
+ params.set('after', after);
45
+ const res = await this.fetchImpl(`${this.apiBase}/v2/incidents?${params.toString()}`, {
46
+ method: 'GET',
47
+ headers: this.headers(),
48
+ });
49
+ if (!res.ok)
50
+ break;
51
+ const data = (await res.json());
52
+ const batch = data.incidents ?? [];
53
+ for (const i of batch) {
54
+ const category = i.incident_status?.category;
55
+ if (category && (category === 'closed' || category === 'declined'))
56
+ continue;
57
+ if (!i.created_at || new Date(i.created_at).getTime() >= query.since)
58
+ live.push(i);
59
+ }
60
+ after = data.pagination_meta?.after ?? undefined;
61
+ if (!after || batch.length === 0)
62
+ break;
63
+ }
64
+ return pickIncidentToEnrich(live.map((i) => ({
65
+ raw: i,
66
+ text: `${i.name ?? ''} ${i.summary ?? ''} ${i.reference ?? ''}`,
67
+ createdAtMs: i.created_at ? new Date(i.created_at).getTime() : 0,
68
+ })), query.signalIds);
69
+ }
70
+ headers() {
71
+ return {
72
+ authorization: `Bearer ${this.opts.apiKey}`,
73
+ accept: 'application/json',
74
+ };
75
+ }
76
+ }
77
+ /** Render an investigation update into an incident.io update message (markdown). */
78
+ function renderUpdate(update) {
79
+ const lines = [`**cat-factory on-call: ${update.title}**`, '', update.body];
80
+ if (update.prUrl)
81
+ lines.push('', `Suspect PR: ${update.prUrl}`);
82
+ return lines.join('\n');
83
+ }
84
+ //# sourceMappingURL=IncidentIoEnrichmentProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IncidentIoEnrichmentProvider.js","sourceRoot":"","sources":["../../../src/modules/incidentio/IncidentIoEnrichmentProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { IncidentEnrichmentProvider, IncidentMatchQuery, IncidentUpdate } from '@cat-factory/kernel';
2
+ type FetchLike = typeof fetch;
3
+ export interface PagerDutyEnrichmentProviderOptions {
4
+ /** PagerDuty REST API token (a general-access or user token). */
5
+ apiToken: string;
6
+ /** Email of the user notes are attributed to (PagerDuty requires a `From` header). */
7
+ fromEmail: string;
8
+ /** API base; defaults to the public endpoint. */
9
+ apiBase?: string;
10
+ fetchImpl?: FetchLike;
11
+ }
12
+ export declare class PagerDutyEnrichmentProvider implements IncidentEnrichmentProvider {
13
+ private readonly opts;
14
+ private readonly apiBase;
15
+ private readonly fetchImpl;
16
+ constructor(opts: PagerDutyEnrichmentProviderOptions);
17
+ /**
18
+ * Find the active (triggered/acknowledged) incident the regression most likely belongs
19
+ * to — preferring one whose text references a regressed signal id, else the most recent
20
+ * in the window — and post the investigation as a note onto it. No-op when none matches.
21
+ */
22
+ enrich(query: IncidentMatchQuery, update: IncidentUpdate): Promise<void>;
23
+ private findActiveIncident;
24
+ private headers;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=PagerDutyEnrichmentProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagerDutyEnrichmentProvider.d.ts","sourceRoot":"","sources":["../../../src/modules/pagerduty/PagerDutyEnrichmentProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,0BAA0B,EAC1B,kBAAkB,EAClB,cAAc,EACf,MAAM,qBAAqB,CAAA;AAS5B,KAAK,SAAS,GAAG,OAAO,KAAK,CAAA;AAE7B,MAAM,WAAW,kCAAkC;IACjD,iEAAiE;IACjE,QAAQ,EAAE,MAAM,CAAA;IAChB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAA;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,SAAS,CAAA;CACtB;AAWD,qBAAa,2BAA4B,YAAW,0BAA0B;IAIhE,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAErC,YAA6B,IAAI,EAAE,kCAAkC,EAGpE;IAED;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAW7E;YAEa,kBAAkB;IAwBhC,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,65 @@
1
+ import { pickIncidentToEnrich } from '../incident/incident.logic.js';
2
+ export class PagerDutyEnrichmentProvider {
3
+ opts;
4
+ apiBase;
5
+ fetchImpl;
6
+ constructor(opts) {
7
+ this.opts = opts;
8
+ this.apiBase = (opts.apiBase ?? 'https://api.pagerduty.com').replace(/\/+$/, '');
9
+ this.fetchImpl = opts.fetchImpl ?? fetch;
10
+ }
11
+ /**
12
+ * Find the active (triggered/acknowledged) incident the regression most likely belongs
13
+ * to — preferring one whose text references a regressed signal id, else the most recent
14
+ * in the window — and post the investigation as a note onto it. No-op when none matches.
15
+ */
16
+ async enrich(query, update) {
17
+ const incident = await this.findActiveIncident(query);
18
+ if (!incident)
19
+ return;
20
+ const res = await this.fetchImpl(`${this.apiBase}/incidents/${incident.id}/notes`, {
21
+ method: 'POST',
22
+ headers: { ...this.headers(), 'content-type': 'application/json' },
23
+ body: JSON.stringify({ note: { content: renderNote(update) } }),
24
+ });
25
+ if (!res.ok) {
26
+ throw new Error(`PagerDuty note failed: HTTP ${res.status}`);
27
+ }
28
+ }
29
+ async findActiveIncident(query) {
30
+ const since = new Date(query.since).toISOString();
31
+ const params = new URLSearchParams({ since, 'statuses[]': 'triggered' });
32
+ params.append('statuses[]', 'acknowledged');
33
+ params.set('sort_by', 'created_at:desc');
34
+ // Pull a handful of candidates (not just the newest) so a signal-id match can win over
35
+ // bare recency when several incidents are open in the release window.
36
+ params.set('limit', '25');
37
+ const res = await this.fetchImpl(`${this.apiBase}/incidents?${params.toString()}`, {
38
+ method: 'GET',
39
+ headers: this.headers(),
40
+ });
41
+ if (!res.ok)
42
+ return null;
43
+ const data = (await res.json());
44
+ return pickIncidentToEnrich((data.incidents ?? []).map((i) => ({
45
+ raw: i,
46
+ text: `${i.title ?? ''} ${i.description ?? ''} ${i.summary ?? ''}`,
47
+ createdAtMs: i.created_at ? new Date(i.created_at).getTime() : 0,
48
+ })), query.signalIds);
49
+ }
50
+ headers() {
51
+ return {
52
+ authorization: `Token token=${this.opts.apiToken}`,
53
+ accept: 'application/vnd.pagerduty+json;version=2',
54
+ from: this.opts.fromEmail,
55
+ };
56
+ }
57
+ }
58
+ /** Render an investigation update into a PagerDuty note body (plain text). */
59
+ function renderNote(update) {
60
+ const lines = [`cat-factory on-call: ${update.title}`, '', update.body];
61
+ if (update.prUrl)
62
+ lines.push('', `Suspect PR: ${update.prUrl}`);
63
+ return lines.join('\n');
64
+ }
65
+ //# sourceMappingURL=PagerDutyEnrichmentProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PagerDutyEnrichmentProvider.js","sourceRoot":"","sources":["../../../src/modules/pagerduty/PagerDutyEnrichmentProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { ApiKeyProvider, ApiKeyScope, Clock, IdGenerator, ProviderApiKeyRepository, SecretCipher, WorkspaceRepository } from '@cat-factory/kernel';
2
+ export interface ApiKeyServiceDependencies {
3
+ providerApiKeyRepository: ProviderApiKeyRepository;
4
+ workspaceRepository: WorkspaceRepository;
5
+ secretCipher: SecretCipher;
6
+ idGenerator: IdGenerator;
7
+ clock: Clock;
8
+ /** Rolling usage window for rotation; defaults to ~5h. */
9
+ usageWindowMs?: number;
10
+ }
11
+ /** Safe metadata for one pool key (never the secret). */
12
+ export interface ApiKeySummary {
13
+ id: string;
14
+ scope: ApiKeyScope;
15
+ scopeId: string;
16
+ provider: ApiKeyProvider;
17
+ label: string;
18
+ createdAt: number;
19
+ lastUsedAt: number | null;
20
+ inputTokens: number;
21
+ outputTokens: number;
22
+ requestCount: number;
23
+ }
24
+ /** A leased key: the decrypted secret plus the row id (for usage attribution). */
25
+ export interface LeasedApiKey {
26
+ keyId: string;
27
+ provider: ApiKeyProvider;
28
+ secret: string;
29
+ }
30
+ /** The extra scope segments to merge into a workspace's pool for a run. */
31
+ export interface PoolScopeOpts {
32
+ /** The workspace's owning account id (resolved automatically when omitted). */
33
+ accountId?: string | null;
34
+ /** The run initiator's `usr_*` id, to also draw from their personal keys. */
35
+ userId?: string | null;
36
+ }
37
+ export declare class ApiKeyService {
38
+ private readonly deps;
39
+ constructor(deps: ApiKeyServiceDependencies);
40
+ private get windowMs();
41
+ /** Add a key to a scope's pool. */
42
+ addKey(scope: ApiKeyScope, scopeId: string, input: {
43
+ provider: ApiKeyProvider;
44
+ label: string;
45
+ key: string;
46
+ }): Promise<ApiKeySummary>;
47
+ /** All live keys for a scope (optionally filtered by provider), metadata only. */
48
+ listKeys(scope: ApiKeyScope, scopeId: string, provider?: ApiKeyProvider): Promise<ApiKeySummary[]>;
49
+ /** Remove a key from its scope's pool. */
50
+ removeKey(scope: ApiKeyScope, scopeId: string, id: string): Promise<void>;
51
+ /**
52
+ * The merged candidate scope segments for a run: the workspace, its owning
53
+ * account (resolved when not supplied), and the initiator's user, in that order.
54
+ */
55
+ private poolScopes;
56
+ /** Whether the merged pool has at least one live key for a provider. */
57
+ hasKey(workspaceId: string, provider: ApiKeyProvider, opts?: PoolScopeOpts): Promise<boolean>;
58
+ /** Distinct providers with at least one live key across the merged pool. */
59
+ configuredProviders(workspaceId: string, opts?: PoolScopeOpts): Promise<ApiKeyProvider[]>;
60
+ /**
61
+ * Lease the least-loaded live key for a provider across the merged pool and
62
+ * return its decrypted secret. Throws ConflictError when the pool is empty so the
63
+ * caller can surface a clear "add an API key" error rather than failing deep in
64
+ * the SDK. Rotation is best-effort, not transactional (see ProviderSubscriptionService).
65
+ */
66
+ lease(workspaceId: string, provider: ApiKeyProvider, opts?: PoolScopeOpts): Promise<LeasedApiKey>;
67
+ /** Fold a completed call's usage into the leased key's rolling-window counters. */
68
+ recordUsage(keyId: string, usage: {
69
+ inputTokens: number;
70
+ outputTokens: number;
71
+ }): Promise<void>;
72
+ }
73
+ //# sourceMappingURL=ApiKeyService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApiKeyService.d.ts","sourceRoot":"","sources":["../../../src/modules/providers/ApiKeyService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EAEX,KAAK,EACL,WAAW,EAEX,wBAAwB,EACxB,YAAY,EACZ,mBAAmB,EACpB,MAAM,qBAAqB,CAAA;AAmB5B,MAAM,WAAW,yBAAyB;IACxC,wBAAwB,EAAE,wBAAwB,CAAA;IAClD,mBAAmB,EAAE,mBAAmB,CAAA;IACxC,YAAY,EAAE,YAAY,CAAA;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,KAAK,EAAE,KAAK,CAAA;IACZ,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,WAAW,CAAA;IAClB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,cAAc,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB;AAED,kFAAkF;AAClF,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,+EAA+E;IAC/E,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACvB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,yBAAyB,EAAI;IAEhE,OAAO,KAAK,QAAQ,GAEnB;IAED,mCAAmC;IAC7B,MAAM,CACV,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE;QAAE,QAAQ,EAAE,cAAc,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAC9D,OAAO,CAAC,aAAa,CAAC,CA+BxB;IAED,kFAAkF;IAC5E,QAAQ,CACZ,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,cAAc,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CAG1B;IAED,0CAA0C;IACpC,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE9E;IAED;;;OAGG;YACW,UAAU;IAWxB,wEAAwE;IAClE,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,OAAO,CAAC,CAIlB;IAED,4EAA4E;IACtE,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAG9F;IAED;;;;;OAKG;IACG,KAAK,CACT,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,cAAc,EACxB,IAAI,CAAC,EAAE,aAAa,GACnB,OAAO,CAAC,YAAY,CAAC,CAYvB;IAED,mFAAmF;IAC7E,WAAW,CACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,IAAI,CAAC,CAOf;CACF"}