patchwork-os 0.2.0-alpha.34 → 0.2.0-alpha.36
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/README.md +202 -93
- package/deploy/bootstrap-new-vps.sh +12 -12
- package/deploy/bootstrap-vps.sh +6 -3
- package/deploy/deploy-landing.sh +59 -2
- package/dist/activityLog.d.ts +49 -0
- package/dist/activityLog.js +78 -0
- package/dist/activityLog.js.map +1 -1
- package/dist/approvalHttp.d.ts +25 -0
- package/dist/approvalHttp.js +74 -18
- package/dist/approvalHttp.js.map +1 -1
- package/dist/approvalInsights.d.ts +49 -0
- package/dist/approvalInsights.js +97 -0
- package/dist/approvalInsights.js.map +1 -0
- package/dist/approvalQueue.d.ts +11 -0
- package/dist/approvalQueue.js +80 -1
- package/dist/approvalQueue.js.map +1 -1
- package/dist/approvalSignals.d.ts +124 -0
- package/dist/approvalSignals.js +512 -0
- package/dist/approvalSignals.js.map +1 -0
- package/dist/automation.d.ts +37 -0
- package/dist/automation.js +105 -61
- package/dist/automation.js.map +1 -1
- package/dist/automationSuggestions.d.ts +79 -0
- package/dist/automationSuggestions.js +150 -0
- package/dist/automationSuggestions.js.map +1 -0
- package/dist/bridge.js +78 -1
- package/dist/bridge.js.map +1 -1
- package/dist/ccPermissions.d.ts +15 -0
- package/dist/ccPermissions.js +15 -0
- package/dist/ccPermissions.js.map +1 -1
- package/dist/claudeDriver.js +74 -16
- package/dist/claudeDriver.js.map +1 -1
- package/dist/commands/patchworkInit.d.ts +8 -0
- package/dist/commands/patchworkInit.js +41 -5
- package/dist/commands/patchworkInit.js.map +1 -1
- package/dist/commands/recipe.d.ts +20 -0
- package/dist/commands/recipe.js +212 -6
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipeInstall.d.ts +79 -1
- package/dist/commands/recipeInstall.js +333 -16
- package/dist/commands/recipeInstall.js.map +1 -1
- package/dist/commands/tracesExport.d.ts +83 -0
- package/dist/commands/tracesExport.js +269 -0
- package/dist/commands/tracesExport.js.map +1 -0
- package/dist/commands/tracesImport.d.ts +56 -0
- package/dist/commands/tracesImport.js +161 -0
- package/dist/commands/tracesImport.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -1
- package/dist/config.js.map +1 -1
- package/dist/connectorRoutes.d.ts +43 -0
- package/dist/connectorRoutes.js +1023 -0
- package/dist/connectorRoutes.js.map +1 -0
- package/dist/connectors/asana.d.ts +198 -0
- package/dist/connectors/asana.js +679 -0
- package/dist/connectors/asana.js.map +1 -0
- package/dist/connectors/baseConnector.d.ts +36 -0
- package/dist/connectors/baseConnector.js +151 -28
- package/dist/connectors/baseConnector.js.map +1 -1
- package/dist/connectors/discord.d.ts +150 -0
- package/dist/connectors/discord.js +543 -0
- package/dist/connectors/discord.js.map +1 -0
- package/dist/connectors/github.js +11 -4
- package/dist/connectors/github.js.map +1 -1
- package/dist/connectors/gitlab.d.ts +180 -0
- package/dist/connectors/gitlab.js +582 -0
- package/dist/connectors/gitlab.js.map +1 -0
- package/dist/connectors/gmail.js +50 -10
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/googleCalendar.js +36 -10
- package/dist/connectors/googleCalendar.js.map +1 -1
- package/dist/connectors/googleDrive.d.ts +34 -0
- package/dist/connectors/googleDrive.js +321 -0
- package/dist/connectors/googleDrive.js.map +1 -0
- package/dist/connectors/linear.js +23 -4
- package/dist/connectors/linear.js.map +1 -1
- package/dist/connectors/mcpOAuth.js +26 -2
- package/dist/connectors/mcpOAuth.js.map +1 -1
- package/dist/connectors/oauthStateStore.d.ts +31 -0
- package/dist/connectors/oauthStateStore.js +52 -0
- package/dist/connectors/oauthStateStore.js.map +1 -0
- package/dist/connectors/pagerduty.d.ts +160 -0
- package/dist/connectors/pagerduty.js +464 -0
- package/dist/connectors/pagerduty.js.map +1 -0
- package/dist/connectors/slack.d.ts +16 -1
- package/dist/connectors/slack.js +57 -5
- package/dist/connectors/slack.js.map +1 -1
- package/dist/connectors/tokenStorage.js +27 -2
- package/dist/connectors/tokenStorage.js.map +1 -1
- package/dist/connectors/zendesk.js +19 -1
- package/dist/connectors/zendesk.js.map +1 -1
- package/dist/cors.d.ts +10 -0
- package/dist/cors.js +29 -0
- package/dist/cors.js.map +1 -0
- package/dist/decisionReplay.d.ts +72 -0
- package/dist/decisionReplay.js +92 -0
- package/dist/decisionReplay.js.map +1 -0
- package/dist/decisionTraceLog.d.ts +6 -0
- package/dist/decisionTraceLog.js +54 -2
- package/dist/decisionTraceLog.js.map +1 -1
- package/dist/featureFlags.d.ts +17 -11
- package/dist/featureFlags.js +52 -47
- package/dist/featureFlags.js.map +1 -1
- package/dist/fp/automationInterpreter.js +25 -21
- package/dist/fp/automationInterpreter.js.map +1 -1
- package/dist/fp/automationState.js +4 -1
- package/dist/fp/automationState.js.map +1 -1
- package/dist/fp/policyParser.js +4 -1
- package/dist/fp/policyParser.js.map +1 -1
- package/dist/inboxRoutes.d.ts +22 -0
- package/dist/inboxRoutes.js +114 -0
- package/dist/inboxRoutes.js.map +1 -0
- package/dist/index.js +734 -144
- package/dist/index.js.map +1 -1
- package/dist/mcpRoutes.d.ts +37 -0
- package/dist/mcpRoutes.js +76 -0
- package/dist/mcpRoutes.js.map +1 -0
- package/dist/oauth.d.ts +3 -0
- package/dist/oauth.js +151 -26
- package/dist/oauth.js.map +1 -1
- package/dist/oauthRoutes.d.ts +32 -0
- package/dist/oauthRoutes.js +124 -0
- package/dist/oauthRoutes.js.map +1 -0
- package/dist/orchestrator/orchestratorBridge.js +2 -2
- package/dist/orchestrator/orchestratorBridge.js.map +1 -1
- package/dist/patchworkConfig.d.ts +7 -0
- package/dist/patchworkConfig.js.map +1 -1
- package/dist/pluginLoader.d.ts +12 -0
- package/dist/pluginLoader.js +43 -4
- package/dist/pluginLoader.js.map +1 -1
- package/dist/pluginWatcher.js +8 -3
- package/dist/pluginWatcher.js.map +1 -1
- package/dist/preToolUseHook.d.ts +12 -0
- package/dist/preToolUseHook.js +23 -0
- package/dist/preToolUseHook.js.map +1 -1
- package/dist/recipeOrchestration.d.ts +8 -0
- package/dist/recipeOrchestration.js +320 -39
- package/dist/recipeOrchestration.js.map +1 -1
- package/dist/recipeRoutes.d.ts +154 -0
- package/dist/recipeRoutes.js +1098 -0
- package/dist/recipeRoutes.js.map +1 -0
- package/dist/recipes/captureForRunlog.d.ts +27 -0
- package/dist/recipes/captureForRunlog.js +128 -0
- package/dist/recipes/captureForRunlog.js.map +1 -0
- package/dist/recipes/chainedRunner.d.ts +54 -3
- package/dist/recipes/chainedRunner.js +256 -36
- package/dist/recipes/chainedRunner.js.map +1 -1
- package/dist/recipes/compiler.js +3 -3
- package/dist/recipes/compiler.js.map +1 -1
- package/dist/recipes/detectSilentFail.d.ts +34 -0
- package/dist/recipes/detectSilentFail.js +105 -0
- package/dist/recipes/detectSilentFail.js.map +1 -0
- package/dist/recipes/installer.js +3 -3
- package/dist/recipes/installer.js.map +1 -1
- package/dist/recipes/manifest.js +21 -6
- package/dist/recipes/manifest.js.map +1 -1
- package/dist/recipes/migrationWarnings.d.ts +12 -0
- package/dist/recipes/migrationWarnings.js +44 -0
- package/dist/recipes/migrationWarnings.js.map +1 -0
- package/dist/recipes/replayRun.d.ts +62 -0
- package/dist/recipes/replayRun.js +97 -0
- package/dist/recipes/replayRun.js.map +1 -0
- package/dist/recipes/resolveRecipePath.d.ts +69 -0
- package/dist/recipes/resolveRecipePath.js +202 -0
- package/dist/recipes/resolveRecipePath.js.map +1 -0
- package/dist/recipes/scheduler.js +102 -11
- package/dist/recipes/scheduler.js.map +1 -1
- package/dist/recipes/schemaGenerator.js +3 -3
- package/dist/recipes/schemaGenerator.js.map +1 -1
- package/dist/recipes/toolRegistry.d.ts +5 -0
- package/dist/recipes/toolRegistry.js +9 -0
- package/dist/recipes/toolRegistry.js.map +1 -1
- package/dist/recipes/tools/asana.d.ts +16 -0
- package/dist/recipes/tools/asana.js +524 -0
- package/dist/recipes/tools/asana.js.map +1 -0
- package/dist/recipes/tools/discord.d.ts +18 -0
- package/dist/recipes/tools/discord.js +254 -0
- package/dist/recipes/tools/discord.js.map +1 -0
- package/dist/recipes/tools/file.d.ts +6 -0
- package/dist/recipes/tools/file.js +12 -8
- package/dist/recipes/tools/file.js.map +1 -1
- package/dist/recipes/tools/github.js +29 -4
- package/dist/recipes/tools/github.js.map +1 -1
- package/dist/recipes/tools/gitlab.d.ts +11 -0
- package/dist/recipes/tools/gitlab.js +285 -0
- package/dist/recipes/tools/gitlab.js.map +1 -0
- package/dist/recipes/tools/gmail.d.ts +1 -1
- package/dist/recipes/tools/gmail.js +230 -6
- package/dist/recipes/tools/gmail.js.map +1 -1
- package/dist/recipes/tools/googleDrive.d.ts +1 -0
- package/dist/recipes/tools/googleDrive.js +55 -0
- package/dist/recipes/tools/googleDrive.js.map +1 -0
- package/dist/recipes/tools/index.d.ts +8 -0
- package/dist/recipes/tools/index.js +8 -0
- package/dist/recipes/tools/index.js.map +1 -1
- package/dist/recipes/tools/jira.d.ts +14 -0
- package/dist/recipes/tools/jira.js +369 -0
- package/dist/recipes/tools/jira.js.map +1 -0
- package/dist/recipes/tools/linear.d.ts +2 -1
- package/dist/recipes/tools/linear.js +227 -3
- package/dist/recipes/tools/linear.js.map +1 -1
- package/dist/recipes/tools/meetingNotes.d.ts +21 -0
- package/dist/recipes/tools/meetingNotes.js +701 -0
- package/dist/recipes/tools/meetingNotes.js.map +1 -0
- package/dist/recipes/tools/pagerduty.d.ts +15 -0
- package/dist/recipes/tools/pagerduty.js +451 -0
- package/dist/recipes/tools/pagerduty.js.map +1 -0
- package/dist/recipes/tools/sentry.d.ts +12 -0
- package/dist/recipes/tools/sentry.js +73 -0
- package/dist/recipes/tools/sentry.js.map +1 -0
- package/dist/recipes/tools/slack.js +15 -5
- package/dist/recipes/tools/slack.js.map +1 -1
- package/dist/recipes/validation.js +83 -14
- package/dist/recipes/validation.js.map +1 -1
- package/dist/recipes/yamlRunner.d.ts +30 -2
- package/dist/recipes/yamlRunner.js +369 -70
- package/dist/recipes/yamlRunner.js.map +1 -1
- package/dist/recipesHttp.d.ts +76 -1
- package/dist/recipesHttp.js +474 -12
- package/dist/recipesHttp.js.map +1 -1
- package/dist/runLog.d.ts +78 -2
- package/dist/runLog.js +204 -6
- package/dist/runLog.js.map +1 -1
- package/dist/schemas/dry-run-plan.v1.json +139 -0
- package/dist/schemas/recipe.v1.json +684 -0
- package/dist/server.d.ts +79 -10
- package/dist/server.js +366 -1384
- package/dist/server.js.map +1 -1
- package/dist/ssrfGuard.d.ts +54 -0
- package/dist/ssrfGuard.js +122 -0
- package/dist/ssrfGuard.js.map +1 -0
- package/dist/streamableHttp.d.ts +39 -1
- package/dist/streamableHttp.js +126 -17
- package/dist/streamableHttp.js.map +1 -1
- package/dist/tools/getDocumentSymbols.d.ts +24 -0
- package/dist/tools/getDocumentSymbols.js +74 -8
- package/dist/tools/getDocumentSymbols.js.map +1 -1
- package/dist/tools/getSecurityAdvisories.js +10 -1
- package/dist/tools/getSecurityAdvisories.js.map +1 -1
- package/dist/tools/getSessionUsage.d.ts +3 -0
- package/dist/tools/getSessionUsage.js +3 -0
- package/dist/tools/getSessionUsage.js.map +1 -1
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.js +32 -2
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/slackPostMessage.js +1 -1
- package/dist/tools/slackPostMessage.js.map +1 -1
- package/dist/tools/transaction.d.ts +19 -0
- package/dist/tools/transaction.js +29 -0
- package/dist/tools/transaction.js.map +1 -1
- package/dist/traceEncryption.d.ts +46 -0
- package/dist/traceEncryption.js +124 -0
- package/dist/traceEncryption.js.map +1 -0
- package/dist/transport.d.ts +39 -0
- package/dist/transport.js +88 -8
- package/dist/transport.js.map +1 -1
- package/package.json +22 -5
- package/templates/policies/README.md +72 -0
- package/templates/policies/conservative.json +14 -0
- package/templates/policies/developer.json +14 -0
- package/templates/policies/headless-ci.json +24 -0
- package/templates/policies/personal-assistant.json +15 -0
- package/templates/policies/regulated-industry.json +18 -0
- package/templates/recipes/project-health-check.yaml +1 -1
- package/templates/recipes/webhook/README.md +70 -0
- package/templates/recipes/webhook/capture-thought.yaml +26 -0
- package/templates/recipes/webhook/customer-escalation.yaml +49 -0
- package/templates/recipes/webhook/incident-intake.yaml +46 -0
- package/templates/recipes/webhook/meeting-prep.yaml +48 -0
- package/templates/recipes/webhook/morning-brief.yaml +57 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PagerDuty connector — read incidents, services, and on-call rotations.
|
|
3
|
+
*
|
|
4
|
+
* Auth: API key (paste from PagerDuty Console → Integrations → API Access Keys).
|
|
5
|
+
* - Env var: PAGERDUTY_TOKEN
|
|
6
|
+
* - Stored: getSecretJsonSync("pagerduty") → PagerDutyTokens
|
|
7
|
+
* - Header: Authorization: Token token=<key> (PagerDuty's specific format —
|
|
8
|
+
* not Bearer.)
|
|
9
|
+
*
|
|
10
|
+
* Read tools: listIncidents, getIncident, listServices, listOnCalls.
|
|
11
|
+
* Write tools: acknowledgeIncident, resolveIncident, addIncidentNote, createIncident.
|
|
12
|
+
*
|
|
13
|
+
* Writes require a `From` header (PagerDuty API requirement) sourced from
|
|
14
|
+
* PAGERDUTY_FROM_EMAIL env var. Identity is NOT exposed via recipe params —
|
|
15
|
+
* recipes can't spoof who performed the action.
|
|
16
|
+
*
|
|
17
|
+
* Extends BaseConnector for unified auth, retry, rate-limit, error handling.
|
|
18
|
+
*/
|
|
19
|
+
import { type AuthContext, BaseConnector, type ConnectorError, type ConnectorStatus } from "./baseConnector.js";
|
|
20
|
+
export interface PagerDutyTokens {
|
|
21
|
+
token: string;
|
|
22
|
+
userEmail?: string;
|
|
23
|
+
userName?: string;
|
|
24
|
+
connected_at: string;
|
|
25
|
+
}
|
|
26
|
+
export interface PagerDutyIncident {
|
|
27
|
+
id: string;
|
|
28
|
+
incident_number: number;
|
|
29
|
+
title: string;
|
|
30
|
+
status: string;
|
|
31
|
+
urgency: string;
|
|
32
|
+
created_at: string;
|
|
33
|
+
updated_at: string;
|
|
34
|
+
service?: {
|
|
35
|
+
id: string;
|
|
36
|
+
summary: string;
|
|
37
|
+
type: string;
|
|
38
|
+
};
|
|
39
|
+
assignments?: Array<{
|
|
40
|
+
at: string;
|
|
41
|
+
assignee: {
|
|
42
|
+
id: string;
|
|
43
|
+
summary: string;
|
|
44
|
+
type: string;
|
|
45
|
+
};
|
|
46
|
+
}>;
|
|
47
|
+
html_url: string;
|
|
48
|
+
}
|
|
49
|
+
export interface PagerDutyService {
|
|
50
|
+
id: string;
|
|
51
|
+
name: string;
|
|
52
|
+
description?: string;
|
|
53
|
+
status: string;
|
|
54
|
+
created_at: string;
|
|
55
|
+
html_url: string;
|
|
56
|
+
}
|
|
57
|
+
export interface PagerDutyOnCall {
|
|
58
|
+
user: {
|
|
59
|
+
id: string;
|
|
60
|
+
summary: string;
|
|
61
|
+
type: string;
|
|
62
|
+
};
|
|
63
|
+
schedule?: {
|
|
64
|
+
id: string;
|
|
65
|
+
summary: string;
|
|
66
|
+
type: string;
|
|
67
|
+
};
|
|
68
|
+
escalation_policy?: {
|
|
69
|
+
id: string;
|
|
70
|
+
summary: string;
|
|
71
|
+
type: string;
|
|
72
|
+
};
|
|
73
|
+
escalation_level: number;
|
|
74
|
+
start?: string;
|
|
75
|
+
end?: string;
|
|
76
|
+
}
|
|
77
|
+
export interface PagerDutyNote {
|
|
78
|
+
id: string;
|
|
79
|
+
content: string;
|
|
80
|
+
created_at: string;
|
|
81
|
+
user?: {
|
|
82
|
+
id: string;
|
|
83
|
+
summary: string;
|
|
84
|
+
type: string;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface CreateIncidentParams {
|
|
88
|
+
title: string;
|
|
89
|
+
serviceId: string;
|
|
90
|
+
urgency?: "high" | "low";
|
|
91
|
+
body?: string;
|
|
92
|
+
fromEmail?: string;
|
|
93
|
+
}
|
|
94
|
+
export declare class PagerDutyConnector extends BaseConnector {
|
|
95
|
+
readonly providerName = "pagerduty";
|
|
96
|
+
protected getOAuthConfig(): null;
|
|
97
|
+
authenticate(): Promise<AuthContext>;
|
|
98
|
+
healthCheck(): Promise<{
|
|
99
|
+
ok: boolean;
|
|
100
|
+
error?: ConnectorError;
|
|
101
|
+
}>;
|
|
102
|
+
normalizeError(error: unknown): ConnectorError;
|
|
103
|
+
getStatus(): ConnectorStatus;
|
|
104
|
+
listIncidents(params?: {
|
|
105
|
+
statuses?: string[];
|
|
106
|
+
urgencies?: string[];
|
|
107
|
+
since?: string;
|
|
108
|
+
until?: string;
|
|
109
|
+
limit?: number;
|
|
110
|
+
}): Promise<{
|
|
111
|
+
incidents: PagerDutyIncident[];
|
|
112
|
+
}>;
|
|
113
|
+
getIncident(id: string): Promise<PagerDutyIncident>;
|
|
114
|
+
listServices(params?: {
|
|
115
|
+
limit?: number;
|
|
116
|
+
}): Promise<{
|
|
117
|
+
services: PagerDutyService[];
|
|
118
|
+
}>;
|
|
119
|
+
listOnCalls(params?: {
|
|
120
|
+
scheduleIds?: string[];
|
|
121
|
+
limit?: number;
|
|
122
|
+
}): Promise<{
|
|
123
|
+
oncalls: PagerDutyOnCall[];
|
|
124
|
+
}>;
|
|
125
|
+
acknowledgeIncident(incidentId: string, options?: {
|
|
126
|
+
fromEmail?: string;
|
|
127
|
+
}): Promise<PagerDutyIncident>;
|
|
128
|
+
resolveIncident(incidentId: string, options?: {
|
|
129
|
+
fromEmail?: string;
|
|
130
|
+
resolution?: string;
|
|
131
|
+
}): Promise<PagerDutyIncident>;
|
|
132
|
+
addIncidentNote(incidentId: string, options: {
|
|
133
|
+
content: string;
|
|
134
|
+
fromEmail?: string;
|
|
135
|
+
}): Promise<PagerDutyNote>;
|
|
136
|
+
createIncident(params: CreateIncidentParams): Promise<PagerDutyIncident>;
|
|
137
|
+
private buildHeaders;
|
|
138
|
+
}
|
|
139
|
+
export declare function loadTokens(): PagerDutyTokens | null;
|
|
140
|
+
export declare function saveTokens(tokens: PagerDutyTokens): void;
|
|
141
|
+
export declare function clearTokens(): void;
|
|
142
|
+
export declare function getPagerDutyConnector(): PagerDutyConnector;
|
|
143
|
+
export { getPagerDutyConnector as pagerduty };
|
|
144
|
+
export interface ConnectorHandlerResult {
|
|
145
|
+
status: number;
|
|
146
|
+
body: string;
|
|
147
|
+
contentType?: string;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* POST /connections/pagerduty/connect { token }
|
|
151
|
+
*/
|
|
152
|
+
export declare function handlePagerDutyConnect(body: string): Promise<ConnectorHandlerResult>;
|
|
153
|
+
/**
|
|
154
|
+
* POST /connections/pagerduty/test
|
|
155
|
+
*/
|
|
156
|
+
export declare function handlePagerDutyTest(): Promise<ConnectorHandlerResult>;
|
|
157
|
+
/**
|
|
158
|
+
* DELETE /connections/pagerduty
|
|
159
|
+
*/
|
|
160
|
+
export declare function handlePagerDutyDisconnect(): ConnectorHandlerResult;
|
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PagerDuty connector — read incidents, services, and on-call rotations.
|
|
3
|
+
*
|
|
4
|
+
* Auth: API key (paste from PagerDuty Console → Integrations → API Access Keys).
|
|
5
|
+
* - Env var: PAGERDUTY_TOKEN
|
|
6
|
+
* - Stored: getSecretJsonSync("pagerduty") → PagerDutyTokens
|
|
7
|
+
* - Header: Authorization: Token token=<key> (PagerDuty's specific format —
|
|
8
|
+
* not Bearer.)
|
|
9
|
+
*
|
|
10
|
+
* Read tools: listIncidents, getIncident, listServices, listOnCalls.
|
|
11
|
+
* Write tools: acknowledgeIncident, resolveIncident, addIncidentNote, createIncident.
|
|
12
|
+
*
|
|
13
|
+
* Writes require a `From` header (PagerDuty API requirement) sourced from
|
|
14
|
+
* PAGERDUTY_FROM_EMAIL env var. Identity is NOT exposed via recipe params —
|
|
15
|
+
* recipes can't spoof who performed the action.
|
|
16
|
+
*
|
|
17
|
+
* Extends BaseConnector for unified auth, retry, rate-limit, error handling.
|
|
18
|
+
*/
|
|
19
|
+
import { BaseConnector, } from "./baseConnector.js";
|
|
20
|
+
import { deleteSecretJsonSync, getSecretJsonSync, storeSecretJsonSync, } from "./tokenStorage.js";
|
|
21
|
+
const PAGERDUTY_BASE = "https://api.pagerduty.com";
|
|
22
|
+
const PAGERDUTY_ACCEPT = "application/vnd.pagerduty+json;version=2";
|
|
23
|
+
export class PagerDutyConnector extends BaseConnector {
|
|
24
|
+
providerName = "pagerduty";
|
|
25
|
+
getOAuthConfig() {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
async authenticate() {
|
|
29
|
+
const tokens = loadTokens();
|
|
30
|
+
if (!tokens) {
|
|
31
|
+
throw new Error("PagerDuty not connected. Run: patchwork-os connect pagerduty or set PAGERDUTY_TOKEN");
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
token: tokens.token,
|
|
35
|
+
scopes: ["read"],
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async healthCheck() {
|
|
39
|
+
try {
|
|
40
|
+
const result = await this.apiCall(async (token) => {
|
|
41
|
+
const res = await fetch(`${PAGERDUTY_BASE}/users/me`, {
|
|
42
|
+
headers: this.buildHeaders(token),
|
|
43
|
+
});
|
|
44
|
+
if (!res.ok)
|
|
45
|
+
throw res;
|
|
46
|
+
return res.json();
|
|
47
|
+
});
|
|
48
|
+
if ("error" in result)
|
|
49
|
+
return { ok: false, error: result.error };
|
|
50
|
+
return { ok: true };
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return { ok: false, error: this.normalizeError(err) };
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
normalizeError(error) {
|
|
57
|
+
if (error instanceof Response) {
|
|
58
|
+
const s = error.status;
|
|
59
|
+
if (s === 401)
|
|
60
|
+
return {
|
|
61
|
+
code: "auth_expired",
|
|
62
|
+
message: "PagerDuty authentication failed — check API key",
|
|
63
|
+
retryable: false,
|
|
64
|
+
suggestedAction: "patchwork-os connect pagerduty",
|
|
65
|
+
};
|
|
66
|
+
if (s === 403)
|
|
67
|
+
return {
|
|
68
|
+
code: "permission_denied",
|
|
69
|
+
message: "Insufficient PagerDuty permissions for this resource",
|
|
70
|
+
retryable: false,
|
|
71
|
+
};
|
|
72
|
+
if (s === 404)
|
|
73
|
+
return {
|
|
74
|
+
code: "not_found",
|
|
75
|
+
message: "PagerDuty resource not found",
|
|
76
|
+
retryable: false,
|
|
77
|
+
};
|
|
78
|
+
if (s === 429)
|
|
79
|
+
return {
|
|
80
|
+
code: "rate_limited",
|
|
81
|
+
message: "PagerDuty API rate limit exceeded",
|
|
82
|
+
retryable: true,
|
|
83
|
+
suggestedAction: "Wait and retry",
|
|
84
|
+
};
|
|
85
|
+
return {
|
|
86
|
+
code: "provider_error",
|
|
87
|
+
message: `PagerDuty API error: HTTP ${s}`,
|
|
88
|
+
retryable: s >= 500,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (error instanceof Error) {
|
|
92
|
+
if (error.message.includes("ENOTFOUND") ||
|
|
93
|
+
error.message.includes("ECONNREFUSED")) {
|
|
94
|
+
return {
|
|
95
|
+
code: "network_error",
|
|
96
|
+
message: `Cannot connect to PagerDuty: ${error.message}`,
|
|
97
|
+
retryable: true,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
code: "provider_error",
|
|
103
|
+
message: error instanceof Error ? error.message : String(error),
|
|
104
|
+
retryable: false,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
getStatus() {
|
|
108
|
+
const tokens = loadTokens();
|
|
109
|
+
return {
|
|
110
|
+
id: "pagerduty",
|
|
111
|
+
status: tokens ? "connected" : "disconnected",
|
|
112
|
+
lastSync: tokens?.connected_at,
|
|
113
|
+
workspace: tokens?.userName ?? tokens?.userEmail ?? undefined,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// ── API Methods ────────────────────────────────────────────────────────────
|
|
117
|
+
async listIncidents(params = {}) {
|
|
118
|
+
const result = await this.apiCall(async (token) => {
|
|
119
|
+
const qs = new URLSearchParams();
|
|
120
|
+
qs.set("limit", String(params.limit ?? 25));
|
|
121
|
+
if (params.statuses?.length)
|
|
122
|
+
for (const s of params.statuses)
|
|
123
|
+
qs.append("statuses[]", s);
|
|
124
|
+
if (params.urgencies?.length)
|
|
125
|
+
for (const u of params.urgencies)
|
|
126
|
+
qs.append("urgencies[]", u);
|
|
127
|
+
if (params.since)
|
|
128
|
+
qs.set("since", params.since);
|
|
129
|
+
if (params.until)
|
|
130
|
+
qs.set("until", params.until);
|
|
131
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents?${qs}`, {
|
|
132
|
+
headers: this.buildHeaders(token),
|
|
133
|
+
});
|
|
134
|
+
this.updateRateLimitFromHeaders({
|
|
135
|
+
"x-ratelimit-remaining": res.headers.get("x-ratelimit-remaining") ?? undefined,
|
|
136
|
+
"retry-after": res.headers.get("retry-after") ?? undefined,
|
|
137
|
+
});
|
|
138
|
+
if (!res.ok)
|
|
139
|
+
throw res;
|
|
140
|
+
return res.json();
|
|
141
|
+
});
|
|
142
|
+
if ("error" in result)
|
|
143
|
+
throw new Error(result.error.message);
|
|
144
|
+
return result.data;
|
|
145
|
+
}
|
|
146
|
+
async getIncident(id) {
|
|
147
|
+
const result = await this.apiCall(async (token) => {
|
|
148
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents/${id}`, {
|
|
149
|
+
headers: this.buildHeaders(token),
|
|
150
|
+
});
|
|
151
|
+
if (!res.ok)
|
|
152
|
+
throw res;
|
|
153
|
+
const data = (await res.json());
|
|
154
|
+
return data.incident;
|
|
155
|
+
});
|
|
156
|
+
if ("error" in result)
|
|
157
|
+
throw new Error(result.error.message);
|
|
158
|
+
return result.data;
|
|
159
|
+
}
|
|
160
|
+
async listServices(params = {}) {
|
|
161
|
+
const result = await this.apiCall(async (token) => {
|
|
162
|
+
const qs = new URLSearchParams({ limit: String(params.limit ?? 25) });
|
|
163
|
+
const res = await fetch(`${PAGERDUTY_BASE}/services?${qs}`, {
|
|
164
|
+
headers: this.buildHeaders(token),
|
|
165
|
+
});
|
|
166
|
+
if (!res.ok)
|
|
167
|
+
throw res;
|
|
168
|
+
return res.json();
|
|
169
|
+
});
|
|
170
|
+
if ("error" in result)
|
|
171
|
+
throw new Error(result.error.message);
|
|
172
|
+
return result.data;
|
|
173
|
+
}
|
|
174
|
+
async listOnCalls(params = {}) {
|
|
175
|
+
const result = await this.apiCall(async (token) => {
|
|
176
|
+
const qs = new URLSearchParams({ limit: String(params.limit ?? 25) });
|
|
177
|
+
if (params.scheduleIds?.length)
|
|
178
|
+
for (const id of params.scheduleIds)
|
|
179
|
+
qs.append("schedule_ids[]", id);
|
|
180
|
+
const res = await fetch(`${PAGERDUTY_BASE}/oncalls?${qs}`, {
|
|
181
|
+
headers: this.buildHeaders(token),
|
|
182
|
+
});
|
|
183
|
+
if (!res.ok)
|
|
184
|
+
throw res;
|
|
185
|
+
return res.json();
|
|
186
|
+
});
|
|
187
|
+
if ("error" in result)
|
|
188
|
+
throw new Error(result.error.message);
|
|
189
|
+
return result.data;
|
|
190
|
+
}
|
|
191
|
+
// ── Write methods ──────────────────────────────────────────────────────────
|
|
192
|
+
// All writes require a `From` header set to the email of the user performing
|
|
193
|
+
// the action. Read from PAGERDUTY_FROM_EMAIL env var (or per-call override).
|
|
194
|
+
// Identity is intentionally NOT exposed to recipe tools — recipes shouldn't
|
|
195
|
+
// be able to spoof identity.
|
|
196
|
+
async acknowledgeIncident(incidentId, options = {}) {
|
|
197
|
+
const fromEmail = resolveFromEmail(options.fromEmail);
|
|
198
|
+
const result = await this.apiCall(async (token) => {
|
|
199
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents/${incidentId}`, {
|
|
200
|
+
method: "PUT",
|
|
201
|
+
headers: this.buildHeaders(token, fromEmail),
|
|
202
|
+
body: JSON.stringify({
|
|
203
|
+
incident: {
|
|
204
|
+
type: "incident_reference",
|
|
205
|
+
status: "acknowledged",
|
|
206
|
+
},
|
|
207
|
+
}),
|
|
208
|
+
});
|
|
209
|
+
if (!res.ok)
|
|
210
|
+
throw res;
|
|
211
|
+
const data = (await res.json());
|
|
212
|
+
return data.incident;
|
|
213
|
+
});
|
|
214
|
+
if ("error" in result)
|
|
215
|
+
throw new Error(result.error.message);
|
|
216
|
+
return result.data;
|
|
217
|
+
}
|
|
218
|
+
async resolveIncident(incidentId, options = {}) {
|
|
219
|
+
const fromEmail = resolveFromEmail(options.fromEmail);
|
|
220
|
+
const result = await this.apiCall(async (token) => {
|
|
221
|
+
const incident = {
|
|
222
|
+
type: "incident_reference",
|
|
223
|
+
status: "resolved",
|
|
224
|
+
};
|
|
225
|
+
if (options.resolution)
|
|
226
|
+
incident.resolution = options.resolution;
|
|
227
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents/${incidentId}`, {
|
|
228
|
+
method: "PUT",
|
|
229
|
+
headers: this.buildHeaders(token, fromEmail),
|
|
230
|
+
body: JSON.stringify({ incident }),
|
|
231
|
+
});
|
|
232
|
+
if (!res.ok)
|
|
233
|
+
throw res;
|
|
234
|
+
const data = (await res.json());
|
|
235
|
+
return data.incident;
|
|
236
|
+
});
|
|
237
|
+
if ("error" in result)
|
|
238
|
+
throw new Error(result.error.message);
|
|
239
|
+
return result.data;
|
|
240
|
+
}
|
|
241
|
+
async addIncidentNote(incidentId, options) {
|
|
242
|
+
const fromEmail = resolveFromEmail(options.fromEmail);
|
|
243
|
+
const result = await this.apiCall(async (token) => {
|
|
244
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents/${incidentId}/notes`, {
|
|
245
|
+
method: "POST",
|
|
246
|
+
headers: this.buildHeaders(token, fromEmail),
|
|
247
|
+
body: JSON.stringify({ note: { content: options.content } }),
|
|
248
|
+
});
|
|
249
|
+
if (!res.ok)
|
|
250
|
+
throw res;
|
|
251
|
+
const data = (await res.json());
|
|
252
|
+
return data.note;
|
|
253
|
+
});
|
|
254
|
+
if ("error" in result)
|
|
255
|
+
throw new Error(result.error.message);
|
|
256
|
+
return result.data;
|
|
257
|
+
}
|
|
258
|
+
async createIncident(params) {
|
|
259
|
+
if (!params.serviceId) {
|
|
260
|
+
throw new Error("serviceId is required to create a PagerDuty incident");
|
|
261
|
+
}
|
|
262
|
+
if (!params.title) {
|
|
263
|
+
throw new Error("title is required to create a PagerDuty incident");
|
|
264
|
+
}
|
|
265
|
+
const fromEmail = resolveFromEmail(params.fromEmail);
|
|
266
|
+
const urgency = params.urgency ?? "high";
|
|
267
|
+
const result = await this.apiCall(async (token) => {
|
|
268
|
+
const incident = {
|
|
269
|
+
type: "incident",
|
|
270
|
+
title: params.title,
|
|
271
|
+
service: { id: params.serviceId, type: "service_reference" },
|
|
272
|
+
urgency,
|
|
273
|
+
};
|
|
274
|
+
if (params.body) {
|
|
275
|
+
incident.body = { type: "incident_body", details: params.body };
|
|
276
|
+
}
|
|
277
|
+
const res = await fetch(`${PAGERDUTY_BASE}/incidents`, {
|
|
278
|
+
method: "POST",
|
|
279
|
+
headers: this.buildHeaders(token, fromEmail),
|
|
280
|
+
body: JSON.stringify({ incident }),
|
|
281
|
+
});
|
|
282
|
+
if (!res.ok)
|
|
283
|
+
throw res;
|
|
284
|
+
const data = (await res.json());
|
|
285
|
+
return data.incident;
|
|
286
|
+
});
|
|
287
|
+
if ("error" in result)
|
|
288
|
+
throw new Error(result.error.message);
|
|
289
|
+
return result.data;
|
|
290
|
+
}
|
|
291
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
292
|
+
buildHeaders(token, fromEmail) {
|
|
293
|
+
const headers = {
|
|
294
|
+
Authorization: `Token token=${token}`,
|
|
295
|
+
Accept: PAGERDUTY_ACCEPT,
|
|
296
|
+
"Content-Type": "application/json",
|
|
297
|
+
};
|
|
298
|
+
if (fromEmail)
|
|
299
|
+
headers.From = fromEmail;
|
|
300
|
+
return headers;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Resolve identity (`From` header value) for a PagerDuty write.
|
|
305
|
+
* Per-call override > PAGERDUTY_FROM_EMAIL env var. Throws if neither set.
|
|
306
|
+
*/
|
|
307
|
+
function resolveFromEmail(override) {
|
|
308
|
+
const fromEmail = override ?? process.env.PAGERDUTY_FROM_EMAIL;
|
|
309
|
+
if (!fromEmail) {
|
|
310
|
+
throw new Error("PagerDuty write methods require an identity. Set PAGERDUTY_FROM_EMAIL " +
|
|
311
|
+
"to the email of the user performing the action.");
|
|
312
|
+
}
|
|
313
|
+
return fromEmail;
|
|
314
|
+
}
|
|
315
|
+
// ── Token persistence ────────────────────────────────────────────────────────
|
|
316
|
+
export function loadTokens() {
|
|
317
|
+
const envToken = process.env.PAGERDUTY_TOKEN;
|
|
318
|
+
if (envToken) {
|
|
319
|
+
return {
|
|
320
|
+
token: envToken,
|
|
321
|
+
connected_at: new Date().toISOString(),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
return getSecretJsonSync("pagerduty");
|
|
325
|
+
}
|
|
326
|
+
export function saveTokens(tokens) {
|
|
327
|
+
storeSecretJsonSync("pagerduty", tokens);
|
|
328
|
+
}
|
|
329
|
+
export function clearTokens() {
|
|
330
|
+
try {
|
|
331
|
+
deleteSecretJsonSync("pagerduty");
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// ignore
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
// ── Singleton instance ───────────────────────────────────────────────────────
|
|
338
|
+
let _instance = null;
|
|
339
|
+
function resetPagerDutyConnector() {
|
|
340
|
+
_instance = null;
|
|
341
|
+
}
|
|
342
|
+
export function getPagerDutyConnector() {
|
|
343
|
+
if (!_instance) {
|
|
344
|
+
_instance = new PagerDutyConnector();
|
|
345
|
+
}
|
|
346
|
+
return _instance;
|
|
347
|
+
}
|
|
348
|
+
export { getPagerDutyConnector as pagerduty };
|
|
349
|
+
/**
|
|
350
|
+
* POST /connections/pagerduty/connect { token }
|
|
351
|
+
*/
|
|
352
|
+
export async function handlePagerDutyConnect(body) {
|
|
353
|
+
let token;
|
|
354
|
+
try {
|
|
355
|
+
const parsed = JSON.parse(body);
|
|
356
|
+
if (typeof parsed.token !== "string" || !parsed.token) {
|
|
357
|
+
return {
|
|
358
|
+
status: 400,
|
|
359
|
+
contentType: "application/json",
|
|
360
|
+
body: JSON.stringify({ ok: false, error: "token is required" }),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
token = parsed.token;
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
return {
|
|
367
|
+
status: 400,
|
|
368
|
+
contentType: "application/json",
|
|
369
|
+
body: JSON.stringify({ ok: false, error: "Invalid JSON body" }),
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
try {
|
|
373
|
+
const res = await fetch(`${PAGERDUTY_BASE}/users/me`, {
|
|
374
|
+
headers: {
|
|
375
|
+
Authorization: `Token token=${token}`,
|
|
376
|
+
Accept: PAGERDUTY_ACCEPT,
|
|
377
|
+
},
|
|
378
|
+
});
|
|
379
|
+
if (!res.ok) {
|
|
380
|
+
return {
|
|
381
|
+
status: 401,
|
|
382
|
+
contentType: "application/json",
|
|
383
|
+
body: JSON.stringify({
|
|
384
|
+
ok: false,
|
|
385
|
+
error: `Credentials rejected by PagerDuty (HTTP ${res.status}) — check API key`,
|
|
386
|
+
}),
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
const detail = (await res.json().catch(() => ({})));
|
|
390
|
+
const tokens = {
|
|
391
|
+
token,
|
|
392
|
+
userEmail: detail.user?.email,
|
|
393
|
+
userName: detail.user?.name,
|
|
394
|
+
connected_at: new Date().toISOString(),
|
|
395
|
+
};
|
|
396
|
+
saveTokens(tokens);
|
|
397
|
+
resetPagerDutyConnector();
|
|
398
|
+
return {
|
|
399
|
+
status: 200,
|
|
400
|
+
contentType: "application/json",
|
|
401
|
+
body: JSON.stringify({
|
|
402
|
+
ok: true,
|
|
403
|
+
userEmail: tokens.userEmail,
|
|
404
|
+
userName: tokens.userName,
|
|
405
|
+
connectedAt: tokens.connected_at,
|
|
406
|
+
}),
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
catch (err) {
|
|
410
|
+
return {
|
|
411
|
+
status: 500,
|
|
412
|
+
contentType: "application/json",
|
|
413
|
+
body: JSON.stringify({
|
|
414
|
+
ok: false,
|
|
415
|
+
error: err instanceof Error ? err.message : String(err),
|
|
416
|
+
}),
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* POST /connections/pagerduty/test
|
|
422
|
+
*/
|
|
423
|
+
export async function handlePagerDutyTest() {
|
|
424
|
+
const tokens = loadTokens();
|
|
425
|
+
if (!tokens) {
|
|
426
|
+
return {
|
|
427
|
+
status: 400,
|
|
428
|
+
contentType: "application/json",
|
|
429
|
+
body: JSON.stringify({ ok: false, error: "PagerDuty not connected" }),
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
try {
|
|
433
|
+
const connector = getPagerDutyConnector();
|
|
434
|
+
const check = await connector.healthCheck();
|
|
435
|
+
return {
|
|
436
|
+
status: check.ok ? 200 : 401,
|
|
437
|
+
contentType: "application/json",
|
|
438
|
+
body: JSON.stringify(check.ok ? { ok: true } : { ok: false, error: check.error?.message }),
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
catch (err) {
|
|
442
|
+
return {
|
|
443
|
+
status: 500,
|
|
444
|
+
contentType: "application/json",
|
|
445
|
+
body: JSON.stringify({
|
|
446
|
+
ok: false,
|
|
447
|
+
error: err instanceof Error ? err.message : String(err),
|
|
448
|
+
}),
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
/**
|
|
453
|
+
* DELETE /connections/pagerduty
|
|
454
|
+
*/
|
|
455
|
+
export function handlePagerDutyDisconnect() {
|
|
456
|
+
clearTokens();
|
|
457
|
+
resetPagerDutyConnector();
|
|
458
|
+
return {
|
|
459
|
+
status: 200,
|
|
460
|
+
contentType: "application/json",
|
|
461
|
+
body: JSON.stringify({ ok: true }),
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=pagerduty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagerduty.js","sourceRoot":"","sources":["../../src/connectors/pagerduty.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,22 @@ export interface ConnectorHandlerResult {
|
|
|
26
26
|
}
|
|
27
27
|
export declare function loadTokens(): SlackTokenFile | null;
|
|
28
28
|
export declare function isConnected(): boolean;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Thrown when Slack signals the bot token is no longer usable. Slack bot
|
|
31
|
+
* tokens don't normally expire, but they can be revoked from the workspace
|
|
32
|
+
* admin panel or by an org-wide app uninstall. Without a structured signal,
|
|
33
|
+
* a revoked-token error from `slackGet`/`slackPost` would surface as a
|
|
34
|
+
* generic `Slack API X error: invalid_auth` and the dashboard would have
|
|
35
|
+
* no path to prompt the user to reconnect.
|
|
36
|
+
*
|
|
37
|
+
* Mirrors `BaseConnector`'s `auth_expired` ConnectorError code so callers
|
|
38
|
+
* can branch uniformly on either path.
|
|
39
|
+
*/
|
|
40
|
+
export declare class SlackAuthExpiredError extends Error {
|
|
41
|
+
readonly code: "auth_expired";
|
|
42
|
+
constructor(slackError: string, method: string);
|
|
43
|
+
}
|
|
44
|
+
export declare function postMessage(channel: string, text: string, threadTs?: string, blocks?: unknown[], signal?: AbortSignal): Promise<{
|
|
30
45
|
ts: string;
|
|
31
46
|
channel: string;
|
|
32
47
|
}>;
|