patchwork-os 0.2.0-alpha.34 → 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 (117) hide show
  1. package/README.md +142 -88
  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 +32 -1
  6. package/dist/bridge.js.map +1 -1
  7. package/dist/commands/recipe.js +18 -1
  8. package/dist/commands/recipe.js.map +1 -1
  9. package/dist/commands/recipeInstall.d.ts +79 -1
  10. package/dist/commands/recipeInstall.js +241 -13
  11. package/dist/commands/recipeInstall.js.map +1 -1
  12. package/dist/connectors/asana.d.ts +198 -0
  13. package/dist/connectors/asana.js +680 -0
  14. package/dist/connectors/asana.js.map +1 -0
  15. package/dist/connectors/baseConnector.d.ts +16 -0
  16. package/dist/connectors/baseConnector.js +106 -24
  17. package/dist/connectors/baseConnector.js.map +1 -1
  18. package/dist/connectors/discord.d.ts +150 -0
  19. package/dist/connectors/discord.js +544 -0
  20. package/dist/connectors/discord.js.map +1 -0
  21. package/dist/connectors/github.js +11 -4
  22. package/dist/connectors/github.js.map +1 -1
  23. package/dist/connectors/gitlab.d.ts +180 -0
  24. package/dist/connectors/gitlab.js +582 -0
  25. package/dist/connectors/gitlab.js.map +1 -0
  26. package/dist/connectors/gmail.js +11 -0
  27. package/dist/connectors/gmail.js.map +1 -1
  28. package/dist/connectors/googleDrive.d.ts +34 -0
  29. package/dist/connectors/googleDrive.js +305 -0
  30. package/dist/connectors/googleDrive.js.map +1 -0
  31. package/dist/connectors/linear.js +23 -4
  32. package/dist/connectors/linear.js.map +1 -1
  33. package/dist/connectors/pagerduty.d.ts +160 -0
  34. package/dist/connectors/pagerduty.js +464 -0
  35. package/dist/connectors/pagerduty.js.map +1 -0
  36. package/dist/connectors/slack.d.ts +1 -1
  37. package/dist/connectors/slack.js +3 -1
  38. package/dist/connectors/slack.js.map +1 -1
  39. package/dist/featureFlags.d.ts +17 -11
  40. package/dist/featureFlags.js +52 -47
  41. package/dist/featureFlags.js.map +1 -1
  42. package/dist/index.js +255 -127
  43. package/dist/index.js.map +1 -1
  44. package/dist/recipeOrchestration.d.ts +7 -0
  45. package/dist/recipeOrchestration.js +149 -28
  46. package/dist/recipeOrchestration.js.map +1 -1
  47. package/dist/recipes/captureForRunlog.d.ts +27 -0
  48. package/dist/recipes/captureForRunlog.js +128 -0
  49. package/dist/recipes/captureForRunlog.js.map +1 -0
  50. package/dist/recipes/chainedRunner.d.ts +39 -3
  51. package/dist/recipes/chainedRunner.js +183 -28
  52. package/dist/recipes/chainedRunner.js.map +1 -1
  53. package/dist/recipes/detectSilentFail.d.ts +34 -0
  54. package/dist/recipes/detectSilentFail.js +105 -0
  55. package/dist/recipes/detectSilentFail.js.map +1 -0
  56. package/dist/recipes/manifest.js +21 -6
  57. package/dist/recipes/manifest.js.map +1 -1
  58. package/dist/recipes/replayRun.d.ts +62 -0
  59. package/dist/recipes/replayRun.js +97 -0
  60. package/dist/recipes/replayRun.js.map +1 -0
  61. package/dist/recipes/scheduler.js +102 -11
  62. package/dist/recipes/scheduler.js.map +1 -1
  63. package/dist/recipes/schemaGenerator.js +3 -3
  64. package/dist/recipes/schemaGenerator.js.map +1 -1
  65. package/dist/recipes/toolRegistry.d.ts +5 -0
  66. package/dist/recipes/toolRegistry.js +9 -0
  67. package/dist/recipes/toolRegistry.js.map +1 -1
  68. package/dist/recipes/tools/asana.d.ts +16 -0
  69. package/dist/recipes/tools/asana.js +524 -0
  70. package/dist/recipes/tools/asana.js.map +1 -0
  71. package/dist/recipes/tools/discord.d.ts +18 -0
  72. package/dist/recipes/tools/discord.js +254 -0
  73. package/dist/recipes/tools/discord.js.map +1 -0
  74. package/dist/recipes/tools/github.js +29 -4
  75. package/dist/recipes/tools/github.js.map +1 -1
  76. package/dist/recipes/tools/gitlab.d.ts +11 -0
  77. package/dist/recipes/tools/gitlab.js +285 -0
  78. package/dist/recipes/tools/gitlab.js.map +1 -0
  79. package/dist/recipes/tools/gmail.d.ts +1 -1
  80. package/dist/recipes/tools/gmail.js +230 -6
  81. package/dist/recipes/tools/gmail.js.map +1 -1
  82. package/dist/recipes/tools/googleDrive.d.ts +1 -0
  83. package/dist/recipes/tools/googleDrive.js +55 -0
  84. package/dist/recipes/tools/googleDrive.js.map +1 -0
  85. package/dist/recipes/tools/index.d.ts +6 -0
  86. package/dist/recipes/tools/index.js +6 -0
  87. package/dist/recipes/tools/index.js.map +1 -1
  88. package/dist/recipes/tools/linear.d.ts +2 -1
  89. package/dist/recipes/tools/linear.js +222 -1
  90. package/dist/recipes/tools/linear.js.map +1 -1
  91. package/dist/recipes/tools/meetingNotes.d.ts +21 -0
  92. package/dist/recipes/tools/meetingNotes.js +701 -0
  93. package/dist/recipes/tools/meetingNotes.js.map +1 -0
  94. package/dist/recipes/tools/pagerduty.d.ts +15 -0
  95. package/dist/recipes/tools/pagerduty.js +451 -0
  96. package/dist/recipes/tools/pagerduty.js.map +1 -0
  97. package/dist/recipes/tools/slack.js +8 -2
  98. package/dist/recipes/tools/slack.js.map +1 -1
  99. package/dist/recipes/yamlRunner.d.ts +23 -2
  100. package/dist/recipes/yamlRunner.js +263 -58
  101. package/dist/recipes/yamlRunner.js.map +1 -1
  102. package/dist/recipesHttp.d.ts +32 -0
  103. package/dist/recipesHttp.js +310 -1
  104. package/dist/recipesHttp.js.map +1 -1
  105. package/dist/runLog.d.ts +64 -2
  106. package/dist/runLog.js +116 -2
  107. package/dist/runLog.js.map +1 -1
  108. package/dist/server.d.ts +8 -0
  109. package/dist/server.js +331 -9
  110. package/dist/server.js.map +1 -1
  111. package/dist/streamableHttp.d.ts +31 -1
  112. package/dist/streamableHttp.js +20 -2
  113. package/dist/streamableHttp.js.map +1 -1
  114. package/dist/tools/slackPostMessage.js +1 -1
  115. package/dist/tools/slackPostMessage.js.map +1 -1
  116. package/package.json +19 -4
  117. package/templates/recipes/project-health-check.yaml +1 -1
@@ -0,0 +1,524 @@
1
+ /**
2
+ * Asana tools — read wrappers (workspaces, projects, tasks, user) plus writes
3
+ * (create_task, update_task, complete_task, add_task_comment).
4
+ *
5
+ * Self-registering tool module for the recipe tool registry. Read tools wrap
6
+ * connector throws into the `{count, items, error}` shape that the runner's
7
+ * silent-fail detector (PR #75) catches as a step error rather than a silent
8
+ * empty list. Write tools use a single-object response shape (no count/items)
9
+ * but still surface failures via an `error` field.
10
+ *
11
+ * Note: Asana's only OAuth scope (`default`) grants read+write combined —
12
+ * there is no read-only-only scope. Defense lives here at the recipe-tool
13
+ * layer: read tools declare `isWrite: false`, write tools declare
14
+ * `isWrite: true` so the approval queue gates them appropriately.
15
+ */
16
+ import { CommonSchemas, registerTool } from "../toolRegistry.js";
17
+ // ============================================================================
18
+ // asana.get_current_user
19
+ // ============================================================================
20
+ registerTool({
21
+ id: "asana.get_current_user",
22
+ namespace: "asana",
23
+ description: "Fetch the authenticated Asana user (gid, name, email).",
24
+ paramsSchema: {
25
+ type: "object",
26
+ properties: {
27
+ into: CommonSchemas.into,
28
+ },
29
+ },
30
+ outputSchema: {
31
+ type: "object",
32
+ properties: {
33
+ count: { type: "number" },
34
+ items: { type: "array", items: { type: "object" } },
35
+ error: { type: "string" },
36
+ },
37
+ },
38
+ riskDefault: "low",
39
+ isWrite: false,
40
+ isConnector: true,
41
+ execute: async () => {
42
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
43
+ try {
44
+ const connector = getAsanaConnector();
45
+ const user = await connector.getCurrentUser();
46
+ return JSON.stringify({ count: 1, items: [user] });
47
+ }
48
+ catch (err) {
49
+ return JSON.stringify({
50
+ count: 0,
51
+ items: [],
52
+ error: err instanceof Error ? err.message : String(err),
53
+ });
54
+ }
55
+ },
56
+ });
57
+ // ============================================================================
58
+ // asana.list_workspaces
59
+ // ============================================================================
60
+ registerTool({
61
+ id: "asana.list_workspaces",
62
+ namespace: "asana",
63
+ description: "List Asana workspaces the authenticated user belongs to.",
64
+ paramsSchema: {
65
+ type: "object",
66
+ properties: {
67
+ max: CommonSchemas.max,
68
+ into: CommonSchemas.into,
69
+ },
70
+ },
71
+ outputSchema: {
72
+ type: "object",
73
+ properties: {
74
+ count: { type: "number" },
75
+ items: { type: "array", items: { type: "object" } },
76
+ error: { type: "string" },
77
+ },
78
+ },
79
+ riskDefault: "low",
80
+ isWrite: false,
81
+ isConnector: true,
82
+ execute: async ({ params }) => {
83
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
84
+ const limit = typeof params.max === "number" ? params.max : 50;
85
+ try {
86
+ const connector = getAsanaConnector();
87
+ const workspaces = await connector.listWorkspaces({ limit });
88
+ return JSON.stringify({ count: workspaces.length, items: workspaces });
89
+ }
90
+ catch (err) {
91
+ return JSON.stringify({
92
+ count: 0,
93
+ items: [],
94
+ error: err instanceof Error ? err.message : String(err),
95
+ });
96
+ }
97
+ },
98
+ });
99
+ // ============================================================================
100
+ // asana.list_projects
101
+ // ============================================================================
102
+ registerTool({
103
+ id: "asana.list_projects",
104
+ namespace: "asana",
105
+ description: "List projects within an Asana workspace.",
106
+ paramsSchema: {
107
+ type: "object",
108
+ properties: {
109
+ workspaceGid: {
110
+ type: "string",
111
+ description: "Asana workspace gid",
112
+ },
113
+ max: CommonSchemas.max,
114
+ into: CommonSchemas.into,
115
+ },
116
+ required: ["workspaceGid"],
117
+ },
118
+ outputSchema: {
119
+ type: "object",
120
+ properties: {
121
+ count: { type: "number" },
122
+ items: { type: "array", items: { type: "object" } },
123
+ error: { type: "string" },
124
+ },
125
+ },
126
+ riskDefault: "low",
127
+ isWrite: false,
128
+ isConnector: true,
129
+ execute: async ({ params }) => {
130
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
131
+ const limit = typeof params.max === "number" ? params.max : 50;
132
+ try {
133
+ const connector = getAsanaConnector();
134
+ const projects = await connector.listProjects({
135
+ workspaceGid: params.workspaceGid,
136
+ limit,
137
+ });
138
+ return JSON.stringify({ count: projects.length, items: projects });
139
+ }
140
+ catch (err) {
141
+ return JSON.stringify({
142
+ count: 0,
143
+ items: [],
144
+ error: err instanceof Error ? err.message : String(err),
145
+ });
146
+ }
147
+ },
148
+ });
149
+ // ============================================================================
150
+ // asana.list_tasks
151
+ // ============================================================================
152
+ registerTool({
153
+ id: "asana.list_tasks",
154
+ namespace: "asana",
155
+ description: "List Asana tasks. Requires either projectGid, or assignee + workspaceGid.",
156
+ paramsSchema: {
157
+ type: "object",
158
+ properties: {
159
+ projectGid: {
160
+ type: "string",
161
+ description: "Asana project gid (filter by project)",
162
+ },
163
+ assignee: {
164
+ type: "string",
165
+ description: "Asana user gid or 'me' (filter by assignee)",
166
+ },
167
+ workspaceGid: {
168
+ type: "string",
169
+ description: "Asana workspace gid (required when filtering by assignee)",
170
+ },
171
+ max: CommonSchemas.max,
172
+ into: CommonSchemas.into,
173
+ },
174
+ },
175
+ outputSchema: {
176
+ type: "object",
177
+ properties: {
178
+ count: { type: "number" },
179
+ items: { type: "array", items: { type: "object" } },
180
+ error: { type: "string" },
181
+ },
182
+ },
183
+ riskDefault: "low",
184
+ isWrite: false,
185
+ isConnector: true,
186
+ execute: async ({ params }) => {
187
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
188
+ const limit = typeof params.max === "number" ? params.max : 50;
189
+ try {
190
+ const connector = getAsanaConnector();
191
+ const tasks = await connector.listTasks({
192
+ projectGid: params.projectGid,
193
+ assignee: params.assignee,
194
+ workspaceGid: params.workspaceGid,
195
+ limit,
196
+ });
197
+ return JSON.stringify({ count: tasks.length, items: tasks });
198
+ }
199
+ catch (err) {
200
+ return JSON.stringify({
201
+ count: 0,
202
+ items: [],
203
+ error: err instanceof Error ? err.message : String(err),
204
+ });
205
+ }
206
+ },
207
+ });
208
+ // ============================================================================
209
+ // asana.get_task
210
+ // ============================================================================
211
+ registerTool({
212
+ id: "asana.get_task",
213
+ namespace: "asana",
214
+ description: "Fetch a single Asana task by gid.",
215
+ paramsSchema: {
216
+ type: "object",
217
+ properties: {
218
+ taskGid: {
219
+ type: "string",
220
+ description: "Asana task gid",
221
+ },
222
+ into: CommonSchemas.into,
223
+ },
224
+ required: ["taskGid"],
225
+ },
226
+ outputSchema: {
227
+ type: "object",
228
+ properties: {
229
+ count: { type: "number" },
230
+ items: { type: "array", items: { type: "object" } },
231
+ error: { type: "string" },
232
+ },
233
+ },
234
+ riskDefault: "low",
235
+ isWrite: false,
236
+ isConnector: true,
237
+ execute: async ({ params }) => {
238
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
239
+ try {
240
+ const connector = getAsanaConnector();
241
+ const task = await connector.getTask(params.taskGid);
242
+ return JSON.stringify({ count: 1, items: [task] });
243
+ }
244
+ catch (err) {
245
+ return JSON.stringify({
246
+ count: 0,
247
+ items: [],
248
+ error: err instanceof Error ? err.message : String(err),
249
+ });
250
+ }
251
+ },
252
+ });
253
+ // ============================================================================
254
+ // asana.create_task (write-gated)
255
+ // ============================================================================
256
+ registerTool({
257
+ id: "asana.create_task",
258
+ namespace: "asana",
259
+ description: "Create a new Asana task in a workspace, optionally attached to a project, assigned, due-dated, or nested under a parent task.",
260
+ paramsSchema: {
261
+ type: "object",
262
+ properties: {
263
+ workspace_gid: {
264
+ type: "string",
265
+ description: "Asana workspace gid (required)",
266
+ },
267
+ name: { type: "string", description: "Task title (required)" },
268
+ project_gid: {
269
+ type: "string",
270
+ description: "Optional project gid to attach the task to",
271
+ },
272
+ notes: {
273
+ type: "string",
274
+ description: "Optional task body / notes (free-form text)",
275
+ },
276
+ assignee_gid: {
277
+ type: "string",
278
+ description: "Optional Asana user gid to assign the task to",
279
+ },
280
+ due_on: {
281
+ type: "string",
282
+ description: "Optional ISO date YYYY-MM-DD",
283
+ },
284
+ parent_task_gid: {
285
+ type: "string",
286
+ description: "Optional parent task gid (creates a subtask)",
287
+ },
288
+ into: CommonSchemas.into,
289
+ },
290
+ required: ["workspace_gid", "name"],
291
+ },
292
+ outputSchema: {
293
+ type: "object",
294
+ properties: {
295
+ ok: { type: "boolean" },
296
+ gid: { type: "string" },
297
+ name: { type: "string" },
298
+ error: { type: "string" },
299
+ },
300
+ },
301
+ riskDefault: "medium",
302
+ isWrite: true,
303
+ isConnector: true,
304
+ execute: async ({ params }) => {
305
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
306
+ try {
307
+ const connector = getAsanaConnector();
308
+ const task = await connector.createTask({
309
+ workspaceGid: params.workspace_gid,
310
+ name: params.name,
311
+ projectGid: typeof params.project_gid === "string"
312
+ ? params.project_gid
313
+ : undefined,
314
+ notes: typeof params.notes === "string" ? params.notes : undefined,
315
+ assigneeGid: typeof params.assignee_gid === "string"
316
+ ? params.assignee_gid
317
+ : undefined,
318
+ dueOn: typeof params.due_on === "string" ? params.due_on : undefined,
319
+ parentTaskGid: typeof params.parent_task_gid === "string"
320
+ ? params.parent_task_gid
321
+ : undefined,
322
+ });
323
+ return JSON.stringify({ ok: true, gid: task.gid, name: task.name });
324
+ }
325
+ catch (err) {
326
+ return JSON.stringify({
327
+ ok: false,
328
+ error: err instanceof Error ? err.message : String(err),
329
+ });
330
+ }
331
+ },
332
+ });
333
+ // ============================================================================
334
+ // asana.update_task (write-gated)
335
+ // ============================================================================
336
+ registerTool({
337
+ id: "asana.update_task",
338
+ namespace: "asana",
339
+ description: "Update fields on an Asana task. At least one of name/notes/completed/assignee_gid/due_on must be supplied.",
340
+ paramsSchema: {
341
+ type: "object",
342
+ properties: {
343
+ task_gid: { type: "string", description: "Asana task gid (required)" },
344
+ name: { type: "string", description: "New task title" },
345
+ notes: { type: "string", description: "New task notes / body" },
346
+ completed: {
347
+ type: "boolean",
348
+ description: "Mark task completed/uncompleted",
349
+ },
350
+ assignee_gid: {
351
+ type: "string",
352
+ description: "New assignee user gid",
353
+ },
354
+ due_on: {
355
+ type: "string",
356
+ description: "ISO date YYYY-MM-DD",
357
+ },
358
+ into: CommonSchemas.into,
359
+ },
360
+ required: ["task_gid"],
361
+ },
362
+ outputSchema: {
363
+ type: "object",
364
+ properties: {
365
+ ok: { type: "boolean" },
366
+ gid: { type: "string" },
367
+ name: { type: "string" },
368
+ completed: { type: "boolean" },
369
+ error: { type: "string" },
370
+ },
371
+ },
372
+ riskDefault: "medium",
373
+ isWrite: true,
374
+ isConnector: true,
375
+ execute: async ({ params }) => {
376
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
377
+ // Defense at wrapper level — refuse when no update fields supplied so the
378
+ // recipe author sees a clear error rather than an Asana 400.
379
+ const updates = {};
380
+ if (typeof params.name === "string")
381
+ updates.name = params.name;
382
+ if (typeof params.notes === "string")
383
+ updates.notes = params.notes;
384
+ if (typeof params.completed === "boolean") {
385
+ updates.completed = params.completed;
386
+ }
387
+ if (typeof params.assignee_gid === "string") {
388
+ updates.assigneeGid = params.assignee_gid;
389
+ }
390
+ if (typeof params.due_on === "string")
391
+ updates.dueOn = params.due_on;
392
+ if (Object.keys(updates).length === 0) {
393
+ return JSON.stringify({
394
+ ok: false,
395
+ error: "update_task requires at least one of name/notes/completed/assignee_gid/due_on",
396
+ });
397
+ }
398
+ try {
399
+ const connector = getAsanaConnector();
400
+ const task = await connector.updateTask(params.task_gid, updates);
401
+ return JSON.stringify({
402
+ ok: true,
403
+ gid: task.gid,
404
+ name: task.name,
405
+ completed: task.completed,
406
+ });
407
+ }
408
+ catch (err) {
409
+ return JSON.stringify({
410
+ ok: false,
411
+ error: err instanceof Error ? err.message : String(err),
412
+ });
413
+ }
414
+ },
415
+ });
416
+ // ============================================================================
417
+ // asana.complete_task (write-gated)
418
+ // ============================================================================
419
+ registerTool({
420
+ id: "asana.complete_task",
421
+ namespace: "asana",
422
+ description: "Mark an Asana task completed (sets completed: true).",
423
+ paramsSchema: {
424
+ type: "object",
425
+ properties: {
426
+ task_gid: { type: "string", description: "Asana task gid (required)" },
427
+ into: CommonSchemas.into,
428
+ },
429
+ required: ["task_gid"],
430
+ },
431
+ outputSchema: {
432
+ type: "object",
433
+ properties: {
434
+ ok: { type: "boolean" },
435
+ gid: { type: "string" },
436
+ completed: { type: "boolean" },
437
+ error: { type: "string" },
438
+ },
439
+ },
440
+ riskDefault: "low",
441
+ isWrite: true,
442
+ isConnector: true,
443
+ execute: async ({ params }) => {
444
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
445
+ try {
446
+ const connector = getAsanaConnector();
447
+ const task = await connector.completeTask(params.task_gid);
448
+ return JSON.stringify({
449
+ ok: true,
450
+ gid: task.gid,
451
+ completed: task.completed,
452
+ });
453
+ }
454
+ catch (err) {
455
+ return JSON.stringify({
456
+ ok: false,
457
+ error: err instanceof Error ? err.message : String(err),
458
+ });
459
+ }
460
+ },
461
+ });
462
+ // ============================================================================
463
+ // asana.add_task_comment (write-gated)
464
+ // ============================================================================
465
+ registerTool({
466
+ id: "asana.add_task_comment",
467
+ namespace: "asana",
468
+ description: "Append a comment story to an Asana task's timeline.",
469
+ paramsSchema: {
470
+ type: "object",
471
+ properties: {
472
+ task_gid: { type: "string", description: "Asana task gid (required)" },
473
+ text: {
474
+ type: "string",
475
+ description: "Comment text (non-empty, plain text)",
476
+ minLength: 1,
477
+ },
478
+ into: CommonSchemas.into,
479
+ },
480
+ required: ["task_gid", "text"],
481
+ },
482
+ outputSchema: {
483
+ type: "object",
484
+ properties: {
485
+ ok: { type: "boolean" },
486
+ gid: { type: "string" },
487
+ text: { type: "string" },
488
+ created_at: { type: "string" },
489
+ error: { type: "string" },
490
+ },
491
+ },
492
+ riskDefault: "low",
493
+ isWrite: true,
494
+ isConnector: true,
495
+ execute: async ({ params }) => {
496
+ const { getAsanaConnector } = await import("../../connectors/asana.js");
497
+ const text = typeof params.text === "string" ? params.text : "";
498
+ if (!text) {
499
+ return JSON.stringify({
500
+ ok: false,
501
+ error: "add_task_comment requires non-empty text",
502
+ });
503
+ }
504
+ try {
505
+ const connector = getAsanaConnector();
506
+ const story = await connector.addTaskComment(params.task_gid, {
507
+ text,
508
+ });
509
+ return JSON.stringify({
510
+ ok: true,
511
+ gid: story.gid,
512
+ text: story.text,
513
+ created_at: story.created_at,
514
+ });
515
+ }
516
+ catch (err) {
517
+ return JSON.stringify({
518
+ ok: false,
519
+ error: err instanceof Error ? err.message : String(err),
520
+ });
521
+ }
522
+ },
523
+ });
524
+ //# sourceMappingURL=asana.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asana.js","sourceRoot":"","sources":["../../../src/recipes/tools/asana.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Discord tools — wrappers for guilds, channels, messages, user, and send.
3
+ *
4
+ * Self-registering tool module for the recipe tool registry. Read tools wrap
5
+ * connector throws into the `{count, items, error}` shape; the write tool
6
+ * (`discord.send_message`) returns the single-object `{ok, ..., error?}` shape
7
+ * and is gated through the approval queue (`isWrite: true`).
8
+ *
9
+ * Each tool wraps connector throws into the `{count, items, error}` shape that
10
+ * the runner's silent-fail detector (PR #75) catches as a step error rather
11
+ * than a silent empty list.
12
+ *
13
+ * NOTE on `discord.send_message`: Discord's REST API only accepts message
14
+ * sends from bot-scope OAuth tokens. The connector currently uses user-scope
15
+ * (identify/guilds/messages.read), so the underlying call will surface a
16
+ * `permission_denied` error until operators re-auth with the bot scope.
17
+ */
18
+ export {};