patchwork-os 0.2.0-alpha.7 → 0.2.0-alpha.9
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/dist/connectors/gmail.js +8 -0
- package/dist/connectors/gmail.js.map +1 -1
- package/dist/connectors/slack.d.ts +50 -0
- package/dist/connectors/slack.js +254 -0
- package/dist/connectors/slack.js.map +1 -0
- package/dist/server.js +46 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/fetchSlackProfile.d.ts +43 -0
- package/dist/tools/fetchSlackProfile.js +43 -0
- package/dist/tools/fetchSlackProfile.js.map +1 -0
- package/dist/tools/index.js +6 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/slackListChannels.d.ts +65 -0
- package/dist/tools/slackListChannels.js +70 -0
- package/dist/tools/slackListChannels.js.map +1 -0
- package/dist/tools/slackPostMessage.d.ts +57 -0
- package/dist/tools/slackPostMessage.js +72 -0
- package/dist/tools/slackPostMessage.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { listChannels, loadTokens } from "../connectors/slack.js";
|
|
2
|
+
import { optionalInt, successStructured } from "./utils.js";
|
|
3
|
+
export function createSlackListChannelsTool() {
|
|
4
|
+
return {
|
|
5
|
+
schema: {
|
|
6
|
+
name: "slackListChannels",
|
|
7
|
+
description: "List public Slack channels the bot has access to. Returns id, name, member count.",
|
|
8
|
+
annotations: { readOnlyHint: true },
|
|
9
|
+
inputSchema: {
|
|
10
|
+
type: "object",
|
|
11
|
+
properties: {
|
|
12
|
+
limit: {
|
|
13
|
+
type: "integer",
|
|
14
|
+
description: "Max channels to return (1–200). Default: 100.",
|
|
15
|
+
minimum: 1,
|
|
16
|
+
maximum: 200,
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
additionalProperties: false,
|
|
20
|
+
},
|
|
21
|
+
outputSchema: {
|
|
22
|
+
type: "object",
|
|
23
|
+
properties: {
|
|
24
|
+
channels: {
|
|
25
|
+
type: "array",
|
|
26
|
+
items: {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
id: { type: "string" },
|
|
30
|
+
name: { type: "string" },
|
|
31
|
+
isMember: { type: "boolean" },
|
|
32
|
+
isPrivate: { type: "boolean" },
|
|
33
|
+
numMembers: { type: "number" },
|
|
34
|
+
},
|
|
35
|
+
required: ["id", "name", "isMember", "isPrivate"],
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
slackConnected: { type: "boolean" },
|
|
39
|
+
error: { type: "string" },
|
|
40
|
+
},
|
|
41
|
+
required: ["slackConnected"],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
timeoutMs: 15_000,
|
|
45
|
+
async handler(args, signal) {
|
|
46
|
+
const tokens = loadTokens();
|
|
47
|
+
if (!tokens) {
|
|
48
|
+
return successStructured({
|
|
49
|
+
channels: [],
|
|
50
|
+
slackConnected: false,
|
|
51
|
+
error: "Slack not connected. GET /connections/slack/authorize first.",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const limit = optionalInt(args, "limit", 1, 200) ?? 100;
|
|
55
|
+
try {
|
|
56
|
+
const channels = await listChannels(limit, signal);
|
|
57
|
+
return successStructured({ channels, slackConnected: true });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
const notConnected = err instanceof Error && err.message.includes("not connected");
|
|
61
|
+
return successStructured({
|
|
62
|
+
channels: [],
|
|
63
|
+
slackConnected: !notConnected,
|
|
64
|
+
error: err instanceof Error ? err.message : String(err),
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=slackListChannels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slackListChannels.js","sourceRoot":"","sources":["../../src/tools/slackListChannels.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,UAAU,2BAA2B;IACzC,OAAO;QACL,MAAM,EAAE;YACN,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACT,mFAAmF;YACrF,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;YACnC,WAAW,EAAE;gBACX,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,KAAK,EAAE;wBACL,IAAI,EAAE,SAAS;wBACf,WAAW,EAAE,+CAA+C;wBAC5D,OAAO,EAAE,CAAC;wBACV,OAAO,EAAE,GAAG;qBACb;iBACF;gBACD,oBAAoB,EAAE,KAAc;aACrC;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAiB;gBACvB,UAAU,EAAE;oBACV,QAAQ,EAAE;wBACR,IAAI,EAAE,OAAO;wBACb,KAAK,EAAE;4BACL,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACtB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gCACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gCAC7B,SAAS,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;gCAC9B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;6BAC/B;4BACD,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC;yBAClD;qBACF;oBACD,cAAc,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACnC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;gBACD,QAAQ,EAAE,CAAC,gBAAgB,CAAC;aAC7B;SACF;QACD,SAAS,EAAE,MAAM;QACjB,KAAK,CAAC,OAAO,CAAC,IAA6B,EAAE,MAAoB;YAC/D,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO,iBAAiB,CAAC;oBACvB,QAAQ,EAAE,EAAE;oBACZ,cAAc,EAAE,KAAK;oBACrB,KAAK,EAAE,8DAA8D;iBACtE,CAAC,CAAC;YACL,CAAC;YAED,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;YAExD,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBACnD,OAAO,iBAAiB,CAAC,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBACnF,OAAO,iBAAiB,CAAC;oBACvB,QAAQ,EAAE,EAAE;oBACZ,cAAc,EAAE,CAAC,YAAY;oBAC7B,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;iBACxD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
export declare function createSlackPostMessageTool(): {
|
|
2
|
+
schema: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
annotations: {
|
|
6
|
+
readOnlyHint: boolean;
|
|
7
|
+
};
|
|
8
|
+
inputSchema: {
|
|
9
|
+
type: "object";
|
|
10
|
+
required: string[];
|
|
11
|
+
properties: {
|
|
12
|
+
channel: {
|
|
13
|
+
type: string;
|
|
14
|
+
description: string;
|
|
15
|
+
maxLength: number;
|
|
16
|
+
};
|
|
17
|
+
text: {
|
|
18
|
+
type: string;
|
|
19
|
+
description: string;
|
|
20
|
+
maxLength: number;
|
|
21
|
+
};
|
|
22
|
+
threadTs: {
|
|
23
|
+
type: string;
|
|
24
|
+
description: string;
|
|
25
|
+
maxLength: number;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
additionalProperties: false;
|
|
29
|
+
};
|
|
30
|
+
outputSchema: {
|
|
31
|
+
type: "object";
|
|
32
|
+
properties: {
|
|
33
|
+
ts: {
|
|
34
|
+
type: string;
|
|
35
|
+
};
|
|
36
|
+
channel: {
|
|
37
|
+
type: string;
|
|
38
|
+
};
|
|
39
|
+
slackConnected: {
|
|
40
|
+
type: string;
|
|
41
|
+
};
|
|
42
|
+
error: {
|
|
43
|
+
type: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
required: string[];
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
timeoutMs: number;
|
|
50
|
+
handler(args: Record<string, unknown>, signal?: AbortSignal): Promise<{
|
|
51
|
+
content: Array<{
|
|
52
|
+
type: string;
|
|
53
|
+
text: string;
|
|
54
|
+
}>;
|
|
55
|
+
structuredContent: unknown;
|
|
56
|
+
}>;
|
|
57
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { postMessage } from "../connectors/slack.js";
|
|
2
|
+
import { loadTokens } from "../connectors/slack.js";
|
|
3
|
+
import { optionalString, requireString, successStructured } from "./utils.js";
|
|
4
|
+
export function createSlackPostMessageTool() {
|
|
5
|
+
return {
|
|
6
|
+
schema: {
|
|
7
|
+
name: "slackPostMessage",
|
|
8
|
+
description: "Post a message to a Slack channel. Use channel name (e.g. 'general') or channel ID. " +
|
|
9
|
+
"Optionally reply in a thread by providing threadTs.",
|
|
10
|
+
annotations: { readOnlyHint: false },
|
|
11
|
+
inputSchema: {
|
|
12
|
+
type: "object",
|
|
13
|
+
required: ["channel", "text"],
|
|
14
|
+
properties: {
|
|
15
|
+
channel: {
|
|
16
|
+
type: "string",
|
|
17
|
+
description: "Channel name (e.g. 'general') or channel ID (e.g. 'C12345').",
|
|
18
|
+
maxLength: 200,
|
|
19
|
+
},
|
|
20
|
+
text: {
|
|
21
|
+
type: "string",
|
|
22
|
+
description: "Message text (Markdown supported via mrkdwn).",
|
|
23
|
+
maxLength: 40000,
|
|
24
|
+
},
|
|
25
|
+
threadTs: {
|
|
26
|
+
type: "string",
|
|
27
|
+
description: "Thread timestamp to reply in. Omit to post as a new message.",
|
|
28
|
+
maxLength: 50,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
additionalProperties: false,
|
|
32
|
+
},
|
|
33
|
+
outputSchema: {
|
|
34
|
+
type: "object",
|
|
35
|
+
properties: {
|
|
36
|
+
ts: { type: "string" },
|
|
37
|
+
channel: { type: "string" },
|
|
38
|
+
slackConnected: { type: "boolean" },
|
|
39
|
+
error: { type: "string" },
|
|
40
|
+
},
|
|
41
|
+
required: ["slackConnected"],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
timeoutMs: 15_000,
|
|
45
|
+
async handler(args, signal) {
|
|
46
|
+
const tokens = loadTokens();
|
|
47
|
+
if (!tokens) {
|
|
48
|
+
return successStructured({
|
|
49
|
+
ts: "", channel: "",
|
|
50
|
+
slackConnected: false,
|
|
51
|
+
error: "Slack not connected. GET /connections/slack/authorize first.",
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const channel = requireString(args, "channel", 200);
|
|
55
|
+
const text = requireString(args, "text", 40000);
|
|
56
|
+
const threadTs = optionalString(args, "threadTs", 50);
|
|
57
|
+
try {
|
|
58
|
+
const result = await postMessage(channel, text, threadTs ?? undefined, signal);
|
|
59
|
+
return successStructured({ ts: result.ts, channel: result.channel, slackConnected: true });
|
|
60
|
+
}
|
|
61
|
+
catch (err) {
|
|
62
|
+
const notConnected = err instanceof Error && err.message.includes("not connected");
|
|
63
|
+
return successStructured({
|
|
64
|
+
ts: "", channel: "",
|
|
65
|
+
slackConnected: !notConnected,
|
|
66
|
+
error: err instanceof Error ? err.message : String(err),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=slackPostMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slackPostMessage.js","sourceRoot":"","sources":["../../src/tools/slackPostMessage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "patchwork-os",
|
|
3
|
-
"version": "0.2.0-alpha.
|
|
3
|
+
"version": "0.2.0-alpha.9",
|
|
4
4
|
"description": "Patchwork OS — proactive, multi-model AI teammate built on the Claude IDE Bridge. One agent, any model, works while you're away.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|