@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.
- package/README.md +127 -341
- package/dist/channel/channel.d.ts +33 -0
- package/dist/channel/channel.d.ts.map +1 -0
- package/dist/channel/channel.js +90 -0
- package/dist/channel/channel.js.map +1 -0
- package/dist/channel/index.d.ts +13 -0
- package/dist/channel/index.d.ts.map +1 -0
- package/dist/channel/index.js +23 -0
- package/dist/channel/index.js.map +1 -0
- package/dist/channel/message-formatter.d.ts +14 -0
- package/dist/channel/message-formatter.d.ts.map +1 -0
- package/dist/channel/message-formatter.js +71 -0
- package/dist/channel/message-formatter.js.map +1 -0
- package/dist/channel/oauth-client.d.ts +15 -0
- package/dist/channel/oauth-client.d.ts.map +1 -0
- package/dist/channel/oauth-client.js +45 -0
- package/dist/channel/oauth-client.js.map +1 -0
- package/dist/channel/rest-client.d.ts +16 -0
- package/dist/channel/rest-client.d.ts.map +1 -0
- package/dist/channel/rest-client.js +66 -0
- package/dist/channel/rest-client.js.map +1 -0
- package/dist/channel/session-mapper.d.ts +14 -0
- package/dist/channel/session-mapper.d.ts.map +1 -0
- package/dist/channel/session-mapper.js +37 -0
- package/dist/channel/session-mapper.js.map +1 -0
- package/dist/channel/sse-client.d.ts +31 -0
- package/dist/channel/sse-client.d.ts.map +1 -0
- package/dist/channel/sse-client.js +171 -0
- package/dist/channel/sse-client.js.map +1 -0
- package/dist/channel/types.d.ts +65 -0
- package/dist/channel/types.d.ts.map +1 -0
- package/dist/channel/types.js +3 -0
- package/dist/channel/types.js.map +1 -0
- package/dist/config/agent-workflow.js +7 -7
- package/dist/index.d.ts +1 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -30
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/agent-config.d.ts.map +1 -1
- package/dist/utils/agent-config.js +14 -0
- package/dist/utils/agent-config.js.map +1 -1
- package/package.json +65 -77
- package/templates/.astrid.config.json +60 -60
- package/templates/ASTRID.template.md +74 -74
- package/dist/bin/cli.d.ts +0 -14
- package/dist/bin/cli.d.ts.map +0 -1
- package/dist/bin/cli.js +0 -1610
- package/dist/bin/cli.js.map +0 -1
- package/dist/executors/claude.d.ts +0 -65
- package/dist/executors/claude.d.ts.map +0 -1
- package/dist/executors/claude.js +0 -838
- package/dist/executors/claude.js.map +0 -1
- package/dist/executors/gemini.d.ts +0 -23
- package/dist/executors/gemini.d.ts.map +0 -1
- package/dist/executors/gemini.js +0 -558
- package/dist/executors/gemini.js.map +0 -1
- package/dist/executors/openai.d.ts +0 -17
- package/dist/executors/openai.d.ts.map +0 -1
- package/dist/executors/openai.js +0 -614
- package/dist/executors/openai.js.map +0 -1
- package/dist/executors/shared/index.d.ts +0 -9
- package/dist/executors/shared/index.d.ts.map +0 -1
- package/dist/executors/shared/index.js +0 -21
- package/dist/executors/shared/index.js.map +0 -1
- package/dist/executors/shared/tool-executor.d.ts +0 -52
- package/dist/executors/shared/tool-executor.d.ts.map +0 -1
- package/dist/executors/shared/tool-executor.js +0 -262
- package/dist/executors/shared/tool-executor.js.map +0 -1
- package/dist/executors/shared/tool-schemas.d.ts +0 -61
- package/dist/executors/shared/tool-schemas.d.ts.map +0 -1
- package/dist/executors/shared/tool-schemas.js +0 -135
- package/dist/executors/shared/tool-schemas.js.map +0 -1
- package/dist/executors/terminal-base.d.ts +0 -207
- package/dist/executors/terminal-base.d.ts.map +0 -1
- package/dist/executors/terminal-base.js +0 -552
- package/dist/executors/terminal-base.js.map +0 -1
- package/dist/executors/terminal-claude.d.ts +0 -116
- package/dist/executors/terminal-claude.d.ts.map +0 -1
- package/dist/executors/terminal-claude.js +0 -700
- package/dist/executors/terminal-claude.js.map +0 -1
- package/dist/executors/terminal-executors.test.d.ts +0 -8
- package/dist/executors/terminal-executors.test.d.ts.map +0 -1
- package/dist/executors/terminal-executors.test.js +0 -469
- package/dist/executors/terminal-executors.test.js.map +0 -1
- package/dist/executors/terminal-gemini.d.ts +0 -50
- package/dist/executors/terminal-gemini.d.ts.map +0 -1
- package/dist/executors/terminal-gemini.js +0 -401
- package/dist/executors/terminal-gemini.js.map +0 -1
- package/dist/executors/terminal-openai.d.ts +0 -50
- package/dist/executors/terminal-openai.d.ts.map +0 -1
- package/dist/executors/terminal-openai.js +0 -405
- package/dist/executors/terminal-openai.js.map +0 -1
- package/dist/server/astrid-client.d.ts +0 -77
- package/dist/server/astrid-client.d.ts.map +0 -1
- package/dist/server/astrid-client.js +0 -125
- package/dist/server/astrid-client.js.map +0 -1
- package/dist/server/index.d.ts +0 -38
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -408
- package/dist/server/index.js.map +0 -1
- package/dist/server/repo-manager.d.ts +0 -41
- package/dist/server/repo-manager.d.ts.map +0 -1
- package/dist/server/repo-manager.js +0 -177
- package/dist/server/repo-manager.js.map +0 -1
- package/dist/server/session-manager.d.ts +0 -93
- package/dist/server/session-manager.d.ts.map +0 -1
- package/dist/server/session-manager.js +0 -217
- package/dist/server/session-manager.js.map +0 -1
- package/dist/server/webhook-signature.d.ts +0 -23
- package/dist/server/webhook-signature.d.ts.map +0 -1
- package/dist/server/webhook-signature.js +0 -74
- 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 @@
|
|
|
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
|
|
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
|