@gracefultools/astrid-sdk 0.7.16 → 0.8.1

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 (114) hide show
  1. package/README.md +127 -341
  2. package/dist/channel/channel.d.ts +33 -0
  3. package/dist/channel/channel.d.ts.map +1 -0
  4. package/dist/channel/channel.js +90 -0
  5. package/dist/channel/channel.js.map +1 -0
  6. package/dist/channel/index.d.ts +13 -0
  7. package/dist/channel/index.d.ts.map +1 -0
  8. package/dist/channel/index.js +23 -0
  9. package/dist/channel/index.js.map +1 -0
  10. package/dist/channel/message-formatter.d.ts +14 -0
  11. package/dist/channel/message-formatter.d.ts.map +1 -0
  12. package/dist/channel/message-formatter.js +71 -0
  13. package/dist/channel/message-formatter.js.map +1 -0
  14. package/dist/channel/oauth-client.d.ts +15 -0
  15. package/dist/channel/oauth-client.d.ts.map +1 -0
  16. package/dist/channel/oauth-client.js +45 -0
  17. package/dist/channel/oauth-client.js.map +1 -0
  18. package/dist/channel/rest-client.d.ts +16 -0
  19. package/dist/channel/rest-client.d.ts.map +1 -0
  20. package/dist/channel/rest-client.js +66 -0
  21. package/dist/channel/rest-client.js.map +1 -0
  22. package/dist/channel/session-mapper.d.ts +14 -0
  23. package/dist/channel/session-mapper.d.ts.map +1 -0
  24. package/dist/channel/session-mapper.js +37 -0
  25. package/dist/channel/session-mapper.js.map +1 -0
  26. package/dist/channel/sse-client.d.ts +31 -0
  27. package/dist/channel/sse-client.d.ts.map +1 -0
  28. package/dist/channel/sse-client.js +171 -0
  29. package/dist/channel/sse-client.js.map +1 -0
  30. package/dist/channel/types.d.ts +65 -0
  31. package/dist/channel/types.d.ts.map +1 -0
  32. package/dist/channel/types.js +3 -0
  33. package/dist/channel/types.js.map +1 -0
  34. package/dist/config/agent-workflow.js +7 -7
  35. package/dist/index.d.ts +1 -8
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +16 -30
  38. package/dist/index.js.map +1 -1
  39. package/dist/types/index.d.ts +1 -1
  40. package/dist/types/index.d.ts.map +1 -1
  41. package/dist/utils/agent-config.d.ts.map +1 -1
  42. package/dist/utils/agent-config.js +14 -0
  43. package/dist/utils/agent-config.js.map +1 -1
  44. package/package.json +65 -77
  45. package/templates/.astrid.config.json +60 -60
  46. package/templates/ASTRID.template.md +74 -74
  47. package/dist/bin/cli.d.ts +0 -14
  48. package/dist/bin/cli.d.ts.map +0 -1
  49. package/dist/bin/cli.js +0 -1610
  50. package/dist/bin/cli.js.map +0 -1
  51. package/dist/executors/claude.d.ts +0 -65
  52. package/dist/executors/claude.d.ts.map +0 -1
  53. package/dist/executors/claude.js +0 -838
  54. package/dist/executors/claude.js.map +0 -1
  55. package/dist/executors/gemini.d.ts +0 -23
  56. package/dist/executors/gemini.d.ts.map +0 -1
  57. package/dist/executors/gemini.js +0 -558
  58. package/dist/executors/gemini.js.map +0 -1
  59. package/dist/executors/openai.d.ts +0 -17
  60. package/dist/executors/openai.d.ts.map +0 -1
  61. package/dist/executors/openai.js +0 -614
  62. package/dist/executors/openai.js.map +0 -1
  63. package/dist/executors/shared/index.d.ts +0 -9
  64. package/dist/executors/shared/index.d.ts.map +0 -1
  65. package/dist/executors/shared/index.js +0 -21
  66. package/dist/executors/shared/index.js.map +0 -1
  67. package/dist/executors/shared/tool-executor.d.ts +0 -52
  68. package/dist/executors/shared/tool-executor.d.ts.map +0 -1
  69. package/dist/executors/shared/tool-executor.js +0 -262
  70. package/dist/executors/shared/tool-executor.js.map +0 -1
  71. package/dist/executors/shared/tool-schemas.d.ts +0 -61
  72. package/dist/executors/shared/tool-schemas.d.ts.map +0 -1
  73. package/dist/executors/shared/tool-schemas.js +0 -135
  74. package/dist/executors/shared/tool-schemas.js.map +0 -1
  75. package/dist/executors/terminal-base.d.ts +0 -207
  76. package/dist/executors/terminal-base.d.ts.map +0 -1
  77. package/dist/executors/terminal-base.js +0 -552
  78. package/dist/executors/terminal-base.js.map +0 -1
  79. package/dist/executors/terminal-claude.d.ts +0 -116
  80. package/dist/executors/terminal-claude.d.ts.map +0 -1
  81. package/dist/executors/terminal-claude.js +0 -700
  82. package/dist/executors/terminal-claude.js.map +0 -1
  83. package/dist/executors/terminal-executors.test.d.ts +0 -8
  84. package/dist/executors/terminal-executors.test.d.ts.map +0 -1
  85. package/dist/executors/terminal-executors.test.js +0 -469
  86. package/dist/executors/terminal-executors.test.js.map +0 -1
  87. package/dist/executors/terminal-gemini.d.ts +0 -50
  88. package/dist/executors/terminal-gemini.d.ts.map +0 -1
  89. package/dist/executors/terminal-gemini.js +0 -401
  90. package/dist/executors/terminal-gemini.js.map +0 -1
  91. package/dist/executors/terminal-openai.d.ts +0 -50
  92. package/dist/executors/terminal-openai.d.ts.map +0 -1
  93. package/dist/executors/terminal-openai.js +0 -405
  94. package/dist/executors/terminal-openai.js.map +0 -1
  95. package/dist/server/astrid-client.d.ts +0 -77
  96. package/dist/server/astrid-client.d.ts.map +0 -1
  97. package/dist/server/astrid-client.js +0 -125
  98. package/dist/server/astrid-client.js.map +0 -1
  99. package/dist/server/index.d.ts +0 -38
  100. package/dist/server/index.d.ts.map +0 -1
  101. package/dist/server/index.js +0 -408
  102. package/dist/server/index.js.map +0 -1
  103. package/dist/server/repo-manager.d.ts +0 -41
  104. package/dist/server/repo-manager.d.ts.map +0 -1
  105. package/dist/server/repo-manager.js +0 -177
  106. package/dist/server/repo-manager.js.map +0 -1
  107. package/dist/server/session-manager.d.ts +0 -93
  108. package/dist/server/session-manager.d.ts.map +0 -1
  109. package/dist/server/session-manager.js +0 -217
  110. package/dist/server/session-manager.js.map +0 -1
  111. package/dist/server/webhook-signature.d.ts +0 -23
  112. package/dist/server/webhook-signature.d.ts.map +0 -1
  113. package/dist/server/webhook-signature.js +0 -74
  114. package/dist/server/webhook-signature.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-formatter.d.ts","sourceRoot":"","sources":["../../src/channel/message-formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAI1F;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,CA+C7D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAMtF;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAI9D"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.taskToMessage = taskToMessage;
4
+ exports.commentToMessage = commentToMessage;
5
+ exports.responseToComment = responseToComment;
6
+ const PRIORITIES = ['', '⬇️ Low', '➡️ Medium', '⬆️ High'];
7
+ /**
8
+ * Format an Astrid task as an OpenClaw inbound message.
9
+ */
10
+ function taskToMessage(task) {
11
+ const parts = [];
12
+ parts.push(`# Task: ${task.title}`);
13
+ parts.push('');
14
+ if (task.listDescription) {
15
+ parts.push(`> **Instructions (from list "${task.listName}"):**`);
16
+ parts.push(`> ${task.listDescription.replace(/\n/g, '\n> ')}`);
17
+ parts.push('');
18
+ }
19
+ if (task.description) {
20
+ parts.push(task.description);
21
+ parts.push('');
22
+ }
23
+ const meta = [];
24
+ if (task.priority > 0 && task.priority < PRIORITIES.length) {
25
+ meta.push(`**Priority:** ${PRIORITIES[task.priority]}`);
26
+ }
27
+ if (task.listName)
28
+ meta.push(`**List:** ${task.listName}`);
29
+ if (task.assignerName)
30
+ meta.push(`**Assigned by:** ${task.assignerName}`);
31
+ if (task.dueDateTime) {
32
+ const d = new Date(task.dueDateTime);
33
+ meta.push(`**Due:** ${d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' })}`);
34
+ }
35
+ if (meta.length) {
36
+ parts.push(meta.join('\n'));
37
+ parts.push('');
38
+ }
39
+ if (task.comments.length > 0) {
40
+ parts.push('---');
41
+ parts.push('**Previous conversation:**');
42
+ for (const c of task.comments) {
43
+ parts.push(`> **${c.authorName || 'Unknown'}:** ${c.content}`);
44
+ }
45
+ parts.push('');
46
+ }
47
+ return {
48
+ content: parts.join('\n').trim(),
49
+ sessionKey: `astrid:task:${task.id}`,
50
+ metadata: { taskId: task.id, priority: task.priority, listId: task.listId },
51
+ };
52
+ }
53
+ /**
54
+ * Format a human comment as a follow-up inbound message.
55
+ */
56
+ function commentToMessage(taskId, comment) {
57
+ return {
58
+ content: `**${comment.authorName || 'Someone'}:** ${comment.content}`,
59
+ sessionKey: `astrid:task:${taskId}`,
60
+ metadata: { taskId, commentId: comment.id },
61
+ };
62
+ }
63
+ /**
64
+ * Strip agent response for posting as an Astrid comment.
65
+ */
66
+ function responseToComment(msg) {
67
+ let content = msg.content;
68
+ content = content.replace(/^(Assistant|AI|Agent):\s*/i, '');
69
+ return content.trim();
70
+ }
71
+ //# sourceMappingURL=message-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-formatter.js","sourceRoot":"","sources":["../../src/channel/message-formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { AstridChannelConfig } from './types.js';
2
+ /**
3
+ * OAuth2 client_credentials flow with token caching and auto-refresh.
4
+ */
5
+ export declare class OAuthClient {
6
+ private config;
7
+ private accessToken;
8
+ private expiresAt;
9
+ constructor(config: AstridChannelConfig);
10
+ /** Get a valid token, refreshing if needed (5 min buffer). */
11
+ ensureToken(): Promise<string>;
12
+ /** Force-refresh the token. */
13
+ refreshToken(): Promise<string>;
14
+ }
15
+ //# sourceMappingURL=oauth-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client.d.ts","sourceRoot":"","sources":["../../src/channel/oauth-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAErD;;GAEG;AACH,qBAAa,WAAW;IAIV,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,SAAS,CAAI;gBAED,MAAM,EAAE,mBAAmB;IAE/C,8DAA8D;IACxD,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC;IAOpC,+BAA+B;IACzB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAwBtC"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAuthClient = void 0;
4
+ /**
5
+ * OAuth2 client_credentials flow with token caching and auto-refresh.
6
+ */
7
+ class OAuthClient {
8
+ config;
9
+ accessToken = null;
10
+ expiresAt = 0;
11
+ constructor(config) {
12
+ this.config = config;
13
+ }
14
+ /** Get a valid token, refreshing if needed (5 min buffer). */
15
+ async ensureToken() {
16
+ if (this.accessToken && Date.now() < this.expiresAt - 300_000) {
17
+ return this.accessToken;
18
+ }
19
+ return this.refreshToken();
20
+ }
21
+ /** Force-refresh the token. */
22
+ async refreshToken() {
23
+ const endpoint = this.config.tokenEndpoint
24
+ || `${this.config.apiBase || 'https://www.astrid.cc/api/v1'}/oauth/token`;
25
+ const res = await fetch(endpoint, {
26
+ method: 'POST',
27
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
28
+ body: new URLSearchParams({
29
+ grant_type: 'client_credentials',
30
+ client_id: this.config.clientId,
31
+ client_secret: this.config.clientSecret,
32
+ scope: 'tasks:read tasks:write comments:read comments:write sse:connect',
33
+ }),
34
+ });
35
+ if (!res.ok) {
36
+ throw new Error(`OAuth token request failed: ${res.status} ${res.statusText}`);
37
+ }
38
+ const data = await res.json();
39
+ this.accessToken = data.access_token;
40
+ this.expiresAt = Date.now() + (data.expires_in * 1000);
41
+ return this.accessToken;
42
+ }
43
+ }
44
+ exports.OAuthClient = OAuthClient;
45
+ //# sourceMappingURL=oauth-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-client.js","sourceRoot":"","sources":["../../src/channel/oauth-client.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,WAAW;IAIF;IAHZ,WAAW,GAAkB,IAAI,CAAA;IACjC,SAAS,GAAG,CAAC,CAAA;IAErB,YAAoB,MAA2B;QAA3B,WAAM,GAAN,MAAM,CAAqB;IAAG,CAAC;IAEnD,8DAA8D;IAC9D,KAAK,CAAC,WAAW;QACf,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,CAAC;YAC9D,OAAO,IAAI,CAAC,WAAW,CAAA;QACzB,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,EAAE,CAAA;IAC5B,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,YAAY;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa;eACrC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,8BAA8B,cAAc,CAAA;QAE3E,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;gBAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;gBACvC,KAAK,EAAE,iEAAiE;aACzE,CAAC;SACH,CAAC,CAAA;QAEF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAA;QAChF,CAAC;QAED,MAAM,IAAI,GAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,YAAY,CAAA;QACpC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;QACtD,OAAO,IAAI,CAAC,WAAY,CAAA;IAC1B,CAAC;CACF;AAvCD,kCAuCC"}
@@ -0,0 +1,16 @@
1
+ import type { OAuthClient } from './oauth-client.js';
2
+ import type { AgentTask, AgentComment } from './types.js';
3
+ /**
4
+ * REST client for the Astrid Agent Protocol endpoints.
5
+ */
6
+ export declare class RestClient {
7
+ private apiBase;
8
+ private oauth;
9
+ constructor(apiBase: string | undefined, oauth: OAuthClient);
10
+ private request;
11
+ getAssignedTasks(completed?: boolean): Promise<AgentTask[]>;
12
+ getTask(id: string): Promise<AgentTask>;
13
+ postComment(taskId: string, content: string): Promise<AgentComment>;
14
+ completeTask(taskId: string): Promise<AgentTask>;
15
+ }
16
+ //# sourceMappingURL=rest-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-client.d.ts","sourceRoot":"","sources":["../../src/channel/rest-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzD;;GAEG;AACH,qBAAa,UAAU;IAEnB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,YAAiC,EAChD,KAAK,EAAE,WAAW;YAGd,OAAO;IAiCf,gBAAgB,CAAC,SAAS,UAAQ,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAKzD,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAKvC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAQnE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAOvD"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RestClient = void 0;
4
+ /**
5
+ * REST client for the Astrid Agent Protocol endpoints.
6
+ */
7
+ class RestClient {
8
+ apiBase;
9
+ oauth;
10
+ constructor(apiBase = 'https://www.astrid.cc/api/v1', oauth) {
11
+ this.apiBase = apiBase;
12
+ this.oauth = oauth;
13
+ }
14
+ async request(path, options = {}) {
15
+ const token = await this.oauth.ensureToken();
16
+ const url = `${this.apiBase}/agent${path}`;
17
+ let res = await fetch(url, {
18
+ ...options,
19
+ headers: {
20
+ 'Authorization': `Bearer ${token}`,
21
+ 'Content-Type': 'application/json',
22
+ ...options.headers,
23
+ },
24
+ });
25
+ // Retry once on 401
26
+ if (res.status === 401) {
27
+ const newToken = await this.oauth.refreshToken();
28
+ res = await fetch(url, {
29
+ ...options,
30
+ headers: {
31
+ 'Authorization': `Bearer ${newToken}`,
32
+ 'Content-Type': 'application/json',
33
+ ...options.headers,
34
+ },
35
+ });
36
+ }
37
+ if (!res.ok) {
38
+ throw new Error(`Astrid API error: ${res.status} ${res.statusText} on ${path}`);
39
+ }
40
+ return res.json();
41
+ }
42
+ async getAssignedTasks(completed = false) {
43
+ const data = await this.request(`/tasks?completed=${completed}`);
44
+ return data.tasks;
45
+ }
46
+ async getTask(id) {
47
+ const data = await this.request(`/tasks/${id}`);
48
+ return data.task;
49
+ }
50
+ async postComment(taskId, content) {
51
+ const data = await this.request(`/tasks/${taskId}/comments`, {
52
+ method: 'POST',
53
+ body: JSON.stringify({ content }),
54
+ });
55
+ return data.comment;
56
+ }
57
+ async completeTask(taskId) {
58
+ const data = await this.request(`/tasks/${taskId}`, {
59
+ method: 'PATCH',
60
+ body: JSON.stringify({ completed: true }),
61
+ });
62
+ return data.task;
63
+ }
64
+ }
65
+ exports.RestClient = RestClient;
66
+ //# sourceMappingURL=rest-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest-client.js","sourceRoot":"","sources":["../../src/channel/rest-client.ts"],"names":[],"mappings":";;;AAGA;;GAEG;AACH,MAAa,UAAU;IAEX;IACA;IAFV,YACU,UAAkB,8BAA8B,EAChD,KAAkB;QADlB,YAAO,GAAP,OAAO,CAAyC;QAChD,UAAK,GAAL,KAAK,CAAa;IACzB,CAAC;IAEI,KAAK,CAAC,OAAO,CAAU,IAAY,EAAE,UAAuB,EAAE;QACpE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,SAAS,IAAI,EAAE,CAAA;QAE1C,IAAI,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YACzB,GAAG,OAAO;YACV,OAAO,EAAE;gBACP,eAAe,EAAE,UAAU,KAAK,EAAE;gBAClC,cAAc,EAAE,kBAAkB;gBAClC,GAAG,OAAO,CAAC,OAAO;aACnB;SACF,CAAC,CAAA;QAEF,oBAAoB;QACpB,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAA;YAChD,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBACrB,GAAG,OAAO;gBACV,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,QAAQ,EAAE;oBACrC,cAAc,EAAE,kBAAkB;oBAClC,GAAG,OAAO,CAAC,OAAO;iBACnB;aACF,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,UAAU,OAAO,IAAI,EAAE,CAAC,CAAA;QACjF,CAAC;QAED,OAAO,GAAG,CAAC,IAAI,EAAgB,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,SAAS,GAAG,KAAK;QACtC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAyB,oBAAoB,SAAS,EAAE,CAAC,CAAA;QACxF,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACtB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAsB,UAAU,EAAE,EAAE,CAAC,CAAA;QACpE,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,OAAe;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAA4B,UAAU,MAAM,WAAW,EAAE;YACtF,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;SAClC,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc;QAC/B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAsB,UAAU,MAAM,EAAE,EAAE;YACvE,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;SAC1C,CAAC,CAAA;QACF,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;CACF;AAhED,gCAgEC"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Maps Astrid taskId ↔ OpenClaw sessionKey.
3
+ * Session key format: `astrid:task:{taskId}`
4
+ */
5
+ export declare class SessionMapper {
6
+ private taskToSession;
7
+ private sessionToTask;
8
+ getOrCreate(taskId: string): string;
9
+ get(taskId: string): string | undefined;
10
+ getTaskId(sessionKey: string): string | undefined;
11
+ end(taskId: string): void;
12
+ activeCount(): number;
13
+ }
14
+ //# sourceMappingURL=session-mapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mapper.d.ts","sourceRoot":"","sources":["../../src/channel/session-mapper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAA4B;IAEjD,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAUnC,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvC,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjD,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAMzB,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SessionMapper = void 0;
4
+ /**
5
+ * Maps Astrid taskId ↔ OpenClaw sessionKey.
6
+ * Session key format: `astrid:task:{taskId}`
7
+ */
8
+ class SessionMapper {
9
+ taskToSession = new Map();
10
+ sessionToTask = new Map();
11
+ getOrCreate(taskId) {
12
+ let key = this.taskToSession.get(taskId);
13
+ if (!key) {
14
+ key = `astrid:task:${taskId}`;
15
+ this.taskToSession.set(taskId, key);
16
+ this.sessionToTask.set(key, taskId);
17
+ }
18
+ return key;
19
+ }
20
+ get(taskId) {
21
+ return this.taskToSession.get(taskId);
22
+ }
23
+ getTaskId(sessionKey) {
24
+ return this.sessionToTask.get(sessionKey);
25
+ }
26
+ end(taskId) {
27
+ const key = this.taskToSession.get(taskId);
28
+ if (key)
29
+ this.sessionToTask.delete(key);
30
+ this.taskToSession.delete(taskId);
31
+ }
32
+ activeCount() {
33
+ return this.taskToSession.size;
34
+ }
35
+ }
36
+ exports.SessionMapper = SessionMapper;
37
+ //# sourceMappingURL=session-mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-mapper.js","sourceRoot":"","sources":["../../src/channel/session-mapper.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,MAAa,aAAa;IAChB,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;IACzC,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;IAEjD,WAAW,CAAC,MAAc;QACxB,IAAI,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACxC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,GAAG,GAAG,eAAe,MAAM,EAAE,CAAA;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;YACnC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QACrC,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACvC,CAAC;IAED,SAAS,CAAC,UAAkB;QAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;IAC3C,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAC1C,IAAI,GAAG;YAAE,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACvC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACnC,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAA;IAChC,CAAC;CACF;AA/BD,sCA+BC"}
@@ -0,0 +1,31 @@
1
+ import type { OAuthClient } from './oauth-client.js';
2
+ import type { AstridChannelConfig, AgentSSEEvent } from './types.js';
3
+ type EventHandler = (event: AgentSSEEvent) => void;
4
+ /**
5
+ * SSE client using fetch + ReadableStream (supports Authorization headers).
6
+ * Reconnects with exponential backoff. Keepalive timeout at 90s.
7
+ */
8
+ export declare class SSEClient {
9
+ private config;
10
+ private oauth;
11
+ private abortController;
12
+ private connected;
13
+ private lastEventTime;
14
+ private reconnectAttempts;
15
+ private handlers;
16
+ private keepaliveTimer;
17
+ private stopped;
18
+ constructor(config: AstridChannelConfig, oauth: OAuthClient);
19
+ on(eventType: string, handler: EventHandler): void;
20
+ isConnected(): boolean;
21
+ connect(): Promise<void>;
22
+ disconnect(): void;
23
+ private scheduleReconnect;
24
+ private parseBuffer;
25
+ private dispatch;
26
+ private startKeepalive;
27
+ private resetKeepalive;
28
+ private stopKeepalive;
29
+ }
30
+ export {};
31
+ //# sourceMappingURL=sse-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.d.ts","sourceRoot":"","sources":["../../src/channel/sse-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEpE,KAAK,YAAY,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAA;AAElD;;;GAGG;AACH,qBAAa,SAAS;IAUlB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,KAAK;IAVf,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,QAAQ,CAAoC;IACpD,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,OAAO,CAAQ;gBAGb,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,WAAW;IAG5B,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI;IAMlD,WAAW,IAAI,OAAO;IAIhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA+D9B,UAAU,IAAI,IAAI;IAOlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,WAAW;IAyCnB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,cAAc;IAOtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,aAAa;CAMtB"}
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SSEClient = void 0;
4
+ /**
5
+ * SSE client using fetch + ReadableStream (supports Authorization headers).
6
+ * Reconnects with exponential backoff. Keepalive timeout at 90s.
7
+ */
8
+ class SSEClient {
9
+ config;
10
+ oauth;
11
+ abortController = null;
12
+ connected = false;
13
+ lastEventTime = Date.now();
14
+ reconnectAttempts = 0;
15
+ handlers = new Map();
16
+ keepaliveTimer = null;
17
+ stopped = false;
18
+ constructor(config, oauth) {
19
+ this.config = config;
20
+ this.oauth = oauth;
21
+ }
22
+ on(eventType, handler) {
23
+ const list = this.handlers.get(eventType) || [];
24
+ list.push(handler);
25
+ this.handlers.set(eventType, list);
26
+ }
27
+ isConnected() {
28
+ return this.connected;
29
+ }
30
+ async connect() {
31
+ this.stopped = false;
32
+ const token = await this.oauth.ensureToken();
33
+ const base = this.config.sseEndpoint
34
+ || `${this.config.apiBase || 'https://www.astrid.cc/api/v1'}/agent/events`;
35
+ const since = new Date(this.lastEventTime).toISOString();
36
+ const url = `${base}?since=${encodeURIComponent(since)}`;
37
+ this.abortController = new AbortController();
38
+ const res = await fetch(url, {
39
+ headers: {
40
+ 'Authorization': `Bearer ${token}`,
41
+ 'Accept': 'text/event-stream',
42
+ 'Cache-Control': 'no-cache',
43
+ },
44
+ signal: this.abortController.signal,
45
+ });
46
+ if (res.status === 401) {
47
+ await this.oauth.refreshToken();
48
+ return this.connect();
49
+ }
50
+ if (!res.ok || !res.body) {
51
+ throw new Error(`SSE connection failed: ${res.status}`);
52
+ }
53
+ this.connected = true;
54
+ this.reconnectAttempts = 0;
55
+ this.startKeepalive();
56
+ const reader = res.body.getReader();
57
+ const decoder = new TextDecoder();
58
+ let buffer = '';
59
+ try {
60
+ while (true) {
61
+ const { done, value } = await reader.read();
62
+ if (done)
63
+ break;
64
+ buffer += decoder.decode(value, { stream: true });
65
+ const { events, remaining } = this.parseBuffer(buffer);
66
+ buffer = remaining;
67
+ for (const event of events) {
68
+ this.lastEventTime = Date.now();
69
+ this.resetKeepalive();
70
+ this.dispatch(event);
71
+ }
72
+ }
73
+ }
74
+ catch (err) {
75
+ if (err.name === 'AbortError')
76
+ return;
77
+ throw err;
78
+ }
79
+ finally {
80
+ this.connected = false;
81
+ this.stopKeepalive();
82
+ if (!this.stopped) {
83
+ this.scheduleReconnect();
84
+ }
85
+ }
86
+ }
87
+ disconnect() {
88
+ this.stopped = true;
89
+ this.abortController?.abort();
90
+ this.connected = false;
91
+ this.stopKeepalive();
92
+ }
93
+ scheduleReconnect() {
94
+ this.reconnectAttempts++;
95
+ const base = 2000;
96
+ const max = 120_000;
97
+ const delay = Math.min(base * Math.pow(1.4, this.reconnectAttempts), max);
98
+ const jitter = delay * 0.2 * (Math.random() * 2 - 1);
99
+ setTimeout(() => {
100
+ if (!this.stopped)
101
+ this.connect().catch(console.error);
102
+ }, Math.round(delay + jitter));
103
+ }
104
+ parseBuffer(buffer) {
105
+ const events = [];
106
+ const lines = buffer.split('\n');
107
+ let eventType = 'message';
108
+ let dataLines = [];
109
+ let remaining = '';
110
+ for (let i = 0; i < lines.length; i++) {
111
+ const line = lines[i];
112
+ if (i === lines.length - 1 && !buffer.endsWith('\n')) {
113
+ remaining = line;
114
+ break;
115
+ }
116
+ if (line === '') {
117
+ if (dataLines.length > 0) {
118
+ try {
119
+ const data = JSON.parse(dataLines.join('\n'));
120
+ events.push({ type: eventType, data });
121
+ }
122
+ catch { /* skip malformed */ }
123
+ }
124
+ eventType = 'message';
125
+ dataLines = [];
126
+ continue;
127
+ }
128
+ if (line.startsWith(':'))
129
+ continue; // comment / keepalive
130
+ const colon = line.indexOf(':');
131
+ if (colon === -1)
132
+ continue;
133
+ const field = line.slice(0, colon);
134
+ const value = line.slice(colon + 1).trimStart();
135
+ if (field === 'event')
136
+ eventType = value;
137
+ else if (field === 'data')
138
+ dataLines.push(value);
139
+ }
140
+ return { events, remaining };
141
+ }
142
+ dispatch(event) {
143
+ const handlers = this.handlers.get(event.type) || [];
144
+ for (const handler of handlers) {
145
+ try {
146
+ handler(event);
147
+ }
148
+ catch (err) {
149
+ console.error('SSE handler error:', err);
150
+ }
151
+ }
152
+ }
153
+ startKeepalive() {
154
+ this.keepaliveTimer = setTimeout(() => {
155
+ console.warn('Astrid SSE: keepalive timeout, reconnecting...');
156
+ this.abortController?.abort();
157
+ }, 90_000);
158
+ }
159
+ resetKeepalive() {
160
+ this.stopKeepalive();
161
+ this.startKeepalive();
162
+ }
163
+ stopKeepalive() {
164
+ if (this.keepaliveTimer) {
165
+ clearTimeout(this.keepaliveTimer);
166
+ this.keepaliveTimer = null;
167
+ }
168
+ }
169
+ }
170
+ exports.SSEClient = SSEClient;
171
+ //# sourceMappingURL=sse-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-client.js","sourceRoot":"","sources":["../../src/channel/sse-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ /** Astrid channel plugin configuration */
2
+ export interface AstridChannelConfig {
3
+ enabled: boolean;
4
+ clientId: string;
5
+ clientSecret: string;
6
+ apiBase?: string;
7
+ tokenEndpoint?: string;
8
+ sseEndpoint?: string;
9
+ agentEmail?: string;
10
+ lists?: string[];
11
+ pollIntervalMs?: number;
12
+ }
13
+ /** Task as returned by the agent protocol */
14
+ export interface AgentTask {
15
+ id: string;
16
+ title: string;
17
+ description: string;
18
+ priority: number;
19
+ completed: boolean;
20
+ dueDateTime: string | null;
21
+ isAllDay: boolean;
22
+ listId: string | null;
23
+ listName: string | null;
24
+ listDescription: string | null;
25
+ assignerName: string | null;
26
+ assignerId: string | null;
27
+ comments: AgentComment[];
28
+ createdAt: string;
29
+ updatedAt: string;
30
+ }
31
+ /** Comment as returned by the agent protocol */
32
+ export interface AgentComment {
33
+ id: string;
34
+ content: string;
35
+ authorName: string | null;
36
+ authorId: string;
37
+ isAgent: boolean;
38
+ createdAt: string;
39
+ }
40
+ /** SSE event from the agent events endpoint */
41
+ export interface AgentSSEEvent {
42
+ type: string;
43
+ data: {
44
+ taskId: string;
45
+ task?: AgentTask;
46
+ comment?: AgentComment;
47
+ changes?: Record<string, {
48
+ from: unknown;
49
+ to: unknown;
50
+ }>;
51
+ [key: string]: unknown;
52
+ };
53
+ }
54
+ /** Inbound message to OpenClaw */
55
+ export interface InboundMessage {
56
+ content: string;
57
+ sessionKey: string;
58
+ metadata?: Record<string, unknown>;
59
+ }
60
+ /** Outbound message from OpenClaw */
61
+ export interface OutboundMessage {
62
+ content: string;
63
+ sessionKey: string;
64
+ }
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/channel/types.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,6CAA6C;AAC7C,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,OAAO,CAAA;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,QAAQ,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,gDAAgD;AAChD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,+CAA+C;AAC/C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,CAAC,EAAE,SAAS,CAAA;QAChB,OAAO,CAAC,EAAE,YAAY,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,IAAI,EAAE,OAAO,CAAC;YAAC,EAAE,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;QACxD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;CACF;AAED,kCAAkC;AAClC,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;CACnB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channel/types.ts"],"names":[],"mappings":""}
@@ -162,13 +162,13 @@ function buildWorkflowInstructions(taskId, taskTitle, config) {
162
162
  rules.push('- Output the PR URL so it can be extracted');
163
163
  }
164
164
  rules.push('- Make ONLY the requested changes');
165
- return `REQUIRED Workflow:
166
-
167
- ${steps.join('\n')}
168
-
169
- Rules:
170
- ${rules.join('\n')}
171
-
165
+ return `REQUIRED Workflow:
166
+
167
+ ${steps.join('\n')}
168
+
169
+ Rules:
170
+ ${rules.join('\n')}
171
+
172
172
  Start now.`;
173
173
  }
174
174
  /**
package/dist/index.d.ts CHANGED
@@ -6,15 +6,8 @@
6
6
  export type { CodeGenerationRequest, GeneratedCode, ImplementationPlan, ExecutionResult, PlanningResult, AIService, AIAgentConfig, LogLevel, Logger, ProgressCallback, AstridTask, AstridList, PreviousTaskContext, RepositoryContextCache, } from './types/index.js';
7
7
  export { loadAstridConfig, clearConfigCache, detectPlatform, generateStructurePrompt, generatePlatformHints, getInitialGlobPattern, isBlockedCommand, isProtectedPath, CONFIG_DEFAULTS, type AstridConfig, type ResolvedAstridConfig, type ProjectStructure, type PlatformDetection, type AgentConfig, type ValidationConfig, type SafetyConfig, type RetryConfig, } from './config/index.js';
8
8
  export { AI_AGENT_CONFIG, SUGGESTED_MODELS, DEFAULT_MODELS, getAgentConfig, getAgentService, getAgentModel, getAgentContextFile, isRegisteredAgent, getRegisteredAgentEmails, getAllAgentConfigs, } from './utils/agent-config.js';
9
- export { planWithClaude, executeWithClaude, prepareRepository, getGitHubUser, type ClaudeExecutorConfig, } from './executors/claude.js';
10
- export { planWithOpenAI, executeWithOpenAI, type OpenAIExecutorConfig, } from './executors/openai.js';
11
- export { planWithGemini, executeWithGemini, type GeminiExecutorConfig, } from './executors/gemini.js';
12
9
  export { AstridOAuthClient, type AstridOAuthConfig, type APIResponse, type Comment, type CreateTaskData, type UpdateTaskData, } from './adapters/astrid-oauth.js';
13
10
  export { getAgentWorkflowConfig, generateBranchName, generatePreviewSubdomain, generatePreviewUrl, buildWorkflowInstructions, validateWorkflowConfig, logWorkflowConfig, type AgentWorkflowConfig, } from './config/agent-workflow.js';
14
11
  export { deployToVercel, isVercelConfigured, type VercelDeployResult, } from './deploy/vercel.js';
15
- export type { TerminalExecutor, TerminalExecutionResult, TerminalTaskContext, TerminalProgressCallback, ParsedOutput, } from './executors/terminal-base.js';
16
- export { extractPrUrl, formatCommentHistory, captureGitBaseline, captureGitChanges, buildDefaultPrompt, } from './executors/terminal-base.js';
17
- export { TerminalClaudeExecutor, terminalSessionStore, type TerminalClaudeOptions, } from './executors/terminal-claude.js';
18
- export { TerminalOpenAIExecutor, terminalOpenAIExecutor, type TerminalOpenAIOptions, } from './executors/terminal-openai.js';
19
- export { TerminalGeminiExecutor, terminalGeminiExecutor, type TerminalGeminiOptions, } from './executors/terminal-gemini.js';
12
+ export { AstridChannel, SSEClient, OAuthClient as ChannelOAuthClient, RestClient as ChannelRestClient, SessionMapper, taskToMessage, commentToMessage, responseToComment, type AstridChannelConfig, type AgentTask as ChannelAgentTask, type AgentComment as ChannelAgentComment, type AgentSSEEvent, type InboundMessage, type OutboundMessage, } from './channel/index.js';
20
13
  //# sourceMappingURL=index.d.ts.map