patchwork-os 0.2.0-alpha.33 → 0.2.0-alpha.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (270) hide show
  1. package/README.md +248 -48
  2. package/deploy/bootstrap-new-vps.sh +12 -12
  3. package/deploy/bootstrap-vps.sh +6 -3
  4. package/deploy/deploy-landing.sh +59 -2
  5. package/dist/bridge.js +35 -1
  6. package/dist/bridge.js.map +1 -1
  7. package/dist/commands/recipe.d.ts +11 -0
  8. package/dist/commands/recipe.js +32 -3
  9. package/dist/commands/recipe.js.map +1 -1
  10. package/dist/commands/recipeInstall.d.ts +79 -1
  11. package/dist/commands/recipeInstall.js +241 -13
  12. package/dist/commands/recipeInstall.js.map +1 -1
  13. package/dist/connectors/asana.d.ts +198 -0
  14. package/dist/connectors/asana.js +680 -0
  15. package/dist/connectors/asana.js.map +1 -0
  16. package/dist/connectors/baseConnector.d.ts +16 -0
  17. package/dist/connectors/baseConnector.js +107 -25
  18. package/dist/connectors/baseConnector.js.map +1 -1
  19. package/dist/connectors/discord.d.ts +150 -0
  20. package/dist/connectors/discord.js +544 -0
  21. package/dist/connectors/discord.js.map +1 -0
  22. package/dist/connectors/github.js +15 -7
  23. package/dist/connectors/github.js.map +1 -1
  24. package/dist/connectors/gitlab.d.ts +180 -0
  25. package/dist/connectors/gitlab.js +582 -0
  26. package/dist/connectors/gitlab.js.map +1 -0
  27. package/dist/connectors/gmail.js +45 -0
  28. package/dist/connectors/gmail.js.map +1 -1
  29. package/dist/connectors/googleDrive.d.ts +34 -0
  30. package/dist/connectors/googleDrive.js +305 -0
  31. package/dist/connectors/googleDrive.js.map +1 -0
  32. package/dist/connectors/htmlEscape.d.ts +5 -0
  33. package/dist/connectors/htmlEscape.js +13 -0
  34. package/dist/connectors/htmlEscape.js.map +1 -0
  35. package/dist/connectors/linear.js +26 -6
  36. package/dist/connectors/linear.js.map +1 -1
  37. package/dist/connectors/mcpOAuth.d.ts +2 -0
  38. package/dist/connectors/mcpOAuth.js +8 -4
  39. package/dist/connectors/mcpOAuth.js.map +1 -1
  40. package/dist/connectors/pagerduty.d.ts +160 -0
  41. package/dist/connectors/pagerduty.js +464 -0
  42. package/dist/connectors/pagerduty.js.map +1 -0
  43. package/dist/connectors/sentry.js +3 -2
  44. package/dist/connectors/sentry.js.map +1 -1
  45. package/dist/connectors/slack.d.ts +1 -1
  46. package/dist/connectors/slack.js +7 -4
  47. package/dist/connectors/slack.js.map +1 -1
  48. package/dist/featureFlags.d.ts +17 -11
  49. package/dist/featureFlags.js +52 -47
  50. package/dist/featureFlags.js.map +1 -1
  51. package/dist/index.js +262 -129
  52. package/dist/index.js.map +1 -1
  53. package/dist/oauth.js +3 -2
  54. package/dist/oauth.js.map +1 -1
  55. package/dist/recipeOrchestration.d.ts +7 -0
  56. package/dist/recipeOrchestration.js +154 -28
  57. package/dist/recipeOrchestration.js.map +1 -1
  58. package/dist/recipes/agentExecutor.d.ts +1 -0
  59. package/dist/recipes/agentExecutor.js +7 -0
  60. package/dist/recipes/agentExecutor.js.map +1 -1
  61. package/dist/recipes/captureForRunlog.d.ts +27 -0
  62. package/dist/recipes/captureForRunlog.js +128 -0
  63. package/dist/recipes/captureForRunlog.js.map +1 -0
  64. package/dist/recipes/chainedRunner.d.ts +39 -3
  65. package/dist/recipes/chainedRunner.js +183 -28
  66. package/dist/recipes/chainedRunner.js.map +1 -1
  67. package/dist/recipes/detectSilentFail.d.ts +34 -0
  68. package/dist/recipes/detectSilentFail.js +105 -0
  69. package/dist/recipes/detectSilentFail.js.map +1 -0
  70. package/dist/recipes/legacyRecipeCompat.d.ts +8 -0
  71. package/dist/recipes/legacyRecipeCompat.js +20 -1
  72. package/dist/recipes/legacyRecipeCompat.js.map +1 -1
  73. package/dist/recipes/manifest.js +21 -6
  74. package/dist/recipes/manifest.js.map +1 -1
  75. package/dist/recipes/migrations/index.d.ts +24 -0
  76. package/dist/recipes/migrations/index.js +55 -0
  77. package/dist/recipes/migrations/index.js.map +1 -0
  78. package/dist/recipes/migrations/types.d.ts +28 -0
  79. package/dist/recipes/migrations/types.js +2 -0
  80. package/dist/recipes/migrations/types.js.map +1 -0
  81. package/dist/recipes/migrations/v1.d.ts +11 -0
  82. package/dist/recipes/migrations/v1.js +18 -0
  83. package/dist/recipes/migrations/v1.js.map +1 -0
  84. package/dist/recipes/replayRun.d.ts +62 -0
  85. package/dist/recipes/replayRun.js +97 -0
  86. package/dist/recipes/replayRun.js.map +1 -0
  87. package/dist/recipes/scheduler.js +102 -11
  88. package/dist/recipes/scheduler.js.map +1 -1
  89. package/dist/recipes/schemaGenerator.js +3 -3
  90. package/dist/recipes/schemaGenerator.js.map +1 -1
  91. package/dist/recipes/templateEngine.js +8 -1
  92. package/dist/recipes/templateEngine.js.map +1 -1
  93. package/dist/recipes/toolRegistry.d.ts +5 -0
  94. package/dist/recipes/toolRegistry.js +9 -0
  95. package/dist/recipes/toolRegistry.js.map +1 -1
  96. package/dist/recipes/tools/asana.d.ts +16 -0
  97. package/dist/recipes/tools/asana.js +524 -0
  98. package/dist/recipes/tools/asana.js.map +1 -0
  99. package/dist/recipes/tools/discord.d.ts +18 -0
  100. package/dist/recipes/tools/discord.js +254 -0
  101. package/dist/recipes/tools/discord.js.map +1 -0
  102. package/dist/recipes/tools/github.js +29 -4
  103. package/dist/recipes/tools/github.js.map +1 -1
  104. package/dist/recipes/tools/gitlab.d.ts +11 -0
  105. package/dist/recipes/tools/gitlab.js +285 -0
  106. package/dist/recipes/tools/gitlab.js.map +1 -0
  107. package/dist/recipes/tools/gmail.d.ts +1 -1
  108. package/dist/recipes/tools/gmail.js +230 -6
  109. package/dist/recipes/tools/gmail.js.map +1 -1
  110. package/dist/recipes/tools/googleDrive.d.ts +1 -0
  111. package/dist/recipes/tools/googleDrive.js +55 -0
  112. package/dist/recipes/tools/googleDrive.js.map +1 -0
  113. package/dist/recipes/tools/index.d.ts +6 -0
  114. package/dist/recipes/tools/index.js +6 -0
  115. package/dist/recipes/tools/index.js.map +1 -1
  116. package/dist/recipes/tools/linear.d.ts +2 -1
  117. package/dist/recipes/tools/linear.js +222 -1
  118. package/dist/recipes/tools/linear.js.map +1 -1
  119. package/dist/recipes/tools/meetingNotes.d.ts +21 -0
  120. package/dist/recipes/tools/meetingNotes.js +701 -0
  121. package/dist/recipes/tools/meetingNotes.js.map +1 -0
  122. package/dist/recipes/tools/pagerduty.d.ts +15 -0
  123. package/dist/recipes/tools/pagerduty.js +451 -0
  124. package/dist/recipes/tools/pagerduty.js.map +1 -0
  125. package/dist/recipes/tools/slack.js +8 -2
  126. package/dist/recipes/tools/slack.js.map +1 -1
  127. package/dist/recipes/validation.js +54 -15
  128. package/dist/recipes/validation.js.map +1 -1
  129. package/dist/recipes/yamlRunner.d.ts +23 -2
  130. package/dist/recipes/yamlRunner.js +265 -60
  131. package/dist/recipes/yamlRunner.js.map +1 -1
  132. package/dist/recipesHttp.d.ts +60 -0
  133. package/dist/recipesHttp.js +418 -3
  134. package/dist/recipesHttp.js.map +1 -1
  135. package/dist/runLog.d.ts +64 -2
  136. package/dist/runLog.js +116 -2
  137. package/dist/runLog.js.map +1 -1
  138. package/dist/server.d.ts +21 -0
  139. package/dist/server.js +387 -8
  140. package/dist/server.js.map +1 -1
  141. package/dist/streamableHttp.d.ts +31 -1
  142. package/dist/streamableHttp.js +20 -2
  143. package/dist/streamableHttp.js.map +1 -1
  144. package/dist/tools/activityLog.d.ts +2 -0
  145. package/dist/tools/addLinearComment.d.ts +1 -0
  146. package/dist/tools/batchLsp.d.ts +3 -0
  147. package/dist/tools/bridgeDoctor.d.ts +1 -0
  148. package/dist/tools/bridgeStatus.d.ts +1 -0
  149. package/dist/tools/cancelClaudeTask.d.ts +1 -0
  150. package/dist/tools/checkDocumentDirty.d.ts +1 -0
  151. package/dist/tools/clipboard.d.ts +2 -0
  152. package/dist/tools/closeTabs.d.ts +2 -0
  153. package/dist/tools/codeLens.d.ts +1 -0
  154. package/dist/tools/contextBundle.d.ts +1 -0
  155. package/dist/tools/createIssueFromAIComment.d.ts +1 -0
  156. package/dist/tools/createLinearIssue.d.ts +1 -0
  157. package/dist/tools/ctxGetTaskContext.d.ts +1 -0
  158. package/dist/tools/ctxQueryTraces.d.ts +1 -0
  159. package/dist/tools/ctxSaveTrace.d.ts +1 -0
  160. package/dist/tools/debug.d.ts +4 -0
  161. package/dist/tools/decorations.d.ts +2 -0
  162. package/dist/tools/documentLinks.d.ts +1 -0
  163. package/dist/tools/editText.d.ts +1 -0
  164. package/dist/tools/enrichCommit.d.ts +1 -0
  165. package/dist/tools/enrichStackTrace.d.ts +1 -0
  166. package/dist/tools/explainDiagnostic.d.ts +1 -0
  167. package/dist/tools/explainSymbol.d.ts +1 -0
  168. package/dist/tools/fetchCalendarEvents.d.ts +1 -0
  169. package/dist/tools/fetchGithubIssue.d.ts +1 -0
  170. package/dist/tools/fetchGithubPR.d.ts +1 -0
  171. package/dist/tools/fetchLinearIssue.d.ts +1 -0
  172. package/dist/tools/fetchSentryIssue.d.ts +1 -0
  173. package/dist/tools/fetchSlackProfile.d.ts +1 -0
  174. package/dist/tools/fileOperations.d.ts +3 -0
  175. package/dist/tools/fileWatcher.d.ts +2 -0
  176. package/dist/tools/findFiles.d.ts +1 -0
  177. package/dist/tools/findRelatedTests.d.ts +1 -0
  178. package/dist/tools/fixAllLintErrors.d.ts +1 -0
  179. package/dist/tools/foldingRanges.d.ts +1 -0
  180. package/dist/tools/formatDocument.d.ts +1 -0
  181. package/dist/tools/generateTests.d.ts +1 -0
  182. package/dist/tools/getAIComments.d.ts +1 -0
  183. package/dist/tools/getAnalyticsReport.d.ts +1 -0
  184. package/dist/tools/getArchitectureContext.d.ts +1 -0
  185. package/dist/tools/getBufferContent.d.ts +1 -0
  186. package/dist/tools/getChangeImpact.d.ts +1 -0
  187. package/dist/tools/getClaudeTaskStatus.d.ts +1 -0
  188. package/dist/tools/getCodeCoverage.d.ts +1 -0
  189. package/dist/tools/getCommitsForIssue.d.ts +1 -0
  190. package/dist/tools/getConnectorStatus.d.ts +1 -0
  191. package/dist/tools/getCurrentSelection.d.ts +2 -0
  192. package/dist/tools/getDebugState.d.ts +1 -0
  193. package/dist/tools/getDependencyTree.d.ts +1 -0
  194. package/dist/tools/getDiagnostics.d.ts +1 -0
  195. package/dist/tools/getDiffFromHandoff.d.ts +1 -0
  196. package/dist/tools/getDocumentSymbols.d.ts +1 -0
  197. package/dist/tools/getFileTree.d.ts +1 -0
  198. package/dist/tools/getGitDiff.d.ts +1 -0
  199. package/dist/tools/getGitHotspots.d.ts +1 -0
  200. package/dist/tools/getGitLog.d.ts +1 -0
  201. package/dist/tools/getGitStatus.d.ts +1 -0
  202. package/dist/tools/getImportTree.d.ts +1 -0
  203. package/dist/tools/getImportedSignatures.d.ts +1 -0
  204. package/dist/tools/getOpenEditors.d.ts +1 -0
  205. package/dist/tools/getPRTemplate.d.ts +1 -0
  206. package/dist/tools/getProjectContext.d.ts +1 -0
  207. package/dist/tools/getProjectInfo.d.ts +1 -0
  208. package/dist/tools/getSecurityAdvisories.d.ts +1 -0
  209. package/dist/tools/getSessionUsage.d.ts +1 -0
  210. package/dist/tools/getSymbolHistory.d.ts +1 -0
  211. package/dist/tools/getToolCapabilities.d.ts +1 -0
  212. package/dist/tools/getTypeSignature.d.ts +1 -0
  213. package/dist/tools/getWorkspaceFolders.d.ts +1 -0
  214. package/dist/tools/getWorkspaceSettings.d.ts +1 -0
  215. package/dist/tools/gitHistory.d.ts +2 -0
  216. package/dist/tools/gitWrite.d.ts +11 -0
  217. package/dist/tools/github/actions.d.ts +2 -0
  218. package/dist/tools/github/composite.d.ts +3 -0
  219. package/dist/tools/github/issues.d.ts +4 -0
  220. package/dist/tools/github/pr.d.ts +7 -0
  221. package/dist/tools/handoffNote.d.ts +2 -0
  222. package/dist/tools/hoverAtCursor.d.ts +1 -0
  223. package/dist/tools/httpClient.d.ts +2 -0
  224. package/dist/tools/inlayHints.d.ts +1 -0
  225. package/dist/tools/launchQuickTask.d.ts +1 -0
  226. package/dist/tools/listClaudeTasks.d.ts +1 -0
  227. package/dist/tools/listTerminals.d.ts +1 -0
  228. package/dist/tools/lsp.d.ts +14 -0
  229. package/dist/tools/navigateToSymbolByName.d.ts +1 -0
  230. package/dist/tools/openDiff.d.ts +1 -0
  231. package/dist/tools/openFile.d.ts +1 -0
  232. package/dist/tools/openInBrowser.d.ts +1 -0
  233. package/dist/tools/organizeImports.d.ts +1 -0
  234. package/dist/tools/performanceReport.d.ts +1 -0
  235. package/dist/tools/planPersistence.d.ts +5 -0
  236. package/dist/tools/previewEdit.d.ts +1 -0
  237. package/dist/tools/refactorAnalyze.d.ts +1 -0
  238. package/dist/tools/refactorPreview.d.ts +1 -0
  239. package/dist/tools/replaceBlock.d.ts +1 -0
  240. package/dist/tools/resumeClaudeTask.d.ts +1 -0
  241. package/dist/tools/runClaudeTask.d.ts +1 -0
  242. package/dist/tools/runCommand.d.ts +1 -0
  243. package/dist/tools/runTests.d.ts +1 -0
  244. package/dist/tools/saveDocument.d.ts +1 -0
  245. package/dist/tools/screenshotAndAnnotate.d.ts +1 -0
  246. package/dist/tools/searchAndReplace.d.ts +1 -0
  247. package/dist/tools/searchTools.d.ts +1 -0
  248. package/dist/tools/searchWorkspace.d.ts +1 -0
  249. package/dist/tools/selectionRanges.d.ts +1 -0
  250. package/dist/tools/semanticTokens.d.ts +1 -0
  251. package/dist/tools/setActiveWorkspaceFolder.d.ts +1 -0
  252. package/dist/tools/signatureHelp.d.ts +1 -0
  253. package/dist/tools/slackListChannels.d.ts +1 -0
  254. package/dist/tools/slackPostMessage.d.ts +1 -0
  255. package/dist/tools/slackPostMessage.js +1 -1
  256. package/dist/tools/slackPostMessage.js.map +1 -1
  257. package/dist/tools/terminal.d.ts +6 -0
  258. package/dist/tools/testTraceToSource.d.ts +1 -0
  259. package/dist/tools/transaction.d.ts +4 -0
  260. package/dist/tools/typeHierarchy.d.ts +1 -0
  261. package/dist/tools/updateLinearIssue.d.ts +1 -0
  262. package/dist/tools/utils.d.ts +2 -0
  263. package/dist/tools/utils.js.map +1 -1
  264. package/dist/tools/vscodeCommands.d.ts +2 -0
  265. package/dist/tools/vscodeTasks.d.ts +2 -0
  266. package/dist/tools/workspaceSettings.d.ts +1 -0
  267. package/package.json +20 -4
  268. package/templates/recipes/project-health-check.yaml +1 -1
  269. package/dist/schemas/dry-run-plan.v1.json +0 -139
  270. package/dist/schemas/recipe.v1.json +0 -684
@@ -0,0 +1,198 @@
1
+ /**
2
+ * Asana connector — read workspaces, projects, tasks, and current user, plus
3
+ * writes (createTask, updateTask, completeTask, addTaskComment).
4
+ *
5
+ * OAuth 2.0 Authorization Code Grant. Asana is a confidential client (bridge
6
+ * holds client secret), so PKCE is not used. Refresh tokens are issued; access
7
+ * tokens expire after 1 hour (3600s).
8
+ *
9
+ * Auth: standard OAuth 2.0 with `client_id` + `client_secret` + `redirect_uri`.
10
+ * - Env vars: ASANA_CLIENT_ID, ASANA_CLIENT_SECRET (mirrors discord/slack)
11
+ * - Stored: getSecretJsonSync("asana") → AsanaTokens
12
+ * - Header: Authorization: Bearer <access_token>
13
+ *
14
+ * Scope note: Asana's only OAuth scope is `default`, which grants read+write
15
+ * combined — there is no read-only-only scope. Defense lives at the recipe-tool
16
+ * layer where each tool declares `isWrite: true|false`. Newer Asana accounts
17
+ * may also expose granular scopes; we set `default` for compatibility.
18
+ *
19
+ * Read tools: getCurrentUser, listWorkspaces, listProjects, listTasks, getTask.
20
+ * Write tools: createTask, updateTask, completeTask, addTaskComment.
21
+ *
22
+ * Idempotency: Asana doesn't honor an Idempotency-Key header. Writes simply
23
+ * throw on error — callers must dedupe via app-level checks if needed.
24
+ *
25
+ * HTTP routes (wired in src/server.ts):
26
+ * GET /connections/asana/auth — redirect to Asana consent
27
+ * GET /connections/asana/callback — exchange code for tokens
28
+ * POST /connections/asana/test — ping Asana API
29
+ * DELETE /connections/asana — clear stored tokens
30
+ *
31
+ * Asana wraps every API response in `{ data: ... }`. We unwrap consistently
32
+ * inside this class so recipe-tool wrappers see clean arrays/objects.
33
+ *
34
+ * Extends BaseConnector for unified auth, retry, rate-limit, error handling.
35
+ * Token refresh is delegated to BaseConnector.refreshToken() via apiCall.
36
+ */
37
+ import { type AuthContext, BaseConnector, type ConnectorError, type ConnectorStatus, type OAuthConfig } from "./baseConnector.js";
38
+ export interface AsanaTokens {
39
+ access_token: string;
40
+ refresh_token?: string;
41
+ /** ms since epoch; absolute, not relative */
42
+ expires_at?: number;
43
+ scope?: string;
44
+ token_type?: string;
45
+ /** stored at auth time so refresh works even if env vars are absent */
46
+ _client_id?: string;
47
+ _client_secret?: string;
48
+ username?: string;
49
+ user_gid?: string;
50
+ email?: string;
51
+ connected_at: string;
52
+ }
53
+ export interface AsanaUser {
54
+ gid: string;
55
+ name: string;
56
+ email?: string;
57
+ resource_type?: string;
58
+ photo?: {
59
+ image_60x60?: string;
60
+ } | null;
61
+ }
62
+ export interface AsanaWorkspace {
63
+ gid: string;
64
+ name: string;
65
+ resource_type?: string;
66
+ is_organization?: boolean;
67
+ }
68
+ export interface AsanaProject {
69
+ gid: string;
70
+ name: string;
71
+ resource_type?: string;
72
+ archived?: boolean;
73
+ }
74
+ export interface AsanaTask {
75
+ gid: string;
76
+ name: string;
77
+ resource_type?: string;
78
+ completed?: boolean;
79
+ assignee?: {
80
+ gid: string;
81
+ name?: string;
82
+ } | null;
83
+ due_on?: string | null;
84
+ notes?: string;
85
+ }
86
+ export interface AsanaStory {
87
+ gid: string;
88
+ resource_type?: string;
89
+ type?: string;
90
+ text?: string;
91
+ created_at?: string;
92
+ created_by?: {
93
+ gid: string;
94
+ name?: string;
95
+ } | null;
96
+ }
97
+ export interface CreateTaskParams {
98
+ workspaceGid: string;
99
+ name: string;
100
+ projectGid?: string;
101
+ notes?: string;
102
+ assigneeGid?: string;
103
+ /** ISO date YYYY-MM-DD */
104
+ dueOn?: string;
105
+ parentTaskGid?: string;
106
+ }
107
+ export interface UpdateTaskParams {
108
+ name?: string;
109
+ notes?: string;
110
+ completed?: boolean;
111
+ assigneeGid?: string;
112
+ /** ISO date YYYY-MM-DD */
113
+ dueOn?: string;
114
+ }
115
+ export declare function loadTokens(): AsanaTokens | null;
116
+ export declare function saveTokens(tokens: AsanaTokens): void;
117
+ export declare function clearTokens(): void;
118
+ export declare function isConnected(): boolean;
119
+ export declare class AsanaConnector extends BaseConnector {
120
+ readonly providerName = "asana";
121
+ protected getOAuthConfig(): OAuthConfig | null;
122
+ authenticate(): Promise<AuthContext>;
123
+ /**
124
+ * Persist refreshed tokens after BaseConnector.refreshToken() updates
125
+ * `this.auth`. BaseConnector calls `saveTokens()` (its own method on the
126
+ * tokenStorage StoredToken shape); we additionally mirror to our
127
+ * Asana-specific JSON so loadTokens() keeps working for HTTP probes.
128
+ */
129
+ saveTokens(): Promise<void>;
130
+ healthCheck(): Promise<{
131
+ ok: boolean;
132
+ error?: ConnectorError;
133
+ }>;
134
+ normalizeError(error: unknown): ConnectorError;
135
+ getStatus(): ConnectorStatus;
136
+ getCurrentUser(): Promise<AsanaUser>;
137
+ listWorkspaces(params?: {
138
+ limit?: number;
139
+ }): Promise<AsanaWorkspace[]>;
140
+ listProjects(params: {
141
+ workspaceGid: string;
142
+ limit?: number;
143
+ }): Promise<AsanaProject[]>;
144
+ listTasks(params?: {
145
+ projectGid?: string;
146
+ assignee?: string;
147
+ workspaceGid?: string;
148
+ limit?: number;
149
+ }): Promise<AsanaTask[]>;
150
+ getTask(taskGid: string): Promise<AsanaTask>;
151
+ createTask(params: CreateTaskParams): Promise<AsanaTask>;
152
+ updateTask(taskGid: string, updates: UpdateTaskParams): Promise<AsanaTask>;
153
+ /**
154
+ * Convenience wrapper around updateTask that flips `completed: true`. Lower
155
+ * risk than other updates since it's a single, well-known state transition.
156
+ */
157
+ completeTask(taskGid: string): Promise<AsanaTask>;
158
+ addTaskComment(taskGid: string, options: {
159
+ text: string;
160
+ }): Promise<AsanaStory>;
161
+ private buildHeaders;
162
+ private captureRateLimit;
163
+ /**
164
+ * Read the response body once and stash the first Asana `errors[].message`
165
+ * onto a sidecar property so normalizeError can include it without a second
166
+ * read. Returns the same Response for `throw` to consume.
167
+ */
168
+ private attachErrorDetail;
169
+ }
170
+ export declare function getAsanaConnector(): AsanaConnector;
171
+ export { getAsanaConnector as asana };
172
+ export interface ConnectorHandlerResult {
173
+ status: number;
174
+ body: string;
175
+ contentType?: string;
176
+ redirect?: string;
177
+ }
178
+ /**
179
+ * GET /connections/asana/auth — redirect to Asana consent screen.
180
+ */
181
+ export declare function handleAsanaAuthorize(): ConnectorHandlerResult;
182
+ /**
183
+ * GET /connections/asana/callback — exchange code for tokens.
184
+ */
185
+ export declare function handleAsanaCallback(code: string | null, state: string | null, error: string | null): Promise<ConnectorHandlerResult>;
186
+ /**
187
+ * POST /connections/asana/test — verify stored token works.
188
+ */
189
+ export declare function handleAsanaTest(): Promise<ConnectorHandlerResult>;
190
+ /**
191
+ * DELETE /connections/asana — clear stored tokens.
192
+ *
193
+ * Asana does not expose a public OAuth revocation endpoint, so we just drop
194
+ * local credentials. The token remains valid at Asana until it naturally
195
+ * expires (1h) or the user revokes the integration in their Asana account
196
+ * settings.
197
+ */
198
+ export declare function handleAsanaDisconnect(): Promise<ConnectorHandlerResult>;