@sweny-ai/providers 0.2.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.
- package/LICENSE +21 -0
- package/README.md +260 -0
- package/dist/access/allow-all.d.ts +3 -0
- package/dist/access/allow-all.d.ts.map +1 -0
- package/dist/access/allow-all.js +19 -0
- package/dist/access/allow-all.js.map +1 -0
- package/dist/access/index.d.ts +5 -0
- package/dist/access/index.d.ts.map +1 -0
- package/dist/access/index.js +4 -0
- package/dist/access/index.js.map +1 -0
- package/dist/access/role-based.d.ts +8 -0
- package/dist/access/role-based.d.ts.map +1 -0
- package/dist/access/role-based.js +42 -0
- package/dist/access/role-based.js.map +1 -0
- package/dist/access/types.d.ts +41 -0
- package/dist/access/types.d.ts.map +1 -0
- package/dist/access/types.js +20 -0
- package/dist/access/types.js.map +1 -0
- package/dist/agent-tool/factory.d.ts +4 -0
- package/dist/agent-tool/factory.d.ts.map +1 -0
- package/dist/agent-tool/factory.js +4 -0
- package/dist/agent-tool/factory.js.map +1 -0
- package/dist/agent-tool/index.d.ts +3 -0
- package/dist/agent-tool/index.d.ts.map +1 -0
- package/dist/agent-tool/index.js +2 -0
- package/dist/agent-tool/index.js.map +1 -0
- package/dist/agent-tool/types.d.ts +15 -0
- package/dist/agent-tool/types.d.ts.map +1 -0
- package/dist/agent-tool/types.js +2 -0
- package/dist/agent-tool/types.js.map +1 -0
- package/dist/auth/api-key.d.ts +6 -0
- package/dist/auth/api-key.d.ts.map +1 -0
- package/dist/auth/api-key.js +36 -0
- package/dist/auth/api-key.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +3 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/no-auth.d.ts +3 -0
- package/dist/auth/no-auth.d.ts.map +1 -0
- package/dist/auth/no-auth.js +21 -0
- package/dist/auth/no-auth.js.map +1 -0
- package/dist/auth/types.d.ts +58 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/coding-agent/claude-code.d.ts +10 -0
- package/dist/coding-agent/claude-code.d.ts.map +1 -0
- package/dist/coding-agent/claude-code.js +38 -0
- package/dist/coding-agent/claude-code.js.map +1 -0
- package/dist/coding-agent/google-gemini.d.ts +10 -0
- package/dist/coding-agent/google-gemini.d.ts.map +1 -0
- package/dist/coding-agent/google-gemini.js +29 -0
- package/dist/coding-agent/google-gemini.js.map +1 -0
- package/dist/coding-agent/index.d.ts +8 -0
- package/dist/coding-agent/index.d.ts.map +1 -0
- package/dist/coding-agent/index.js +4 -0
- package/dist/coding-agent/index.js.map +1 -0
- package/dist/coding-agent/openai-codex.d.ts +10 -0
- package/dist/coding-agent/openai-codex.d.ts.map +1 -0
- package/dist/coding-agent/openai-codex.js +29 -0
- package/dist/coding-agent/openai-codex.js.map +1 -0
- package/dist/coding-agent/shared.d.ts +10 -0
- package/dist/coding-agent/shared.d.ts.map +1 -0
- package/dist/coding-agent/shared.js +44 -0
- package/dist/coding-agent/shared.js.map +1 -0
- package/dist/coding-agent/types.d.ts +10 -0
- package/dist/coding-agent/types.d.ts.map +1 -0
- package/dist/coding-agent/types.js +2 -0
- package/dist/coding-agent/types.js.map +1 -0
- package/dist/credential-vault/aws-secrets-manager.d.ts +19 -0
- package/dist/credential-vault/aws-secrets-manager.d.ts.map +1 -0
- package/dist/credential-vault/aws-secrets-manager.js +96 -0
- package/dist/credential-vault/aws-secrets-manager.js.map +1 -0
- package/dist/credential-vault/env-vault.d.ts +15 -0
- package/dist/credential-vault/env-vault.d.ts.map +1 -0
- package/dist/credential-vault/env-vault.js +25 -0
- package/dist/credential-vault/env-vault.js.map +1 -0
- package/dist/credential-vault/index.d.ts +6 -0
- package/dist/credential-vault/index.d.ts.map +1 -0
- package/dist/credential-vault/index.js +3 -0
- package/dist/credential-vault/index.js.map +1 -0
- package/dist/credential-vault/types.d.ts +30 -0
- package/dist/credential-vault/types.d.ts.map +1 -0
- package/dist/credential-vault/types.js +2 -0
- package/dist/credential-vault/types.js.map +1 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +35 -0
- package/dist/errors.js.map +1 -0
- package/dist/incident/index.d.ts +4 -0
- package/dist/incident/index.d.ts.map +1 -0
- package/dist/incident/index.js +3 -0
- package/dist/incident/index.js.map +1 -0
- package/dist/incident/opsgenie.d.ts +19 -0
- package/dist/incident/opsgenie.d.ts.map +1 -0
- package/dist/incident/opsgenie.js +104 -0
- package/dist/incident/opsgenie.js.map +1 -0
- package/dist/incident/pagerduty.d.ts +19 -0
- package/dist/incident/pagerduty.d.ts.map +1 -0
- package/dist/incident/pagerduty.js +115 -0
- package/dist/incident/pagerduty.js.map +1 -0
- package/dist/incident/types.d.ts +67 -0
- package/dist/incident/types.d.ts.map +1 -0
- package/dist/incident/types.js +2 -0
- package/dist/incident/types.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/issue-tracking/github-issues.d.ts +22 -0
- package/dist/issue-tracking/github-issues.d.ts.map +1 -0
- package/dist/issue-tracking/github-issues.js +136 -0
- package/dist/issue-tracking/github-issues.js.map +1 -0
- package/dist/issue-tracking/index.d.ts +6 -0
- package/dist/issue-tracking/index.d.ts.map +1 -0
- package/dist/issue-tracking/index.js +5 -0
- package/dist/issue-tracking/index.js.map +1 -0
- package/dist/issue-tracking/jira.d.ts +22 -0
- package/dist/issue-tracking/jira.d.ts.map +1 -0
- package/dist/issue-tracking/jira.js +225 -0
- package/dist/issue-tracking/jira.js.map +1 -0
- package/dist/issue-tracking/linear.d.ts +16 -0
- package/dist/issue-tracking/linear.d.ts.map +1 -0
- package/dist/issue-tracking/linear.js +311 -0
- package/dist/issue-tracking/linear.js.map +1 -0
- package/dist/issue-tracking/types.d.ts +163 -0
- package/dist/issue-tracking/types.d.ts.map +1 -0
- package/dist/issue-tracking/types.js +28 -0
- package/dist/issue-tracking/types.js.map +1 -0
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +7 -0
- package/dist/logger.js.map +1 -0
- package/dist/messaging/index.d.ts +6 -0
- package/dist/messaging/index.d.ts.map +1 -0
- package/dist/messaging/index.js +3 -0
- package/dist/messaging/index.js.map +1 -0
- package/dist/messaging/slack.d.ts +16 -0
- package/dist/messaging/slack.d.ts.map +1 -0
- package/dist/messaging/slack.js +41 -0
- package/dist/messaging/slack.js.map +1 -0
- package/dist/messaging/teams.d.ts +22 -0
- package/dist/messaging/teams.d.ts.map +1 -0
- package/dist/messaging/teams.js +125 -0
- package/dist/messaging/teams.js.map +1 -0
- package/dist/messaging/types.d.ts +30 -0
- package/dist/messaging/types.d.ts.map +1 -0
- package/dist/messaging/types.js +2 -0
- package/dist/messaging/types.js.map +1 -0
- package/dist/notification/discord-webhook.d.ts +16 -0
- package/dist/notification/discord-webhook.d.ts.map +1 -0
- package/dist/notification/discord-webhook.js +104 -0
- package/dist/notification/discord-webhook.js.map +1 -0
- package/dist/notification/email.d.ts +22 -0
- package/dist/notification/email.d.ts.map +1 -0
- package/dist/notification/email.js +127 -0
- package/dist/notification/email.js.map +1 -0
- package/dist/notification/github-summary.d.ts +13 -0
- package/dist/notification/github-summary.d.ts.map +1 -0
- package/dist/notification/github-summary.js +67 -0
- package/dist/notification/github-summary.js.map +1 -0
- package/dist/notification/index.d.ts +8 -0
- package/dist/notification/index.d.ts.map +1 -0
- package/dist/notification/index.js +7 -0
- package/dist/notification/index.js.map +1 -0
- package/dist/notification/slack-webhook.d.ts +16 -0
- package/dist/notification/slack-webhook.d.ts.map +1 -0
- package/dist/notification/slack-webhook.js +123 -0
- package/dist/notification/slack-webhook.js.map +1 -0
- package/dist/notification/teams-webhook.d.ts +16 -0
- package/dist/notification/teams-webhook.d.ts.map +1 -0
- package/dist/notification/teams-webhook.js +125 -0
- package/dist/notification/teams-webhook.js.map +1 -0
- package/dist/notification/types.d.ts +47 -0
- package/dist/notification/types.d.ts.map +1 -0
- package/dist/notification/types.js +2 -0
- package/dist/notification/types.js.map +1 -0
- package/dist/notification/webhook.d.ts +28 -0
- package/dist/notification/webhook.d.ts.map +1 -0
- package/dist/notification/webhook.js +64 -0
- package/dist/notification/webhook.js.map +1 -0
- package/dist/observability/cloudwatch.d.ts +19 -0
- package/dist/observability/cloudwatch.d.ts.map +1 -0
- package/dist/observability/cloudwatch.js +182 -0
- package/dist/observability/cloudwatch.js.map +1 -0
- package/dist/observability/datadog.d.ts +22 -0
- package/dist/observability/datadog.d.ts.map +1 -0
- package/dist/observability/datadog.js +139 -0
- package/dist/observability/datadog.js.map +1 -0
- package/dist/observability/elastic.d.ts +42 -0
- package/dist/observability/elastic.d.ts.map +1 -0
- package/dist/observability/elastic.js +244 -0
- package/dist/observability/elastic.js.map +1 -0
- package/dist/observability/file.d.ts +16 -0
- package/dist/observability/file.d.ts.map +1 -0
- package/dist/observability/file.js +92 -0
- package/dist/observability/file.js.map +1 -0
- package/dist/observability/index.d.ts +10 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +9 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/loki.d.ts +22 -0
- package/dist/observability/loki.d.ts.map +1 -0
- package/dist/observability/loki.js +206 -0
- package/dist/observability/loki.js.map +1 -0
- package/dist/observability/newrelic.d.ts +22 -0
- package/dist/observability/newrelic.d.ts.map +1 -0
- package/dist/observability/newrelic.js +147 -0
- package/dist/observability/newrelic.js.map +1 -0
- package/dist/observability/sentry.d.ts +25 -0
- package/dist/observability/sentry.d.ts.map +1 -0
- package/dist/observability/sentry.js +151 -0
- package/dist/observability/sentry.js.map +1 -0
- package/dist/observability/splunk.d.ts +22 -0
- package/dist/observability/splunk.d.ts.map +1 -0
- package/dist/observability/splunk.js +178 -0
- package/dist/observability/splunk.js.map +1 -0
- package/dist/observability/types.d.ts +54 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +2 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/source-control/github.d.ts +11 -0
- package/dist/source-control/github.d.ts.map +1 -0
- package/dist/source-control/github.js +162 -0
- package/dist/source-control/github.js.map +1 -0
- package/dist/source-control/gitlab.d.ts +25 -0
- package/dist/source-control/gitlab.d.ts.map +1 -0
- package/dist/source-control/gitlab.js +224 -0
- package/dist/source-control/gitlab.js.map +1 -0
- package/dist/source-control/index.d.ts +6 -0
- package/dist/source-control/index.d.ts.map +1 -0
- package/dist/source-control/index.js +3 -0
- package/dist/source-control/index.js.map +1 -0
- package/dist/source-control/types.d.ts +115 -0
- package/dist/source-control/types.d.ts.map +1 -0
- package/dist/source-control/types.js +2 -0
- package/dist/source-control/types.js.map +1 -0
- package/dist/storage/csi.d.ts +36 -0
- package/dist/storage/csi.d.ts.map +1 -0
- package/dist/storage/csi.js +39 -0
- package/dist/storage/csi.js.map +1 -0
- package/dist/storage/fs.d.ts +5 -0
- package/dist/storage/fs.d.ts.map +1 -0
- package/dist/storage/fs.js +11 -0
- package/dist/storage/fs.js.map +1 -0
- package/dist/storage/index.d.ts +13 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +14 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/memory/fs.d.ts +15 -0
- package/dist/storage/memory/fs.d.ts.map +1 -0
- package/dist/storage/memory/fs.js +65 -0
- package/dist/storage/memory/fs.js.map +1 -0
- package/dist/storage/memory/s3.d.ts +17 -0
- package/dist/storage/memory/s3.d.ts.map +1 -0
- package/dist/storage/memory/s3.js +77 -0
- package/dist/storage/memory/s3.js.map +1 -0
- package/dist/storage/s3.d.ts +7 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +12 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/session/fs.d.ts +16 -0
- package/dist/storage/session/fs.d.ts.map +1 -0
- package/dist/storage/session/fs.js +81 -0
- package/dist/storage/session/fs.js.map +1 -0
- package/dist/storage/session/s3.d.ts +18 -0
- package/dist/storage/session/s3.d.ts.map +1 -0
- package/dist/storage/session/s3.js +121 -0
- package/dist/storage/session/s3.js.map +1 -0
- package/dist/storage/types.d.ts +206 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +10 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/storage/workspace/fs.d.ts +18 -0
- package/dist/storage/workspace/fs.d.ts.map +1 -0
- package/dist/storage/workspace/fs.js +153 -0
- package/dist/storage/workspace/fs.js.map +1 -0
- package/dist/storage/workspace/s3.d.ts +20 -0
- package/dist/storage/workspace/s3.d.ts.map +1 -0
- package/dist/storage/workspace/s3.js +180 -0
- package/dist/storage/workspace/s3.js.map +1 -0
- package/package.json +137 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { consoleLogger } from "../logger.js";
|
|
3
|
+
import { ProviderApiError } from "../errors.js";
|
|
4
|
+
const LINEAR_API_URL = "https://api.linear.app/graphql";
|
|
5
|
+
const DEFAULT_OPEN_STATES = ["Triage", "Backlog", "Todo", "In Progress", "Peer Review", "In Review", "QA", "Blocked"];
|
|
6
|
+
export const linearConfigSchema = z.object({
|
|
7
|
+
apiKey: z.string().min(1, "Linear API key is required"),
|
|
8
|
+
logger: z.custom().optional(),
|
|
9
|
+
});
|
|
10
|
+
export function linear(config) {
|
|
11
|
+
const parsed = linearConfigSchema.parse(config);
|
|
12
|
+
return new LinearProvider(parsed);
|
|
13
|
+
}
|
|
14
|
+
class LinearProvider {
|
|
15
|
+
apiKey;
|
|
16
|
+
log;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.apiKey = config.apiKey;
|
|
19
|
+
this.log = config.logger ?? consoleLogger;
|
|
20
|
+
}
|
|
21
|
+
async request(query, variables) {
|
|
22
|
+
const response = await fetch(LINEAR_API_URL, {
|
|
23
|
+
method: "POST",
|
|
24
|
+
headers: {
|
|
25
|
+
"Content-Type": "application/json",
|
|
26
|
+
Authorization: this.apiKey,
|
|
27
|
+
},
|
|
28
|
+
body: JSON.stringify({ query, variables }),
|
|
29
|
+
});
|
|
30
|
+
if (!response.ok) {
|
|
31
|
+
const body = await response.text().catch(() => "");
|
|
32
|
+
throw new ProviderApiError("Linear", response.status, response.statusText, body);
|
|
33
|
+
}
|
|
34
|
+
const json = (await response.json());
|
|
35
|
+
if (json.errors && json.errors.length > 0) {
|
|
36
|
+
throw new ProviderApiError("Linear", response.status, response.statusText, JSON.stringify(json.errors));
|
|
37
|
+
}
|
|
38
|
+
return json.data;
|
|
39
|
+
}
|
|
40
|
+
async verifyAccess() {
|
|
41
|
+
this.log.info("Verifying Linear API access...");
|
|
42
|
+
const result = await this.request(`
|
|
43
|
+
query {
|
|
44
|
+
viewer {
|
|
45
|
+
id
|
|
46
|
+
name
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
`);
|
|
50
|
+
this.log.info(`Linear access verified as ${result.viewer.name} (${result.viewer.id})`);
|
|
51
|
+
}
|
|
52
|
+
async createIssue(opts) {
|
|
53
|
+
this.log.info(`Creating Linear issue: ${opts.title}`);
|
|
54
|
+
const input = {
|
|
55
|
+
title: opts.title,
|
|
56
|
+
teamId: opts.projectId,
|
|
57
|
+
};
|
|
58
|
+
if (opts.description !== undefined)
|
|
59
|
+
input.description = opts.description;
|
|
60
|
+
if (opts.labels !== undefined)
|
|
61
|
+
input.labelIds = opts.labels;
|
|
62
|
+
if (opts.priority !== undefined)
|
|
63
|
+
input.priority = opts.priority;
|
|
64
|
+
if (opts.stateId !== undefined)
|
|
65
|
+
input.stateId = opts.stateId;
|
|
66
|
+
const mutation = `
|
|
67
|
+
mutation CreateIssue($input: IssueCreateInput!) {
|
|
68
|
+
issueCreate(input: $input) {
|
|
69
|
+
success
|
|
70
|
+
issue {
|
|
71
|
+
id
|
|
72
|
+
identifier
|
|
73
|
+
title
|
|
74
|
+
url
|
|
75
|
+
branchName
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
`;
|
|
80
|
+
const result = await this.request(mutation, { input });
|
|
81
|
+
if (!result.issueCreate.success) {
|
|
82
|
+
throw new Error("Failed to create Linear issue");
|
|
83
|
+
}
|
|
84
|
+
const issue = result.issueCreate.issue;
|
|
85
|
+
this.log.info(`Created issue ${issue.identifier} (${issue.url})`);
|
|
86
|
+
return {
|
|
87
|
+
id: issue.id,
|
|
88
|
+
identifier: issue.identifier,
|
|
89
|
+
title: issue.title,
|
|
90
|
+
url: issue.url,
|
|
91
|
+
branchName: issue.branchName,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
async getIssue(identifier) {
|
|
95
|
+
this.log.info(`Fetching Linear issue ${identifier}`);
|
|
96
|
+
const query = `
|
|
97
|
+
query GetIssue($identifier: String!) {
|
|
98
|
+
issue(id: $identifier) {
|
|
99
|
+
id
|
|
100
|
+
identifier
|
|
101
|
+
title
|
|
102
|
+
url
|
|
103
|
+
branchName
|
|
104
|
+
state {
|
|
105
|
+
name
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
`;
|
|
110
|
+
const result = await this.request(query, { identifier });
|
|
111
|
+
if (!result.issue) {
|
|
112
|
+
throw new Error(`Issue "${identifier}" not found`);
|
|
113
|
+
}
|
|
114
|
+
const issue = result.issue;
|
|
115
|
+
this.log.debug(`Fetched issue ${issue.identifier}: ${issue.title} [${issue.state.name}]`);
|
|
116
|
+
return {
|
|
117
|
+
id: issue.id,
|
|
118
|
+
identifier: issue.identifier,
|
|
119
|
+
title: issue.title,
|
|
120
|
+
url: issue.url,
|
|
121
|
+
branchName: issue.branchName,
|
|
122
|
+
state: issue.state.name,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async updateIssue(issueId, opts) {
|
|
126
|
+
this.log.info(`Updating Linear issue ${issueId}`);
|
|
127
|
+
if (opts.stateId || opts.description) {
|
|
128
|
+
const updateInput = {};
|
|
129
|
+
if (opts.stateId)
|
|
130
|
+
updateInput.stateId = opts.stateId;
|
|
131
|
+
if (opts.description)
|
|
132
|
+
updateInput.description = opts.description;
|
|
133
|
+
await this.request(`
|
|
134
|
+
mutation UpdateIssue($id: String!, $input: IssueUpdateInput!) {
|
|
135
|
+
issueUpdate(id: $id, input: $input) {
|
|
136
|
+
success
|
|
137
|
+
issue { id identifier state { name } }
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
`, { id: issueId, input: updateInput });
|
|
141
|
+
this.log.info(`Issue ${issueId} fields updated`);
|
|
142
|
+
}
|
|
143
|
+
if (opts.comment) {
|
|
144
|
+
await this.addComment(issueId, opts.comment);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async searchIssues(opts) {
|
|
148
|
+
const stateNames = opts.states ?? DEFAULT_OPEN_STATES;
|
|
149
|
+
this.log.info(`Searching Linear issues: "${opts.query}" in project ${opts.projectId}`);
|
|
150
|
+
const query = `
|
|
151
|
+
query SearchIssues($teamId: String!, $filter: IssueFilter) {
|
|
152
|
+
team(id: $teamId) {
|
|
153
|
+
issues(filter: $filter, first: 10) {
|
|
154
|
+
nodes {
|
|
155
|
+
id
|
|
156
|
+
identifier
|
|
157
|
+
title
|
|
158
|
+
url
|
|
159
|
+
branchName
|
|
160
|
+
state { name }
|
|
161
|
+
createdAt
|
|
162
|
+
updatedAt
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
`;
|
|
168
|
+
const filter = {
|
|
169
|
+
title: { containsIgnoreCase: opts.query },
|
|
170
|
+
state: { name: { in: stateNames } },
|
|
171
|
+
};
|
|
172
|
+
if (opts.labels && opts.labels.length > 0) {
|
|
173
|
+
filter.labels = { id: { eq: opts.labels[0] } };
|
|
174
|
+
}
|
|
175
|
+
const result = await this.request(query, { teamId: opts.projectId, filter });
|
|
176
|
+
const issues = result.team?.issues?.nodes ?? [];
|
|
177
|
+
this.log.info(`Found ${issues.length} matching issues`);
|
|
178
|
+
return issues.map((i) => ({
|
|
179
|
+
id: i.id,
|
|
180
|
+
identifier: i.identifier,
|
|
181
|
+
title: i.title,
|
|
182
|
+
url: i.url,
|
|
183
|
+
branchName: i.branchName,
|
|
184
|
+
state: i.state.name,
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
async addComment(issueId, body) {
|
|
188
|
+
await this.request(`
|
|
189
|
+
mutation CreateComment($input: CommentCreateInput!) {
|
|
190
|
+
commentCreate(input: $input) { success }
|
|
191
|
+
}
|
|
192
|
+
`, { input: { issueId, body } });
|
|
193
|
+
this.log.info(`Comment added to issue ${issueId}`);
|
|
194
|
+
}
|
|
195
|
+
async linkPr(issueId, prUrl, prNumber) {
|
|
196
|
+
this.log.info(`Linking PR #${prNumber} to issue ${issueId}`);
|
|
197
|
+
await this.request(`
|
|
198
|
+
mutation CreateAttachment($input: AttachmentCreateInput!) {
|
|
199
|
+
attachmentCreate(input: $input) { success attachment { id } }
|
|
200
|
+
}
|
|
201
|
+
`, { input: { issueId, url: prUrl, title: `GitHub PR #${prNumber}` } });
|
|
202
|
+
await this.addComment(issueId, `**Pull Request Created**: [PR #${prNumber}](${prUrl})`);
|
|
203
|
+
this.log.info(`PR #${prNumber} linked to issue ${issueId}`);
|
|
204
|
+
}
|
|
205
|
+
async listTriageHistory(projectId, labelId, days = 30) {
|
|
206
|
+
const since = new Date(Date.now() - days * 24 * 60 * 60 * 1000).toISOString();
|
|
207
|
+
this.log.info(`Listing triage history for project ${projectId} (last ${days} days)`);
|
|
208
|
+
const query = `
|
|
209
|
+
query TriageHistory($teamId: String!, $filter: IssueFilter) {
|
|
210
|
+
team(id: $teamId) {
|
|
211
|
+
issues(filter: $filter, first: 50, orderBy: createdAt) {
|
|
212
|
+
nodes {
|
|
213
|
+
id
|
|
214
|
+
identifier
|
|
215
|
+
title
|
|
216
|
+
url
|
|
217
|
+
description
|
|
218
|
+
state { name type }
|
|
219
|
+
createdAt
|
|
220
|
+
updatedAt
|
|
221
|
+
labels { nodes { name } }
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
`;
|
|
227
|
+
const filter = {
|
|
228
|
+
labels: { id: { eq: labelId } },
|
|
229
|
+
createdAt: { gte: since },
|
|
230
|
+
};
|
|
231
|
+
const result = await this.request(query, { teamId: projectId, filter });
|
|
232
|
+
const issues = result.team?.issues?.nodes ?? [];
|
|
233
|
+
const entries = issues.map((issue) => {
|
|
234
|
+
let fingerprint = null;
|
|
235
|
+
if (issue.description) {
|
|
236
|
+
const match = issue.description.match(/<!-- TRIAGE_FINGERPRINT\n([\s\S]*?)-->/);
|
|
237
|
+
if (match) {
|
|
238
|
+
fingerprint = match[1].trim();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
identifier: issue.identifier,
|
|
243
|
+
title: issue.title,
|
|
244
|
+
state: issue.state.name,
|
|
245
|
+
stateType: issue.state.type,
|
|
246
|
+
url: issue.url,
|
|
247
|
+
descriptionSnippet: issue.description ? issue.description.slice(0, 200) : null,
|
|
248
|
+
fingerprint,
|
|
249
|
+
createdAt: issue.createdAt,
|
|
250
|
+
labels: issue.labels.nodes.map((l) => l.name),
|
|
251
|
+
};
|
|
252
|
+
});
|
|
253
|
+
this.log.info(`Found ${entries.length} triage history entries`);
|
|
254
|
+
return entries;
|
|
255
|
+
}
|
|
256
|
+
async searchByFingerprint(projectId, errorPattern, opts) {
|
|
257
|
+
this.log.info(`Searching by fingerprint: "${errorPattern}" in project ${projectId}`);
|
|
258
|
+
const query = `
|
|
259
|
+
query FingerprintSearch($teamId: String!, $filter: IssueFilter) {
|
|
260
|
+
team(id: $teamId) {
|
|
261
|
+
issues(filter: $filter, first: 50, orderBy: updatedAt) {
|
|
262
|
+
nodes {
|
|
263
|
+
id
|
|
264
|
+
identifier
|
|
265
|
+
title
|
|
266
|
+
url
|
|
267
|
+
branchName
|
|
268
|
+
description
|
|
269
|
+
state { name type }
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
`;
|
|
275
|
+
const filter = {};
|
|
276
|
+
if (opts?.labelId) {
|
|
277
|
+
filter.labels = { id: { eq: opts.labelId } };
|
|
278
|
+
}
|
|
279
|
+
filter.createdAt = {
|
|
280
|
+
gte: new Date(Date.now() - 90 * 24 * 60 * 60 * 1000).toISOString(),
|
|
281
|
+
};
|
|
282
|
+
const result = await this.request(query, { teamId: projectId, filter });
|
|
283
|
+
const issues = result.team?.issues?.nodes ?? [];
|
|
284
|
+
const pattern = errorPattern.toLowerCase();
|
|
285
|
+
const service = opts?.service?.toLowerCase();
|
|
286
|
+
const matches = issues.filter((issue) => {
|
|
287
|
+
if (!issue.description)
|
|
288
|
+
return false;
|
|
289
|
+
const desc = issue.description.toLowerCase();
|
|
290
|
+
const fpMatch = desc.match(/<!-- triage_fingerprint\n([\s\S]*?)-->/);
|
|
291
|
+
if (fpMatch) {
|
|
292
|
+
const fp = fpMatch[1];
|
|
293
|
+
const hasErrorMatch = fp.includes(pattern);
|
|
294
|
+
const hasServiceMatch = !service || fp.includes(service);
|
|
295
|
+
if (hasErrorMatch && hasServiceMatch)
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
return desc.includes(pattern);
|
|
299
|
+
});
|
|
300
|
+
this.log.info(`Found ${matches.length} issues matching fingerprint`);
|
|
301
|
+
return matches.map((m) => ({
|
|
302
|
+
id: m.id,
|
|
303
|
+
identifier: m.identifier,
|
|
304
|
+
title: m.title,
|
|
305
|
+
url: m.url,
|
|
306
|
+
branchName: m.branchName,
|
|
307
|
+
state: m.state.name,
|
|
308
|
+
}));
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/issue-tracking/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/** An issue from an issue tracking provider. */
|
|
2
|
+
export interface Issue {
|
|
3
|
+
/** Provider-specific unique identifier. */
|
|
4
|
+
id: string;
|
|
5
|
+
/** Human-readable identifier (e.g., "PROJ-123"). */
|
|
6
|
+
identifier: string;
|
|
7
|
+
/** Issue title / summary. */
|
|
8
|
+
title: string;
|
|
9
|
+
/** Web URL to view the issue. */
|
|
10
|
+
url: string;
|
|
11
|
+
/** Suggested git branch name derived from the issue. */
|
|
12
|
+
branchName: string;
|
|
13
|
+
/** Current workflow state (e.g., "open", "in progress", "done"). */
|
|
14
|
+
state?: string;
|
|
15
|
+
}
|
|
16
|
+
/** Options for creating a new issue. */
|
|
17
|
+
export interface IssueCreateOptions {
|
|
18
|
+
/** Issue title / summary. */
|
|
19
|
+
title: string;
|
|
20
|
+
/** Project or team identifier to create the issue in. */
|
|
21
|
+
projectId: string;
|
|
22
|
+
/** Markdown description body. */
|
|
23
|
+
description?: string;
|
|
24
|
+
/** Label IDs or names to attach. */
|
|
25
|
+
labels?: string[];
|
|
26
|
+
/** Priority level (provider-specific numeric scale). */
|
|
27
|
+
priority?: number;
|
|
28
|
+
/** Initial workflow state ID. */
|
|
29
|
+
stateId?: string;
|
|
30
|
+
}
|
|
31
|
+
/** Options for updating an existing issue. */
|
|
32
|
+
export interface IssueUpdateOptions {
|
|
33
|
+
/** New workflow state ID. */
|
|
34
|
+
stateId?: string;
|
|
35
|
+
/** Updated markdown description. */
|
|
36
|
+
description?: string;
|
|
37
|
+
/** Comment to add to the issue. */
|
|
38
|
+
comment?: string;
|
|
39
|
+
}
|
|
40
|
+
/** Options for searching issues. */
|
|
41
|
+
export interface IssueSearchOptions {
|
|
42
|
+
/** Project or team identifier to search within. */
|
|
43
|
+
projectId: string;
|
|
44
|
+
/** Free-text search query. */
|
|
45
|
+
query: string;
|
|
46
|
+
/** Filter by label IDs or names. */
|
|
47
|
+
labels?: string[];
|
|
48
|
+
/** Filter by workflow state names. */
|
|
49
|
+
states?: string[];
|
|
50
|
+
}
|
|
51
|
+
/** A historical triage entry used for duplicate/pattern detection. */
|
|
52
|
+
export interface TriageHistoryEntry {
|
|
53
|
+
/** Human-readable issue identifier. */
|
|
54
|
+
identifier: string;
|
|
55
|
+
/** Issue title / summary. */
|
|
56
|
+
title: string;
|
|
57
|
+
/** Current workflow state name. */
|
|
58
|
+
state: string;
|
|
59
|
+
/** State category (e.g., "triage", "started", "completed", "cancelled"). */
|
|
60
|
+
stateType: string;
|
|
61
|
+
/** Web URL to view the issue. */
|
|
62
|
+
url: string;
|
|
63
|
+
/** Truncated description for quick comparison. */
|
|
64
|
+
descriptionSnippet: string | null;
|
|
65
|
+
/** Error fingerprint hash for deduplication. */
|
|
66
|
+
fingerprint: string | null;
|
|
67
|
+
/** ISO 8601 creation timestamp. */
|
|
68
|
+
createdAt: string;
|
|
69
|
+
/** Labels attached to the issue. */
|
|
70
|
+
labels: string[];
|
|
71
|
+
}
|
|
72
|
+
/** Core interface that every issue tracking provider must implement. */
|
|
73
|
+
export interface IssueTrackingProvider {
|
|
74
|
+
/**
|
|
75
|
+
* Verify that the provider credentials and connection are valid.
|
|
76
|
+
* @returns Resolves if access is valid; rejects otherwise.
|
|
77
|
+
*/
|
|
78
|
+
verifyAccess(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Create a new issue.
|
|
81
|
+
* @param opts - Issue creation options.
|
|
82
|
+
* @returns The newly created issue.
|
|
83
|
+
*/
|
|
84
|
+
createIssue(opts: IssueCreateOptions): Promise<Issue>;
|
|
85
|
+
/**
|
|
86
|
+
* Retrieve an issue by its identifier.
|
|
87
|
+
* @param identifier - Human-readable issue identifier (e.g., "PROJ-123").
|
|
88
|
+
* @returns The matching issue.
|
|
89
|
+
*/
|
|
90
|
+
getIssue(identifier: string): Promise<Issue>;
|
|
91
|
+
/**
|
|
92
|
+
* Update an existing issue.
|
|
93
|
+
* @param issueId - Provider-specific issue ID.
|
|
94
|
+
* @param opts - Fields to update.
|
|
95
|
+
*/
|
|
96
|
+
updateIssue(issueId: string, opts: IssueUpdateOptions): Promise<void>;
|
|
97
|
+
/**
|
|
98
|
+
* Search for issues matching the given criteria.
|
|
99
|
+
* @param opts - Search filters.
|
|
100
|
+
* @returns Matching issues.
|
|
101
|
+
*/
|
|
102
|
+
searchIssues(opts: IssueSearchOptions): Promise<Issue[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Add a comment to an existing issue.
|
|
105
|
+
* @param issueId - Provider-specific issue ID.
|
|
106
|
+
* @param body - Comment body text (markdown).
|
|
107
|
+
*/
|
|
108
|
+
addComment(issueId: string, body: string): Promise<void>;
|
|
109
|
+
}
|
|
110
|
+
/** Capability for linking pull requests to issues. */
|
|
111
|
+
export interface PrLinkCapable {
|
|
112
|
+
/**
|
|
113
|
+
* Link a pull request to an issue.
|
|
114
|
+
* @param issueId - Provider-specific issue ID.
|
|
115
|
+
* @param prUrl - URL of the pull request.
|
|
116
|
+
* @param prNumber - Pull request number.
|
|
117
|
+
*/
|
|
118
|
+
linkPr(issueId: string, prUrl: string, prNumber: number): Promise<void>;
|
|
119
|
+
}
|
|
120
|
+
/** Capability for searching issues by error fingerprint. */
|
|
121
|
+
export interface FingerprintCapable {
|
|
122
|
+
/**
|
|
123
|
+
* Search for existing issues matching an error fingerprint pattern.
|
|
124
|
+
* @param projectId - Project or team identifier.
|
|
125
|
+
* @param errorPattern - Error pattern string to fingerprint-match against.
|
|
126
|
+
* @param opts - Optional filters (label, service).
|
|
127
|
+
* @returns Issues matching the fingerprint.
|
|
128
|
+
*/
|
|
129
|
+
searchByFingerprint(projectId: string, errorPattern: string, opts?: {
|
|
130
|
+
labelId?: string;
|
|
131
|
+
service?: string;
|
|
132
|
+
}): Promise<Issue[]>;
|
|
133
|
+
}
|
|
134
|
+
/** Capability for listing historical triage entries. */
|
|
135
|
+
export interface TriageHistoryCapable {
|
|
136
|
+
/**
|
|
137
|
+
* List triage history entries for a project and label.
|
|
138
|
+
* @param projectId - Project or team identifier.
|
|
139
|
+
* @param labelId - Label ID to filter by.
|
|
140
|
+
* @param days - Number of days of history to retrieve (default: provider-specific).
|
|
141
|
+
* @returns Historical triage entries.
|
|
142
|
+
*/
|
|
143
|
+
listTriageHistory(projectId: string, labelId: string, days?: number): Promise<TriageHistoryEntry[]>;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Type guard: checks whether the provider supports linking pull requests.
|
|
147
|
+
* @param p - Issue tracking provider to check.
|
|
148
|
+
* @returns True if the provider implements PrLinkCapable.
|
|
149
|
+
*/
|
|
150
|
+
export declare function canLinkPr(p: IssueTrackingProvider): p is IssueTrackingProvider & PrLinkCapable;
|
|
151
|
+
/**
|
|
152
|
+
* Type guard: checks whether the provider supports fingerprint search.
|
|
153
|
+
* @param p - Issue tracking provider to check.
|
|
154
|
+
* @returns True if the provider implements FingerprintCapable.
|
|
155
|
+
*/
|
|
156
|
+
export declare function canSearchByFingerprint(p: IssueTrackingProvider): p is IssueTrackingProvider & FingerprintCapable;
|
|
157
|
+
/**
|
|
158
|
+
* Type guard: checks whether the provider supports triage history listing.
|
|
159
|
+
* @param p - Issue tracking provider to check.
|
|
160
|
+
* @returns True if the provider implements TriageHistoryCapable.
|
|
161
|
+
*/
|
|
162
|
+
export declare function canListTriageHistory(p: IssueTrackingProvider): p is IssueTrackingProvider & TriageHistoryCapable;
|
|
163
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/issue-tracking/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Type guards
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/**
|
|
5
|
+
* Type guard: checks whether the provider supports linking pull requests.
|
|
6
|
+
* @param p - Issue tracking provider to check.
|
|
7
|
+
* @returns True if the provider implements PrLinkCapable.
|
|
8
|
+
*/
|
|
9
|
+
export function canLinkPr(p) {
|
|
10
|
+
return "linkPr" in p && typeof p.linkPr === "function";
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Type guard: checks whether the provider supports fingerprint search.
|
|
14
|
+
* @param p - Issue tracking provider to check.
|
|
15
|
+
* @returns True if the provider implements FingerprintCapable.
|
|
16
|
+
*/
|
|
17
|
+
export function canSearchByFingerprint(p) {
|
|
18
|
+
return "searchByFingerprint" in p && typeof p.searchByFingerprint === "function";
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Type guard: checks whether the provider supports triage history listing.
|
|
22
|
+
* @param p - Issue tracking provider to check.
|
|
23
|
+
* @returns True if the provider implements TriageHistoryCapable.
|
|
24
|
+
*/
|
|
25
|
+
export function canListTriageHistory(p) {
|
|
26
|
+
return "listTriageHistory" in p && typeof p.listTriageHistory === "function";
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/issue-tracking/types.ts"],"names":[],"mappings":"AAuKA,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,CAAwB;IAChD,OAAO,QAAQ,IAAI,CAAC,IAAI,OAAQ,CAA6B,CAAC,MAAM,KAAK,UAAU,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,CAAwB;IAC7D,OAAO,qBAAqB,IAAI,CAAC,IAAI,OAAQ,CAA6B,CAAC,mBAAmB,KAAK,UAAU,CAAC;AAChH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,CAAwB;IAC3D,OAAO,mBAAmB,IAAI,CAAC,IAAI,OAAQ,CAA6B,CAAC,iBAAiB,KAAK,UAAU,CAAC;AAC5G,CAAC"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export interface Logger {
|
|
2
|
+
info(msg: string, ...args: unknown[]): void;
|
|
3
|
+
debug(msg: string, ...args: unknown[]): void;
|
|
4
|
+
warn(msg: string, ...args: unknown[]): void;
|
|
5
|
+
error(msg: string, ...args: unknown[]): void;
|
|
6
|
+
}
|
|
7
|
+
export declare const consoleLogger: Logger;
|
|
8
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,MAAM;IACrB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;IAC5C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,aAAa,EAAE,MAK3B,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const consoleLogger = {
|
|
2
|
+
info: (msg, ...args) => console.log(msg, ...args),
|
|
3
|
+
debug: (msg, ...args) => console.debug(msg, ...args),
|
|
4
|
+
warn: (msg, ...args) => console.warn(msg, ...args),
|
|
5
|
+
error: (msg, ...args) => console.error(msg, ...args),
|
|
6
|
+
};
|
|
7
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,aAAa,GAAW;IACnC,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACjD,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACpD,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IAClD,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;CACrD,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export type { MessagingProvider, ChatMessage } from "./types.js";
|
|
2
|
+
export { slack, slackMessagingConfigSchema } from "./slack.js";
|
|
3
|
+
export type { SlackMessagingConfig } from "./slack.js";
|
|
4
|
+
export { teams, teamsConfigSchema } from "./teams.js";
|
|
5
|
+
export type { TeamsMessagingConfig } from "./teams.js";
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEjE,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC/D,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAEvD,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACtD,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG/D,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import type { MessagingProvider } from "./types.js";
|
|
3
|
+
import type { Logger } from "../logger.js";
|
|
4
|
+
export declare const slackMessagingConfigSchema: z.ZodObject<{
|
|
5
|
+
token: z.ZodString;
|
|
6
|
+
logger: z.ZodOptional<z.ZodType<Logger, z.ZodTypeDef, Logger>>;
|
|
7
|
+
}, "strip", z.ZodTypeAny, {
|
|
8
|
+
token: string;
|
|
9
|
+
logger?: Logger | undefined;
|
|
10
|
+
}, {
|
|
11
|
+
token: string;
|
|
12
|
+
logger?: Logger | undefined;
|
|
13
|
+
}>;
|
|
14
|
+
export type SlackMessagingConfig = z.infer<typeof slackMessagingConfigSchema>;
|
|
15
|
+
export declare function slack(config: SlackMessagingConfig): MessagingProvider;
|
|
16
|
+
//# sourceMappingURL=slack.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.d.ts","sourceRoot":"","sources":["../../src/messaging/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAe,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAG3C,eAAO,MAAM,0BAA0B;;;;;;;;;EAGrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,wBAAgB,KAAK,CAAC,MAAM,EAAE,oBAAoB,GAAG,iBAAiB,CAqCrE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { consoleLogger } from "../logger.js";
|
|
3
|
+
export const slackMessagingConfigSchema = z.object({
|
|
4
|
+
token: z.string().min(1, "Slack bot token is required"),
|
|
5
|
+
logger: z.custom().optional(),
|
|
6
|
+
});
|
|
7
|
+
export function slack(config) {
|
|
8
|
+
const parsed = slackMessagingConfigSchema.parse(config);
|
|
9
|
+
const log = parsed.logger ?? consoleLogger;
|
|
10
|
+
// Lazy-load @slack/web-api to keep it optional
|
|
11
|
+
let clientPromise = null;
|
|
12
|
+
async function getClient() {
|
|
13
|
+
if (!clientPromise) {
|
|
14
|
+
clientPromise = import("@slack/web-api").then((mod) => new mod.WebClient(parsed.token));
|
|
15
|
+
}
|
|
16
|
+
return clientPromise;
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
async sendMessage(msg) {
|
|
20
|
+
const client = await getClient();
|
|
21
|
+
const result = await client.chat.postMessage({
|
|
22
|
+
channel: msg.channelId,
|
|
23
|
+
text: msg.text,
|
|
24
|
+
...(msg.threadId ? { thread_ts: msg.threadId } : {}),
|
|
25
|
+
...(msg.format === "markdown" ? { mrkdwn: true } : {}),
|
|
26
|
+
});
|
|
27
|
+
log.debug(`Sent message to ${msg.channelId}`);
|
|
28
|
+
return { messageId: result.ts ?? "" };
|
|
29
|
+
},
|
|
30
|
+
async updateMessage(channelId, messageId, text) {
|
|
31
|
+
const client = await getClient();
|
|
32
|
+
await client.chat.update({
|
|
33
|
+
channel: channelId,
|
|
34
|
+
ts: messageId,
|
|
35
|
+
text,
|
|
36
|
+
});
|
|
37
|
+
log.debug(`Updated message ${messageId} in ${channelId}`);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=slack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slack.js","sourceRoot":"","sources":["../../src/messaging/slack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,6BAA6B,CAAC;IACvD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAU,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAIH,MAAM,UAAU,KAAK,CAAC,MAA4B;IAChD,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC;IAE3C,+CAA+C;IAC/C,IAAI,aAAa,GAA4E,IAAI,CAAC;IAElG,KAAK,UAAU,SAAS;QACtB,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,aAAa,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,GAAgB;YAChC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;gBAC3C,OAAO,EAAE,GAAG,CAAC,SAAS;gBACtB,IAAI,EAAE,GAAG,CAAC,IAAI;gBACd,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,SAAiB,EAAE,IAAY;YACpE,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;gBACvB,OAAO,EAAE,SAAS;gBAClB,EAAE,EAAE,SAAS;gBACb,IAAI;aACL,CAAC,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,mBAAmB,SAAS,OAAO,SAAS,EAAE,CAAC,CAAC;QAC5D,CAAC;KACF,CAAC;AACJ,CAAC"}
|