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 @@
|
|
|
1
|
+
{"version":3,"file":"asana.js","sourceRoot":"","sources":["../../src/connectors/asana.ts"],"names":[],"mappings":"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"}
|
|
@@ -46,6 +46,14 @@ export declare abstract class BaseConnector {
|
|
|
46
46
|
protected auth: AuthContext | null;
|
|
47
47
|
protected rateLimit: RateLimitState;
|
|
48
48
|
protected oauthConfig: OAuthConfig | null;
|
|
49
|
+
/**
|
|
50
|
+
* In-flight refresh promise. When set, concurrent callers await the same
|
|
51
|
+
* promise instead of POSTing to the IdP a second time. Cleared in `finally`
|
|
52
|
+
* so the next caller (after success or failure) gets a fresh attempt.
|
|
53
|
+
* Prevents double-refresh races where two concurrent 401s both burn the same
|
|
54
|
+
* refresh token — fatal on IdPs that rotate refresh tokens (Google).
|
|
55
|
+
*/
|
|
56
|
+
private refreshInflight;
|
|
49
57
|
abstract readonly providerName: string;
|
|
50
58
|
/**
|
|
51
59
|
* OAuth configuration for token refresh.
|
|
@@ -73,8 +81,36 @@ export declare abstract class BaseConnector {
|
|
|
73
81
|
/**
|
|
74
82
|
* Perform OAuth 2.0 token refresh.
|
|
75
83
|
* Subclasses can override for provider-specific refresh flows.
|
|
84
|
+
*
|
|
85
|
+
* Failure handling distinguishes permanent from transient failures:
|
|
86
|
+
* - Permanent (401, or 400 with `error: invalid_grant`) → clear stored
|
|
87
|
+
* tokens so the next call drives a fresh authenticate() flow.
|
|
88
|
+
* - Transient (network error, 5xx, 4xx without `invalid_grant`,
|
|
89
|
+
* misconfigured tokenEndpoint, malformed response body) → keep
|
|
90
|
+
* tokens; next call will retry. Avoids forcing a full re-OAuth on
|
|
91
|
+
* flaky wifi or temporary IdP outages.
|
|
92
|
+
*
|
|
93
|
+
* Security guarantees:
|
|
94
|
+
* - `tokenEndpoint` MUST be HTTPS — refresh tokens are never sent over
|
|
95
|
+
* plain HTTP, even if a buggy/hostile config supplies one.
|
|
96
|
+
* - The response is validated before adoption: `access_token` must be a
|
|
97
|
+
* non-empty string and `expires_in` (when present) must fall within
|
|
98
|
+
* [1s, 1 year]. Otherwise the existing tokens are kept and the result
|
|
99
|
+
* is treated as transient.
|
|
76
100
|
*/
|
|
77
101
|
protected refreshToken(): Promise<AuthContext | null>;
|
|
102
|
+
/**
|
|
103
|
+
* Refresh the access token, deduplicating concurrent calls. Two callers
|
|
104
|
+
* hitting an expired token simultaneously share the same refresh promise
|
|
105
|
+
* instead of POSTing twice to the IdP. Critical for Google (refresh tokens
|
|
106
|
+
* rotate on use — second concurrent refresh would invalidate the connector).
|
|
107
|
+
*
|
|
108
|
+
* The cache is cleared in `finally` so the next caller after settle (success
|
|
109
|
+
* or failure) gets a fresh attempt. On refresh failure, all concurrent
|
|
110
|
+
* waiters see the same rejection and the caller's normal auth-fallback path
|
|
111
|
+
* (full re-authenticate) takes over.
|
|
112
|
+
*/
|
|
113
|
+
protected refreshTokenDeduped(): Promise<AuthContext | null>;
|
|
78
114
|
/**
|
|
79
115
|
* Health check — validates token is valid without side effects.
|
|
80
116
|
* Default implementation: make lightweight API call (e.g., /me or /user).
|
|
@@ -20,6 +20,14 @@ export class BaseConnector {
|
|
|
20
20
|
backoffMs: 0,
|
|
21
21
|
};
|
|
22
22
|
oauthConfig = null;
|
|
23
|
+
/**
|
|
24
|
+
* In-flight refresh promise. When set, concurrent callers await the same
|
|
25
|
+
* promise instead of POSTing to the IdP a second time. Cleared in `finally`
|
|
26
|
+
* so the next caller (after success or failure) gets a fresh attempt.
|
|
27
|
+
* Prevents double-refresh races where two concurrent 401s both burn the same
|
|
28
|
+
* refresh token — fatal on IdPs that rotate refresh tokens (Google).
|
|
29
|
+
*/
|
|
30
|
+
refreshInflight = null;
|
|
23
31
|
/**
|
|
24
32
|
* Load stored tokens from secure storage.
|
|
25
33
|
* Call this in subclass constructor or connect method.
|
|
@@ -63,6 +71,22 @@ export class BaseConnector {
|
|
|
63
71
|
/**
|
|
64
72
|
* Perform OAuth 2.0 token refresh.
|
|
65
73
|
* Subclasses can override for provider-specific refresh flows.
|
|
74
|
+
*
|
|
75
|
+
* Failure handling distinguishes permanent from transient failures:
|
|
76
|
+
* - Permanent (401, or 400 with `error: invalid_grant`) → clear stored
|
|
77
|
+
* tokens so the next call drives a fresh authenticate() flow.
|
|
78
|
+
* - Transient (network error, 5xx, 4xx without `invalid_grant`,
|
|
79
|
+
* misconfigured tokenEndpoint, malformed response body) → keep
|
|
80
|
+
* tokens; next call will retry. Avoids forcing a full re-OAuth on
|
|
81
|
+
* flaky wifi or temporary IdP outages.
|
|
82
|
+
*
|
|
83
|
+
* Security guarantees:
|
|
84
|
+
* - `tokenEndpoint` MUST be HTTPS — refresh tokens are never sent over
|
|
85
|
+
* plain HTTP, even if a buggy/hostile config supplies one.
|
|
86
|
+
* - The response is validated before adoption: `access_token` must be a
|
|
87
|
+
* non-empty string and `expires_in` (when present) must fall within
|
|
88
|
+
* [1s, 1 year]. Otherwise the existing tokens are kept and the result
|
|
89
|
+
* is treated as transient.
|
|
66
90
|
*/
|
|
67
91
|
async refreshToken() {
|
|
68
92
|
if (!this.auth?.refreshToken)
|
|
@@ -70,39 +94,117 @@ export class BaseConnector {
|
|
|
70
94
|
const config = this.getOAuthConfig();
|
|
71
95
|
if (!config)
|
|
72
96
|
return null;
|
|
97
|
+
// Refuse to send the refresh token to a non-HTTPS endpoint. A connector
|
|
98
|
+
// subclass that derives `tokenEndpoint` from user-modifiable config
|
|
99
|
+
// could otherwise be tricked into POSTing the secret to an attacker.
|
|
100
|
+
let endpointUrl;
|
|
73
101
|
try {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
102
|
+
endpointUrl = new URL(config.tokenEndpoint);
|
|
103
|
+
}
|
|
104
|
+
catch {
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
if (endpointUrl.protocol !== "https:") {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
const params = new URLSearchParams({
|
|
111
|
+
grant_type: "refresh_token",
|
|
112
|
+
refresh_token: this.auth.refreshToken,
|
|
113
|
+
client_id: config.clientId,
|
|
114
|
+
...(config.clientSecret ? { client_secret: config.clientSecret } : {}),
|
|
115
|
+
});
|
|
116
|
+
let response;
|
|
117
|
+
try {
|
|
118
|
+
response = await fetch(config.tokenEndpoint, {
|
|
81
119
|
method: "POST",
|
|
82
120
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
83
121
|
body: params.toString(),
|
|
84
122
|
});
|
|
85
|
-
|
|
86
|
-
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Network error / DNS failure / timeout — transient, keep tokens
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
if (!response.ok) {
|
|
129
|
+
let errorBody = {};
|
|
130
|
+
try {
|
|
131
|
+
errorBody = (await response.json());
|
|
87
132
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
133
|
+
catch {
|
|
134
|
+
// Some IdPs return non-JSON error bodies; fall through with empty
|
|
135
|
+
}
|
|
136
|
+
const refreshTokenIsInvalid = response.status === 401 ||
|
|
137
|
+
(response.status === 400 && errorBody.error === "invalid_grant");
|
|
138
|
+
if (refreshTokenIsInvalid) {
|
|
139
|
+
await this.clearTokens();
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
let data;
|
|
144
|
+
try {
|
|
145
|
+
data = (await response.json());
|
|
100
146
|
}
|
|
101
147
|
catch {
|
|
102
|
-
//
|
|
103
|
-
|
|
148
|
+
// Malformed success response — treat as transient
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
// Validate the success body before adopting any of it. A 200 with
|
|
152
|
+
// `{}` or `{access_token: null}` would otherwise persist `Bearer
|
|
153
|
+
// undefined` to the OS keychain.
|
|
154
|
+
if (typeof data.access_token !== "string" ||
|
|
155
|
+
data.access_token.length === 0) {
|
|
104
156
|
return null;
|
|
105
157
|
}
|
|
158
|
+
let expiresAt;
|
|
159
|
+
if (data.expires_in !== undefined) {
|
|
160
|
+
// Reject negative, zero, NaN, or absurdly long lifetimes (> 1 year).
|
|
161
|
+
const ONE_YEAR_S = 60 * 60 * 24 * 365;
|
|
162
|
+
const seconds = data.expires_in;
|
|
163
|
+
if (typeof seconds !== "number" ||
|
|
164
|
+
!Number.isFinite(seconds) ||
|
|
165
|
+
seconds <= 0 ||
|
|
166
|
+
seconds > ONE_YEAR_S) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
expiresAt = new Date(Date.now() + seconds * 1000);
|
|
170
|
+
}
|
|
171
|
+
const newAuth = {
|
|
172
|
+
token: data.access_token,
|
|
173
|
+
refreshToken: typeof data.refresh_token === "string" && data.refresh_token.length > 0
|
|
174
|
+
? data.refresh_token
|
|
175
|
+
: this.auth.refreshToken,
|
|
176
|
+
expiresAt,
|
|
177
|
+
scopes: typeof data.scope === "string"
|
|
178
|
+
? data.scope.split(" ")
|
|
179
|
+
: (this.auth.scopes ?? undefined),
|
|
180
|
+
};
|
|
181
|
+
this.auth = newAuth;
|
|
182
|
+
await this.saveTokens();
|
|
183
|
+
return newAuth;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Refresh the access token, deduplicating concurrent calls. Two callers
|
|
187
|
+
* hitting an expired token simultaneously share the same refresh promise
|
|
188
|
+
* instead of POSTing twice to the IdP. Critical for Google (refresh tokens
|
|
189
|
+
* rotate on use — second concurrent refresh would invalidate the connector).
|
|
190
|
+
*
|
|
191
|
+
* The cache is cleared in `finally` so the next caller after settle (success
|
|
192
|
+
* or failure) gets a fresh attempt. On refresh failure, all concurrent
|
|
193
|
+
* waiters see the same rejection and the caller's normal auth-fallback path
|
|
194
|
+
* (full re-authenticate) takes over.
|
|
195
|
+
*/
|
|
196
|
+
refreshTokenDeduped() {
|
|
197
|
+
if (this.refreshInflight)
|
|
198
|
+
return this.refreshInflight;
|
|
199
|
+
this.refreshInflight = (async () => {
|
|
200
|
+
try {
|
|
201
|
+
return await this.refreshToken();
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
this.refreshInflight = null;
|
|
205
|
+
}
|
|
206
|
+
})();
|
|
207
|
+
return this.refreshInflight;
|
|
106
208
|
}
|
|
107
209
|
/**
|
|
108
210
|
* Execute an authenticated API call with automatic token refresh
|
|
@@ -114,7 +216,7 @@ export class BaseConnector {
|
|
|
114
216
|
if (!this.auth || this.isTokenExpired()) {
|
|
115
217
|
// Try OAuth refresh if we have a refresh token
|
|
116
218
|
if (this.auth?.refreshToken) {
|
|
117
|
-
const refreshed = await this.
|
|
219
|
+
const refreshed = await this.refreshTokenDeduped();
|
|
118
220
|
if (refreshed) {
|
|
119
221
|
this.auth = refreshed;
|
|
120
222
|
}
|
|
@@ -138,14 +240,35 @@ export class BaseConnector {
|
|
|
138
240
|
}
|
|
139
241
|
}
|
|
140
242
|
}
|
|
141
|
-
//
|
|
243
|
+
// After auth resolution above, this.auth is guaranteed non-null —
|
|
244
|
+
// every "auth still null" branch returned an error and exited.
|
|
245
|
+
// Narrow the type so `fn` gets a `string` instead of `string | undefined`.
|
|
246
|
+
if (!this.auth) {
|
|
247
|
+
return {
|
|
248
|
+
error: {
|
|
249
|
+
code: "provider_error",
|
|
250
|
+
message: "auth resolution did not populate this.auth",
|
|
251
|
+
retryable: false,
|
|
252
|
+
},
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
// Apply rate limit backoff. Clear it once the reset window has elapsed —
|
|
256
|
+
// otherwise a single 429 with `Retry-After: 60` causes every subsequent
|
|
257
|
+
// request to wait 60s indefinitely.
|
|
142
258
|
if (this.rateLimit.backoffMs > 0) {
|
|
143
|
-
|
|
259
|
+
const resetAt = this.rateLimit.resetAt?.getTime();
|
|
260
|
+
if (resetAt && Date.now() >= resetAt) {
|
|
261
|
+
this.rateLimit.backoffMs = 0;
|
|
262
|
+
}
|
|
263
|
+
else {
|
|
264
|
+
await sleep(this.rateLimit.backoffMs);
|
|
265
|
+
this.rateLimit.backoffMs = 0;
|
|
266
|
+
}
|
|
144
267
|
}
|
|
145
268
|
// Execute with retry
|
|
146
269
|
for (let attempt = 0; attempt <= retries; attempt++) {
|
|
147
270
|
try {
|
|
148
|
-
const result = await fn(this.auth
|
|
271
|
+
const result = await fn(this.auth.token);
|
|
149
272
|
return { data: result };
|
|
150
273
|
}
|
|
151
274
|
catch (err) {
|
|
@@ -160,7 +283,7 @@ export class BaseConnector {
|
|
|
160
283
|
// Token might have expired mid-call - try refresh first
|
|
161
284
|
if (normalized.code === "auth_expired") {
|
|
162
285
|
if (this.auth?.refreshToken) {
|
|
163
|
-
const refreshed = await this.
|
|
286
|
+
const refreshed = await this.refreshTokenDeduped();
|
|
164
287
|
if (refreshed) {
|
|
165
288
|
this.auth = refreshed;
|
|
166
289
|
continue; // Retry with new token
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseConnector.js","sourceRoot":"","sources":["../../src/connectors/baseConnector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA4CH,MAAM,OAAgB,aAAa;IACvB,IAAI,GAAuB,IAAI,CAAC;IAChC,SAAS,GAAmB;QACpC,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QACrC,SAAS,EAAE,CAAC;KACb,CAAC;IACQ,WAAW,GAAuB,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"baseConnector.js","sourceRoot":"","sources":["../../src/connectors/baseConnector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Discord connector — read guilds, channels, messages.
|
|
3
|
+
*
|
|
4
|
+
* OAuth 2.0 Authorization Code Grant. Discord is a confidential client
|
|
5
|
+
* (bridge holds the client secret), so PKCE is not required. Refresh
|
|
6
|
+
* tokens are issued; access tokens expire (typically 7 days).
|
|
7
|
+
*
|
|
8
|
+
* Auth: standard OAuth 2.0 with `client_id` + `client_secret` + `redirect_uri`.
|
|
9
|
+
* - Env vars: DISCORD_CLIENT_ID, DISCORD_CLIENT_SECRET (mirrors slack)
|
|
10
|
+
* - Stored: getSecretJsonSync("discord") → DiscordTokens
|
|
11
|
+
* - Header: Authorization: Bearer <access_token>
|
|
12
|
+
*
|
|
13
|
+
* Tools: getCurrentUser, listGuilds, listChannels, listMessages (read);
|
|
14
|
+
* sendMessage (write).
|
|
15
|
+
*
|
|
16
|
+
* NOTE on writes: Discord's REST API does NOT permit user-context OAuth tokens
|
|
17
|
+
* to send messages on behalf of the user — only bot-scope tokens can hit
|
|
18
|
+
* `POST /channels/{id}/messages`. The current connector authenticates as a
|
|
19
|
+
* regular user (scopes: identify, guilds, messages.read), so `sendMessage`
|
|
20
|
+
* will return a `permission_denied` error until the user re-authenticates
|
|
21
|
+
* with the `bot` scope. The method is wired correctly; the gap is the auth
|
|
22
|
+
* scope, which is left to operators to upgrade when they want write access.
|
|
23
|
+
*
|
|
24
|
+
* HTTP routes (wired in src/server.ts):
|
|
25
|
+
* GET /connections/discord/auth — redirect to Discord consent
|
|
26
|
+
* GET /connections/discord/callback — exchange code for tokens
|
|
27
|
+
* POST /connections/discord/test — ping Discord API
|
|
28
|
+
* DELETE /connections/discord — clear stored tokens
|
|
29
|
+
*
|
|
30
|
+
* Extends BaseConnector for unified auth, retry, rate-limit, error handling.
|
|
31
|
+
* Token refresh is delegated to BaseConnector.refreshToken() via apiCall.
|
|
32
|
+
*/
|
|
33
|
+
import { type AuthContext, BaseConnector, type ConnectorError, type ConnectorStatus, type OAuthConfig } from "./baseConnector.js";
|
|
34
|
+
export interface DiscordTokens {
|
|
35
|
+
access_token: string;
|
|
36
|
+
refresh_token?: string;
|
|
37
|
+
/** ms since epoch; absolute, not relative */
|
|
38
|
+
expires_at?: number;
|
|
39
|
+
scope?: string;
|
|
40
|
+
token_type?: string;
|
|
41
|
+
/** stored at auth time so refresh works even if env vars are absent */
|
|
42
|
+
_client_id?: string;
|
|
43
|
+
_client_secret?: string;
|
|
44
|
+
username?: string;
|
|
45
|
+
user_id?: string;
|
|
46
|
+
connected_at: string;
|
|
47
|
+
}
|
|
48
|
+
export interface DiscordUser {
|
|
49
|
+
id: string;
|
|
50
|
+
username: string;
|
|
51
|
+
discriminator?: string;
|
|
52
|
+
global_name?: string | null;
|
|
53
|
+
avatar?: string | null;
|
|
54
|
+
}
|
|
55
|
+
export interface DiscordGuild {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
icon?: string | null;
|
|
59
|
+
owner?: boolean;
|
|
60
|
+
permissions?: string;
|
|
61
|
+
}
|
|
62
|
+
export interface DiscordChannel {
|
|
63
|
+
id: string;
|
|
64
|
+
type: number;
|
|
65
|
+
name?: string;
|
|
66
|
+
guild_id?: string;
|
|
67
|
+
topic?: string | null;
|
|
68
|
+
position?: number;
|
|
69
|
+
}
|
|
70
|
+
export interface DiscordMessage {
|
|
71
|
+
id: string;
|
|
72
|
+
channel_id: string;
|
|
73
|
+
content: string;
|
|
74
|
+
timestamp: string;
|
|
75
|
+
author: {
|
|
76
|
+
id: string;
|
|
77
|
+
username: string;
|
|
78
|
+
global_name?: string | null;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export declare function loadTokens(): DiscordTokens | null;
|
|
82
|
+
export declare function saveTokens(tokens: DiscordTokens): void;
|
|
83
|
+
export declare function clearTokens(): void;
|
|
84
|
+
export declare function isConnected(): boolean;
|
|
85
|
+
export declare class DiscordConnector extends BaseConnector {
|
|
86
|
+
readonly providerName = "discord";
|
|
87
|
+
protected getOAuthConfig(): OAuthConfig | null;
|
|
88
|
+
authenticate(): Promise<AuthContext>;
|
|
89
|
+
/**
|
|
90
|
+
* Persist refreshed tokens after BaseConnector.refreshToken() updates
|
|
91
|
+
* `this.auth`. BaseConnector calls `saveTokens()` (its own method on the
|
|
92
|
+
* tokenStorage StoredToken shape); we additionally mirror to our
|
|
93
|
+
* Discord-specific JSON so loadTokens() keeps working for HTTP probes.
|
|
94
|
+
*/
|
|
95
|
+
saveTokens(): Promise<void>;
|
|
96
|
+
healthCheck(): Promise<{
|
|
97
|
+
ok: boolean;
|
|
98
|
+
error?: ConnectorError;
|
|
99
|
+
}>;
|
|
100
|
+
normalizeError(error: unknown): ConnectorError;
|
|
101
|
+
getStatus(): ConnectorStatus;
|
|
102
|
+
getCurrentUser(): Promise<DiscordUser>;
|
|
103
|
+
listGuilds(params?: {
|
|
104
|
+
limit?: number;
|
|
105
|
+
}): Promise<DiscordGuild[]>;
|
|
106
|
+
listChannels(guildId: string): Promise<DiscordChannel[]>;
|
|
107
|
+
listMessages(channelId: string, params?: {
|
|
108
|
+
limit?: number;
|
|
109
|
+
}): Promise<DiscordMessage[]>;
|
|
110
|
+
/**
|
|
111
|
+
* Send a message to a Discord channel.
|
|
112
|
+
*
|
|
113
|
+
* Caveat: requires bot-scope OAuth — regular user-context tokens cannot
|
|
114
|
+
* send via this endpoint. On 403 the connector surfaces a
|
|
115
|
+
* `permission_denied` error pointing at the bot-scope requirement.
|
|
116
|
+
*
|
|
117
|
+
* @param channelId Discord channel id (non-empty)
|
|
118
|
+
* @param body { content (≤2000 chars), tts? defaults false }
|
|
119
|
+
*/
|
|
120
|
+
sendMessage(channelId: string, body: {
|
|
121
|
+
content: string;
|
|
122
|
+
tts?: boolean;
|
|
123
|
+
}): Promise<DiscordMessage>;
|
|
124
|
+
private buildHeaders;
|
|
125
|
+
private captureRateLimit;
|
|
126
|
+
}
|
|
127
|
+
export declare function getDiscordConnector(): DiscordConnector;
|
|
128
|
+
export { getDiscordConnector as discord };
|
|
129
|
+
export interface ConnectorHandlerResult {
|
|
130
|
+
status: number;
|
|
131
|
+
body: string;
|
|
132
|
+
contentType?: string;
|
|
133
|
+
redirect?: string;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* GET /connections/discord/auth — redirect to Discord consent screen.
|
|
137
|
+
*/
|
|
138
|
+
export declare function handleDiscordAuthorize(): ConnectorHandlerResult;
|
|
139
|
+
/**
|
|
140
|
+
* GET /connections/discord/callback — exchange code for tokens.
|
|
141
|
+
*/
|
|
142
|
+
export declare function handleDiscordCallback(code: string | null, state: string | null, error: string | null): Promise<ConnectorHandlerResult>;
|
|
143
|
+
/**
|
|
144
|
+
* POST /connections/discord/test — verify stored token works.
|
|
145
|
+
*/
|
|
146
|
+
export declare function handleDiscordTest(): Promise<ConnectorHandlerResult>;
|
|
147
|
+
/**
|
|
148
|
+
* DELETE /connections/discord — clear stored tokens (and revoke at Discord).
|
|
149
|
+
*/
|
|
150
|
+
export declare function handleDiscordDisconnect(): Promise<ConnectorHandlerResult>;
|