@mukulaggarwal/pacman 0.1.0 → 0.1.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 (35) hide show
  1. package/dist/{chunk-43PUZDIZ.js → chunk-DNI6TIXZ.js} +7 -7
  2. package/dist/{chunk-AYFIQNZ5.js → chunk-VCDPIN57.js} +2 -2
  3. package/dist/chunk-YJ32S56Q.js +291 -0
  4. package/dist/chunk-YJ32S56Q.js.map +1 -0
  5. package/dist/daemon.js +1 -2
  6. package/dist/daemon.js.map +1 -1
  7. package/dist/{dist-TWNHTXYH.js → dist-3BOY3CPO.js} +1 -3
  8. package/dist/{dist-TWNHTXYH.js.map → dist-3BOY3CPO.js.map} +1 -1
  9. package/dist/{dist-RMYCRZIU.js → dist-EOAIYOVP.js} +1 -3
  10. package/dist/{dist-RMYCRZIU.js.map → dist-EOAIYOVP.js.map} +1 -1
  11. package/dist/{dist-NV2YVVHI.js → dist-HJU53U7M.js} +1 -3
  12. package/dist/{dist-NV2YVVHI.js.map → dist-HJU53U7M.js.map} +1 -1
  13. package/dist/{dist-THLCZNOZ.js → dist-RFHCRKM3.js} +2 -3
  14. package/dist/{dist-3PIJOFZ4.js → dist-WFQSK6BF.js} +1 -3
  15. package/dist/{dist-3PIJOFZ4.js.map → dist-WFQSK6BF.js.map} +1 -1
  16. package/dist/{dist-L76NGFFH.js → dist-ZK23POW6.js} +1 -3
  17. package/dist/{dist-L76NGFFH.js.map → dist-ZK23POW6.js.map} +1 -1
  18. package/dist/index.js +2 -3
  19. package/dist/index.js.map +1 -1
  20. package/dist/mcp-compat.js +2 -3
  21. package/dist/mcp-compat.js.map +1 -1
  22. package/dist/onboarding-server.js +2 -3
  23. package/dist/onboarding-server.js.map +1 -1
  24. package/dist/provider-runtime.js +0 -1
  25. package/dist/slack-listener.js +1 -2
  26. package/dist/slack-listener.js.map +1 -1
  27. package/dist/storage.js +0 -1
  28. package/package.json +2 -1
  29. package/dist/chunk-7D4SUZUM.js +0 -38
  30. package/dist/chunk-ZKKMIDRK.js +0 -3923
  31. package/dist/chunk-ZKKMIDRK.js.map +0 -1
  32. package/dist/dist-THLCZNOZ.js.map +0 -1
  33. /package/dist/{chunk-43PUZDIZ.js.map → chunk-DNI6TIXZ.js.map} +0 -0
  34. /package/dist/{chunk-AYFIQNZ5.js.map → chunk-VCDPIN57.js.map} +0 -0
  35. /package/dist/{chunk-7D4SUZUM.js.map → dist-RFHCRKM3.js.map} +0 -0
@@ -61,27 +61,27 @@ async function loadConnector(configOrType) {
61
61
  const type = typeof configOrType === "string" ? configOrType : configOrType.type;
62
62
  switch (type) {
63
63
  case "slack": {
64
- const { createSlackConnector } = await import("./dist-THLCZNOZ.js");
64
+ const { createSlackConnector } = await import("./dist-RFHCRKM3.js");
65
65
  return createSlackConnector();
66
66
  }
67
67
  case "gmail": {
68
- const { createGmailConnector } = await import("./dist-TWNHTXYH.js");
68
+ const { createGmailConnector } = await import("./dist-3BOY3CPO.js");
69
69
  return createGmailConnector();
70
70
  }
71
71
  case "github": {
72
- const { createGitHubConnector } = await import("./dist-NV2YVVHI.js");
72
+ const { createGitHubConnector } = await import("./dist-HJU53U7M.js");
73
73
  return createGitHubConnector();
74
74
  }
75
75
  case "gitlab": {
76
- const { createGitLabConnector } = await import("./dist-L76NGFFH.js");
76
+ const { createGitLabConnector } = await import("./dist-ZK23POW6.js");
77
77
  return createGitLabConnector();
78
78
  }
79
79
  case "gdrive": {
80
- const { createGDriveDocsConnector } = await import("./dist-3PIJOFZ4.js");
80
+ const { createGDriveDocsConnector } = await import("./dist-WFQSK6BF.js");
81
81
  return createGDriveDocsConnector();
82
82
  }
83
83
  case "gchat": {
84
- const { createGChatConnector } = await import("./dist-RMYCRZIU.js");
84
+ const { createGChatConnector } = await import("./dist-EOAIYOVP.js");
85
85
  return createGChatConnector();
86
86
  }
87
87
  }
@@ -145,4 +145,4 @@ export {
145
145
  loadConnector,
146
146
  validateIntegrationConfig
147
147
  };
148
- //# sourceMappingURL=chunk-43PUZDIZ.js.map
148
+ //# sourceMappingURL=chunk-DNI6TIXZ.js.map
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createNoopEventClient,
6
6
  validateIntegrationConfig
7
- } from "./chunk-43PUZDIZ.js";
7
+ } from "./chunk-DNI6TIXZ.js";
8
8
  import {
9
9
  createContextManager
10
10
  } from "./chunk-UWT6AFJB.js";
@@ -804,4 +804,4 @@ export {
804
804
  installCodexMcp,
805
805
  startMcpServer
806
806
  };
807
- //# sourceMappingURL=chunk-AYFIQNZ5.js.map
807
+ //# sourceMappingURL=chunk-VCDPIN57.js.map
@@ -0,0 +1,291 @@
1
+ // ../integrations-slack/dist/index.js
2
+ import WebSocket from "ws";
3
+ var SLACK_API_BASE = "https://slack.com/api";
4
+ var SlackConnector = class {
5
+ type = "slack";
6
+ token;
7
+ channels;
8
+ async authenticate(config) {
9
+ this.token = config.credentials?.botToken;
10
+ this.channels = config.channels;
11
+ if (!this.token) {
12
+ throw new Error("Slack bot token is required");
13
+ }
14
+ }
15
+ async healthCheck() {
16
+ if (!this.token) throw new Error("Slack bot token is required");
17
+ const data = await slackApiRequest(
18
+ this.token,
19
+ "auth.test"
20
+ );
21
+ return {
22
+ summary: `Connected as ${data.user ?? "unknown"} in ${data.team ?? "unknown workspace"}`
23
+ };
24
+ }
25
+ async fetchDelta(cursor) {
26
+ if (!this.token) throw new Error("Not authenticated");
27
+ const channelIds = this.channels?.length ? this.channels : (await this.listChannels()).map((channel) => channel.id);
28
+ const oldest = cursor ? Math.floor(new Date(cursor).getTime() / 1e3).toString() : void 0;
29
+ const items = [];
30
+ for (const channelId of channelIds) {
31
+ const data = await slackApiRequest(
32
+ this.token,
33
+ "conversations.history",
34
+ {
35
+ channel: channelId,
36
+ limit: "50",
37
+ ...oldest ? { oldest } : {}
38
+ }
39
+ );
40
+ for (const msg of data.messages ?? []) {
41
+ items.push({
42
+ id: `${channelId}:${msg.ts}`,
43
+ source: "slack",
44
+ type: "message",
45
+ content: msg.text ?? "",
46
+ metadata: {
47
+ user: msg.user,
48
+ botId: msg.bot_id,
49
+ channel: channelId,
50
+ subtype: msg.subtype,
51
+ threadTs: msg.thread_ts
52
+ },
53
+ timestamp: new Date(parseFloat(msg.ts) * 1e3).toISOString()
54
+ });
55
+ }
56
+ }
57
+ return {
58
+ items,
59
+ newCursor: (/* @__PURE__ */ new Date()).toISOString(),
60
+ hasMore: false
61
+ };
62
+ }
63
+ async normalize(rawItems) {
64
+ return rawItems.map((item) => ({
65
+ id: item.id,
66
+ source: "slack",
67
+ title: `Slack message from ${item.metadata.user ?? "unknown"}`,
68
+ body: item.content,
69
+ entities: extractMentions(item.content),
70
+ timestamp: item.timestamp
71
+ }));
72
+ }
73
+ async listChannels() {
74
+ if (!this.token) throw new Error("Slack bot token is required");
75
+ const channels = [];
76
+ let cursor;
77
+ do {
78
+ const data = await slackApiRequest(
79
+ this.token,
80
+ "conversations.list",
81
+ {
82
+ limit: "200",
83
+ types: "public_channel,private_channel",
84
+ exclude_archived: "true",
85
+ ...cursor ? { cursor } : {}
86
+ }
87
+ );
88
+ for (const channel of data.channels ?? []) {
89
+ if (!channel.id || !channel.name) continue;
90
+ channels.push({
91
+ id: channel.id,
92
+ name: channel.name,
93
+ isPrivate: !!channel.is_private
94
+ });
95
+ }
96
+ cursor = data.response_metadata?.next_cursor || void 0;
97
+ } while (cursor);
98
+ return channels.sort((a, b) => a.name.localeCompare(b.name));
99
+ }
100
+ async listUsers() {
101
+ if (!this.token) throw new Error("Slack bot token is required");
102
+ const users = [];
103
+ let cursor;
104
+ do {
105
+ const data = await slackApiRequest(
106
+ this.token,
107
+ "users.list",
108
+ {
109
+ limit: "200",
110
+ ...cursor ? { cursor } : {}
111
+ }
112
+ );
113
+ for (const member of data.members ?? []) {
114
+ if (!member.id || member.deleted || member.is_bot) continue;
115
+ users.push({
116
+ id: member.id,
117
+ name: member.name ?? member.real_name ?? member.id,
118
+ realName: member.real_name
119
+ });
120
+ }
121
+ cursor = data.response_metadata?.next_cursor || void 0;
122
+ } while (cursor);
123
+ return users.sort((a, b) => a.name.localeCompare(b.name));
124
+ }
125
+ async fetchThread(channelId, threadTs, channelName) {
126
+ if (!this.token) throw new Error("Slack bot token is required");
127
+ const data = await slackApiRequest(
128
+ this.token,
129
+ "conversations.replies",
130
+ {
131
+ channel: channelId,
132
+ ts: threadTs,
133
+ limit: "200"
134
+ }
135
+ );
136
+ const permalink = await this.getPermalink(channelId, threadTs).catch(() => void 0);
137
+ const messages = (data.messages ?? []).map(toSlackThreadMessage);
138
+ return {
139
+ channelId,
140
+ channelName,
141
+ threadTs,
142
+ permalink,
143
+ messages
144
+ };
145
+ }
146
+ async getPermalink(channelId, messageTs) {
147
+ if (!this.token) throw new Error("Slack bot token is required");
148
+ const data = await slackApiRequest(
149
+ this.token,
150
+ "chat.getPermalink",
151
+ { channel: channelId, message_ts: messageTs }
152
+ );
153
+ return data.permalink;
154
+ }
155
+ async postThreadReply(channelId, threadTs, text) {
156
+ if (!this.token) throw new Error("Slack bot token is required");
157
+ const data = await slackApiRequest(
158
+ this.token,
159
+ "chat.postMessage",
160
+ void 0,
161
+ {
162
+ channel: channelId,
163
+ thread_ts: threadTs,
164
+ text
165
+ }
166
+ );
167
+ return data.ts ?? threadTs;
168
+ }
169
+ async postEphemeral(channelId, userId, text, threadTs) {
170
+ if (!this.token) throw new Error("Slack bot token is required");
171
+ await slackApiRequest(
172
+ this.token,
173
+ "chat.postEphemeral",
174
+ void 0,
175
+ {
176
+ channel: channelId,
177
+ user: userId,
178
+ thread_ts: threadTs,
179
+ text
180
+ }
181
+ );
182
+ }
183
+ };
184
+ async function validateSlackAppToken(appToken) {
185
+ await slackApiRequest(
186
+ appToken,
187
+ "apps.connections.open",
188
+ void 0,
189
+ {},
190
+ "POST"
191
+ );
192
+ }
193
+ async function openSocketModeConnection(appToken, handlers, createSocket = (url) => new WebSocket(url)) {
194
+ const data = await slackApiRequest(
195
+ appToken,
196
+ "apps.connections.open",
197
+ void 0,
198
+ {},
199
+ "POST"
200
+ );
201
+ if (!data.url) {
202
+ throw new Error("Slack did not return a Socket Mode URL");
203
+ }
204
+ const socket = createSocket(data.url);
205
+ await new Promise((resolve, reject) => {
206
+ let settled = false;
207
+ socket.on("open", () => {
208
+ settled = true;
209
+ resolve();
210
+ });
211
+ socket.on("error", (err) => {
212
+ if (!settled) {
213
+ reject(err);
214
+ return;
215
+ }
216
+ handlers.onError?.(err);
217
+ });
218
+ });
219
+ socket.on("message", (rawData) => {
220
+ try {
221
+ const envelope = JSON.parse(rawData.toString());
222
+ if (envelope.envelope_id) {
223
+ socket.send(JSON.stringify({ envelope_id: envelope.envelope_id }));
224
+ }
225
+ handlers.onEnvelope?.(envelope);
226
+ const event = envelope.payload?.event;
227
+ if (event) {
228
+ handlers.onEvent?.(event);
229
+ }
230
+ } catch (err) {
231
+ handlers.onError?.(err instanceof Error ? err : new Error(String(err)));
232
+ }
233
+ });
234
+ const closed = new Promise((resolve) => {
235
+ socket.on("close", () => {
236
+ resolve();
237
+ });
238
+ });
239
+ return {
240
+ close: () => socket.close(),
241
+ closed
242
+ };
243
+ }
244
+ function toSlackThreadMessage(message) {
245
+ return {
246
+ ts: message.ts,
247
+ text: message.text ?? "",
248
+ userId: message.user,
249
+ botId: message.bot_id,
250
+ subtype: message.subtype,
251
+ threadTs: message.thread_ts
252
+ };
253
+ }
254
+ function extractMentions(text) {
255
+ const mentions = text.match(/<@[\w]+>/g) ?? [];
256
+ return mentions.map((m) => m.replace(/<@|>/g, ""));
257
+ }
258
+ async function slackApiRequest(token, method, params, body, httpMethod = body ? "POST" : "GET") {
259
+ const url = new URL(`${SLACK_API_BASE}/${method}`);
260
+ if (params) {
261
+ for (const [key, value] of Object.entries(params)) {
262
+ if (value !== void 0 && value !== "") {
263
+ url.searchParams.set(key, value);
264
+ }
265
+ }
266
+ }
267
+ const response = await fetch(url, {
268
+ method: httpMethod,
269
+ headers: {
270
+ Authorization: `Bearer ${token}`,
271
+ ...body ? { "Content-Type": "application/json; charset=utf-8" } : {}
272
+ },
273
+ ...body ? { body: JSON.stringify(body) } : {}
274
+ });
275
+ const data = await response.json();
276
+ if (!response.ok || !data.ok) {
277
+ throw new Error(`Slack API ${method} failed: ${data.error ?? response.statusText}`);
278
+ }
279
+ return data;
280
+ }
281
+ function createSlackConnector() {
282
+ return new SlackConnector();
283
+ }
284
+
285
+ export {
286
+ SlackConnector,
287
+ validateSlackAppToken,
288
+ openSocketModeConnection,
289
+ createSlackConnector
290
+ };
291
+ //# sourceMappingURL=chunk-YJ32S56Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../integrations-slack/dist/index.js"],"sourcesContent":["// src/index.ts\nimport WebSocket from \"ws\";\nvar SLACK_API_BASE = \"https://slack.com/api\";\nvar SlackConnector = class {\n type = \"slack\";\n token;\n channels;\n async authenticate(config) {\n this.token = config.credentials?.botToken;\n this.channels = config.channels;\n if (!this.token) {\n throw new Error(\"Slack bot token is required\");\n }\n }\n async healthCheck() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"auth.test\"\n );\n return {\n summary: `Connected as ${data.user ?? \"unknown\"} in ${data.team ?? \"unknown workspace\"}`\n };\n }\n async fetchDelta(cursor) {\n if (!this.token) throw new Error(\"Not authenticated\");\n const channelIds = this.channels?.length ? this.channels : (await this.listChannels()).map((channel) => channel.id);\n const oldest = cursor ? Math.floor(new Date(cursor).getTime() / 1e3).toString() : void 0;\n const items = [];\n for (const channelId of channelIds) {\n const data = await slackApiRequest(\n this.token,\n \"conversations.history\",\n {\n channel: channelId,\n limit: \"50\",\n ...oldest ? { oldest } : {}\n }\n );\n for (const msg of data.messages ?? []) {\n items.push({\n id: `${channelId}:${msg.ts}`,\n source: \"slack\",\n type: \"message\",\n content: msg.text ?? \"\",\n metadata: {\n user: msg.user,\n botId: msg.bot_id,\n channel: channelId,\n subtype: msg.subtype,\n threadTs: msg.thread_ts\n },\n timestamp: new Date(parseFloat(msg.ts) * 1e3).toISOString()\n });\n }\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"slack\",\n title: `Slack message from ${item.metadata.user ?? \"unknown\"}`,\n body: item.content,\n entities: extractMentions(item.content),\n timestamp: item.timestamp\n }));\n }\n async listChannels() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const channels = [];\n let cursor;\n do {\n const data = await slackApiRequest(\n this.token,\n \"conversations.list\",\n {\n limit: \"200\",\n types: \"public_channel,private_channel\",\n exclude_archived: \"true\",\n ...cursor ? { cursor } : {}\n }\n );\n for (const channel of data.channels ?? []) {\n if (!channel.id || !channel.name) continue;\n channels.push({\n id: channel.id,\n name: channel.name,\n isPrivate: !!channel.is_private\n });\n }\n cursor = data.response_metadata?.next_cursor || void 0;\n } while (cursor);\n return channels.sort((a, b) => a.name.localeCompare(b.name));\n }\n async listUsers() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const users = [];\n let cursor;\n do {\n const data = await slackApiRequest(\n this.token,\n \"users.list\",\n {\n limit: \"200\",\n ...cursor ? { cursor } : {}\n }\n );\n for (const member of data.members ?? []) {\n if (!member.id || member.deleted || member.is_bot) continue;\n users.push({\n id: member.id,\n name: member.name ?? member.real_name ?? member.id,\n realName: member.real_name\n });\n }\n cursor = data.response_metadata?.next_cursor || void 0;\n } while (cursor);\n return users.sort((a, b) => a.name.localeCompare(b.name));\n }\n async fetchThread(channelId, threadTs, channelName) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"conversations.replies\",\n {\n channel: channelId,\n ts: threadTs,\n limit: \"200\"\n }\n );\n const permalink = await this.getPermalink(channelId, threadTs).catch(() => void 0);\n const messages = (data.messages ?? []).map(toSlackThreadMessage);\n return {\n channelId,\n channelName,\n threadTs,\n permalink,\n messages\n };\n }\n async getPermalink(channelId, messageTs) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"chat.getPermalink\",\n { channel: channelId, message_ts: messageTs }\n );\n return data.permalink;\n }\n async postThreadReply(channelId, threadTs, text) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"chat.postMessage\",\n void 0,\n {\n channel: channelId,\n thread_ts: threadTs,\n text\n }\n );\n return data.ts ?? threadTs;\n }\n async postEphemeral(channelId, userId, text, threadTs) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n await slackApiRequest(\n this.token,\n \"chat.postEphemeral\",\n void 0,\n {\n channel: channelId,\n user: userId,\n thread_ts: threadTs,\n text\n }\n );\n }\n};\nasync function validateSlackAppToken(appToken) {\n await slackApiRequest(\n appToken,\n \"apps.connections.open\",\n void 0,\n {},\n \"POST\"\n );\n}\nasync function openSocketModeConnection(appToken, handlers, createSocket = (url) => new WebSocket(url)) {\n const data = await slackApiRequest(\n appToken,\n \"apps.connections.open\",\n void 0,\n {},\n \"POST\"\n );\n if (!data.url) {\n throw new Error(\"Slack did not return a Socket Mode URL\");\n }\n const socket = createSocket(data.url);\n await new Promise((resolve, reject) => {\n let settled = false;\n socket.on(\"open\", () => {\n settled = true;\n resolve();\n });\n socket.on(\"error\", (err) => {\n if (!settled) {\n reject(err);\n return;\n }\n handlers.onError?.(err);\n });\n });\n socket.on(\"message\", (rawData) => {\n try {\n const envelope = JSON.parse(rawData.toString());\n if (envelope.envelope_id) {\n socket.send(JSON.stringify({ envelope_id: envelope.envelope_id }));\n }\n handlers.onEnvelope?.(envelope);\n const event = envelope.payload?.event;\n if (event) {\n handlers.onEvent?.(event);\n }\n } catch (err) {\n handlers.onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n });\n const closed = new Promise((resolve) => {\n socket.on(\"close\", () => {\n resolve();\n });\n });\n return {\n close: () => socket.close(),\n closed\n };\n}\nfunction toSlackThreadMessage(message) {\n return {\n ts: message.ts,\n text: message.text ?? \"\",\n userId: message.user,\n botId: message.bot_id,\n subtype: message.subtype,\n threadTs: message.thread_ts\n };\n}\nfunction extractMentions(text) {\n const mentions = text.match(/<@[\\w]+>/g) ?? [];\n return mentions.map((m) => m.replace(/<@|>/g, \"\"));\n}\nasync function slackApiRequest(token, method, params, body, httpMethod = body ? \"POST\" : \"GET\") {\n const url = new URL(`${SLACK_API_BASE}/${method}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== void 0 && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n const response = await fetch(url, {\n method: httpMethod,\n headers: {\n Authorization: `Bearer ${token}`,\n ...body ? { \"Content-Type\": \"application/json; charset=utf-8\" } : {}\n },\n ...body ? { body: JSON.stringify(body) } : {}\n });\n const data = await response.json();\n if (!response.ok || !data.ok) {\n throw new Error(`Slack API ${method} failed: ${data.error ?? response.statusText}`);\n }\n return data;\n}\nfunction createSlackConnector() {\n return new SlackConnector();\n}\nexport {\n SlackConnector,\n createSlackConnector,\n openSocketModeConnection,\n validateSlackAppToken\n};\n"],"mappings":"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","names":[]}
package/dist/daemon.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  createNoopEventClient,
6
6
  loadConnector
7
- } from "./chunk-43PUZDIZ.js";
7
+ } from "./chunk-DNI6TIXZ.js";
8
8
  import {
9
9
  createContextManager
10
10
  } from "./chunk-UWT6AFJB.js";
@@ -13,7 +13,6 @@ import {
13
13
  createGDriveStorage,
14
14
  createLocalStorage
15
15
  } from "./chunk-TRQIZP6Z.js";
16
- import "./chunk-7D4SUZUM.js";
17
16
 
18
17
  // src/daemon.ts
19
18
  import * as path from "path";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/daemon.ts"],"sourcesContent":["import * as path from 'node:path';\nimport { createLocalStorage } from '@personal-assistant/storage-local';\nimport { createGDriveStorage } from '@personal-assistant/storage-gdrive';\nimport { createConfigManager } from '@personal-assistant/config-manager';\nimport { createContextManager } from '@personal-assistant/context-manager';\nimport { createIndexer } from '@personal-assistant/indexer';\nimport { createNoopEventClient } from '@personal-assistant/event-client';\nimport { loadConnector } from '@personal-assistant/integration-runtime';\nimport type { StorageBackend, GDriveStorageConfig } from '@personal-assistant/core-types';\n\nexport async function startDaemon(workspacePath: string): Promise<void> {\n // Bootstrap: read config from local storage to determine which backend to use\n const localStore = createLocalStorage(workspacePath);\n const bootConfigManager = createConfigManager(localStore);\n const eventClient = createNoopEventClient();\n\n let config;\n try {\n config = await bootConfigManager.loadConfig();\n } catch {\n console.error('Error: No configuration found. Run `pacman init` first.');\n process.exit(1);\n }\n\n // Resolve storage backend — all operations use the user's chosen backend\n let resolvedStorage: StorageBackend = localStore;\n if (config.storage.mode === 'gdrive') {\n try {\n const gdriveConfig = config.storage as GDriveStorageConfig;\n const resolvedCachePath = path.isAbsolute(gdriveConfig.cachePath)\n ? gdriveConfig.cachePath\n : path.resolve(path.dirname(workspacePath), gdriveConfig.cachePath);\n\n const gdriveStorage = createGDriveStorage({\n ...gdriveConfig,\n cachePath: resolvedCachePath,\n });\n await gdriveStorage.initialize();\n resolvedStorage = gdriveStorage;\n console.log('Using Google Drive storage backend');\n } catch (err) {\n console.error('Warning: GDrive init failed, falling back to local storage:', err);\n }\n }\n\n const configManager = createConfigManager(resolvedStorage);\n\n console.log(`Daemon started for ${config.user.name} (${config.user.profileType})`);\n console.log(`Sync schedule: ${config.sync.dailySyncTime} ${config.sync.timezone}`);\n console.log(`Enabled integrations: ${config.integrations.filter((i) => i.enabled).map((i) => i.type).join(', ') || 'none'}`);\n\n const contextManager = createContextManager(resolvedStorage);\n const indexer = createIndexer(resolvedStorage);\n\n // Schedule sync using node-cron style interval\n const syncInterval = parseSyncInterval(config.sync.dailySyncTime);\n\n const runSync = async () => {\n console.log(`[${new Date().toISOString()}] Starting sync...`);\n await eventClient.emit('integration_sync_started');\n\n for (const integration of config!.integrations.filter((i) => i.enabled)) {\n try {\n console.log(` Syncing ${integration.type}...`);\n const connector = await loadConnector(integration);\n await connector.authenticate(integration);\n\n const delta = await connector.fetchDelta(integration.cursor ?? undefined);\n if (delta.items.length > 0) {\n const normalized = await connector.normalize(delta.items);\n\n // Write raw items\n for (const item of normalized) {\n const filePath = `context/raw/${integration.type}/${item.id}.md`;\n const content = `# ${item.title}\\n\\n${item.body}\\n\\n---\\nSource: ${item.source}\\nTimestamp: ${item.timestamp}\\n`;\n await resolvedStorage.write(filePath, content);\n }\n\n // Update cursor\n integration.cursor = delta.newCursor;\n integration.lastSyncAt = new Date().toISOString();\n console.log(` ${integration.type}: ${delta.items.length} items synced`);\n } else {\n console.log(` ${integration.type}: no new items`);\n }\n } catch (err) {\n console.error(` Error syncing ${integration.type}:`, err);\n await eventClient.emit('error_occurred', {\n integration: integration.type,\n error: String(err),\n });\n }\n }\n\n // Save updated cursors\n await configManager.saveConfig(config!);\n\n // Generate daily summary\n const today = new Date().toISOString().slice(0, 10);\n const summaryContent = await generateDailySummary(resolvedStorage, today);\n await resolvedStorage.write(`context/derived/daily/${today}.md`, summaryContent);\n\n // Rebuild indexes\n await indexer.buildIndexes();\n\n await eventClient.emit('integration_sync_completed');\n console.log(`[${new Date().toISOString()}] Sync complete.`);\n };\n\n // Run immediately\n await runSync();\n\n // Then run on interval\n console.log(`\\nNext sync in ${syncInterval}ms (${Math.round(syncInterval / 60000)} minutes)`);\n const interval = setInterval(runSync, syncInterval);\n\n process.on('SIGINT', () => {\n console.log('\\nStopping daemon...');\n clearInterval(interval);\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nfunction parseSyncInterval(syncTime: string): number {\n // For the daemon, we run every 24 hours by default\n // In a real implementation, this would use node-cron with the actual time\n return 24 * 60 * 60 * 1000; // 24 hours\n}\n\nasync function generateDailySummary(\n storage: import('@personal-assistant/core-types').StorageBackend,\n date: string,\n): Promise<string> {\n let summary = `# Daily Summary - ${date}\\n\\n`;\n summary += `Generated at: ${new Date().toISOString()}\\n\\n`;\n\n // Aggregate raw items from today\n const integrationTypes = ['slack', 'gmail', 'github', 'gitlab', 'gdrive', 'gchat'];\n for (const intType of integrationTypes) {\n try {\n const files = await storage.list(`context/raw/${intType}`);\n if (files.length > 0) {\n summary += `## ${intType.charAt(0).toUpperCase() + intType.slice(1)}\\n\\n`;\n summary += `- ${files.length} items\\n\\n`;\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n return summary;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/daemon.ts"],"sourcesContent":["import * as path from 'node:path';\nimport { createLocalStorage } from '@personal-assistant/storage-local';\nimport { createGDriveStorage } from '@personal-assistant/storage-gdrive';\nimport { createConfigManager } from '@personal-assistant/config-manager';\nimport { createContextManager } from '@personal-assistant/context-manager';\nimport { createIndexer } from '@personal-assistant/indexer';\nimport { createNoopEventClient } from '@personal-assistant/event-client';\nimport { loadConnector } from '@personal-assistant/integration-runtime';\nimport type { StorageBackend, GDriveStorageConfig } from '@personal-assistant/core-types';\n\nexport async function startDaemon(workspacePath: string): Promise<void> {\n // Bootstrap: read config from local storage to determine which backend to use\n const localStore = createLocalStorage(workspacePath);\n const bootConfigManager = createConfigManager(localStore);\n const eventClient = createNoopEventClient();\n\n let config;\n try {\n config = await bootConfigManager.loadConfig();\n } catch {\n console.error('Error: No configuration found. Run `pacman init` first.');\n process.exit(1);\n }\n\n // Resolve storage backend — all operations use the user's chosen backend\n let resolvedStorage: StorageBackend = localStore;\n if (config.storage.mode === 'gdrive') {\n try {\n const gdriveConfig = config.storage as GDriveStorageConfig;\n const resolvedCachePath = path.isAbsolute(gdriveConfig.cachePath)\n ? gdriveConfig.cachePath\n : path.resolve(path.dirname(workspacePath), gdriveConfig.cachePath);\n\n const gdriveStorage = createGDriveStorage({\n ...gdriveConfig,\n cachePath: resolvedCachePath,\n });\n await gdriveStorage.initialize();\n resolvedStorage = gdriveStorage;\n console.log('Using Google Drive storage backend');\n } catch (err) {\n console.error('Warning: GDrive init failed, falling back to local storage:', err);\n }\n }\n\n const configManager = createConfigManager(resolvedStorage);\n\n console.log(`Daemon started for ${config.user.name} (${config.user.profileType})`);\n console.log(`Sync schedule: ${config.sync.dailySyncTime} ${config.sync.timezone}`);\n console.log(`Enabled integrations: ${config.integrations.filter((i) => i.enabled).map((i) => i.type).join(', ') || 'none'}`);\n\n const contextManager = createContextManager(resolvedStorage);\n const indexer = createIndexer(resolvedStorage);\n\n // Schedule sync using node-cron style interval\n const syncInterval = parseSyncInterval(config.sync.dailySyncTime);\n\n const runSync = async () => {\n console.log(`[${new Date().toISOString()}] Starting sync...`);\n await eventClient.emit('integration_sync_started');\n\n for (const integration of config!.integrations.filter((i) => i.enabled)) {\n try {\n console.log(` Syncing ${integration.type}...`);\n const connector = await loadConnector(integration);\n await connector.authenticate(integration);\n\n const delta = await connector.fetchDelta(integration.cursor ?? undefined);\n if (delta.items.length > 0) {\n const normalized = await connector.normalize(delta.items);\n\n // Write raw items\n for (const item of normalized) {\n const filePath = `context/raw/${integration.type}/${item.id}.md`;\n const content = `# ${item.title}\\n\\n${item.body}\\n\\n---\\nSource: ${item.source}\\nTimestamp: ${item.timestamp}\\n`;\n await resolvedStorage.write(filePath, content);\n }\n\n // Update cursor\n integration.cursor = delta.newCursor;\n integration.lastSyncAt = new Date().toISOString();\n console.log(` ${integration.type}: ${delta.items.length} items synced`);\n } else {\n console.log(` ${integration.type}: no new items`);\n }\n } catch (err) {\n console.error(` Error syncing ${integration.type}:`, err);\n await eventClient.emit('error_occurred', {\n integration: integration.type,\n error: String(err),\n });\n }\n }\n\n // Save updated cursors\n await configManager.saveConfig(config!);\n\n // Generate daily summary\n const today = new Date().toISOString().slice(0, 10);\n const summaryContent = await generateDailySummary(resolvedStorage, today);\n await resolvedStorage.write(`context/derived/daily/${today}.md`, summaryContent);\n\n // Rebuild indexes\n await indexer.buildIndexes();\n\n await eventClient.emit('integration_sync_completed');\n console.log(`[${new Date().toISOString()}] Sync complete.`);\n };\n\n // Run immediately\n await runSync();\n\n // Then run on interval\n console.log(`\\nNext sync in ${syncInterval}ms (${Math.round(syncInterval / 60000)} minutes)`);\n const interval = setInterval(runSync, syncInterval);\n\n process.on('SIGINT', () => {\n console.log('\\nStopping daemon...');\n clearInterval(interval);\n process.exit(0);\n });\n\n // Keep process alive\n await new Promise(() => {});\n}\n\nfunction parseSyncInterval(syncTime: string): number {\n // For the daemon, we run every 24 hours by default\n // In a real implementation, this would use node-cron with the actual time\n return 24 * 60 * 60 * 1000; // 24 hours\n}\n\nasync function generateDailySummary(\n storage: import('@personal-assistant/core-types').StorageBackend,\n date: string,\n): Promise<string> {\n let summary = `# Daily Summary - ${date}\\n\\n`;\n summary += `Generated at: ${new Date().toISOString()}\\n\\n`;\n\n // Aggregate raw items from today\n const integrationTypes = ['slack', 'gmail', 'github', 'gitlab', 'gdrive', 'gchat'];\n for (const intType of integrationTypes) {\n try {\n const files = await storage.list(`context/raw/${intType}`);\n if (files.length > 0) {\n summary += `## ${intType.charAt(0).toUpperCase() + intType.slice(1)}\\n\\n`;\n summary += `- ${files.length} items\\n\\n`;\n }\n } catch {\n // Directory doesn't exist\n }\n }\n\n return summary;\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // ../integrations-gmail/dist/index.js
4
2
  var GmailConnector = class {
5
3
  type = "gmail";
@@ -92,4 +90,4 @@ export {
92
90
  GmailConnector,
93
91
  createGmailConnector
94
92
  };
95
- //# sourceMappingURL=dist-TWNHTXYH.js.map
93
+ //# sourceMappingURL=dist-3BOY3CPO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../integrations-gmail/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GmailConnector = class {\n type = \"gmail\";\n credentials;\n async authenticate(config) {\n this.credentials = config.credentials;\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Gmail client ID, client secret, and refresh token are required\");\n }\n }\n async healthCheck() {\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Gmail client ID, client secret, and refresh token are required\");\n }\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const gmail = google.gmail({ version: \"v1\", auth: oauth2Client });\n const profile = await gmail.users.getProfile({ userId: \"me\" });\n return { summary: `Connected as ${profile.data.emailAddress ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.credentials) throw new Error(\"Not authenticated\");\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const gmail = google.gmail({ version: \"v1\", auth: oauth2Client });\n const query = cursor ? `after:${cursor}` : \"newer_than:1d\";\n const res = await gmail.users.messages.list({\n userId: \"me\",\n q: query,\n maxResults: 50\n });\n const items = [];\n for (const msg of res.data.messages ?? []) {\n if (!msg.id) continue;\n const detail = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.id,\n format: \"metadata\",\n metadataHeaders: [\"Subject\", \"From\", \"To\", \"Date\"]\n });\n const headers = detail.data.payload?.headers ?? [];\n const subject = headers.find((h) => h.name === \"Subject\")?.value ?? \"\";\n const from = headers.find((h) => h.name === \"From\")?.value ?? \"\";\n const snippet = detail.data.snippet ?? \"\";\n items.push({\n id: msg.id,\n source: \"gmail\",\n type: \"email\",\n content: `Subject: ${subject}\nFrom: ${from}\n\n${snippet}`,\n metadata: { subject, from, threadId: detail.data.threadId ?? \"\" },\n timestamp: new Date(parseInt(detail.data.internalDate ?? \"0\")).toISOString()\n });\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gmail\",\n title: `Email: ${item.metadata.subject}`,\n body: item.content,\n entities: extractEmailAddresses(item.content),\n timestamp: item.timestamp\n }));\n }\n};\nfunction extractEmailAddresses(text) {\n const emails = text.match(/[\\w.-]+@[\\w.-]+\\.\\w+/g) ?? [];\n return [...new Set(emails)];\n}\nfunction createGmailConnector() {\n return new GmailConnector();\n}\nexport {\n GmailConnector,\n createGmailConnector\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../integrations-gmail/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GmailConnector = class {\n type = \"gmail\";\n credentials;\n async authenticate(config) {\n this.credentials = config.credentials;\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Gmail client ID, client secret, and refresh token are required\");\n }\n }\n async healthCheck() {\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Gmail client ID, client secret, and refresh token are required\");\n }\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const gmail = google.gmail({ version: \"v1\", auth: oauth2Client });\n const profile = await gmail.users.getProfile({ userId: \"me\" });\n return { summary: `Connected as ${profile.data.emailAddress ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.credentials) throw new Error(\"Not authenticated\");\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const gmail = google.gmail({ version: \"v1\", auth: oauth2Client });\n const query = cursor ? `after:${cursor}` : \"newer_than:1d\";\n const res = await gmail.users.messages.list({\n userId: \"me\",\n q: query,\n maxResults: 50\n });\n const items = [];\n for (const msg of res.data.messages ?? []) {\n if (!msg.id) continue;\n const detail = await gmail.users.messages.get({\n userId: \"me\",\n id: msg.id,\n format: \"metadata\",\n metadataHeaders: [\"Subject\", \"From\", \"To\", \"Date\"]\n });\n const headers = detail.data.payload?.headers ?? [];\n const subject = headers.find((h) => h.name === \"Subject\")?.value ?? \"\";\n const from = headers.find((h) => h.name === \"From\")?.value ?? \"\";\n const snippet = detail.data.snippet ?? \"\";\n items.push({\n id: msg.id,\n source: \"gmail\",\n type: \"email\",\n content: `Subject: ${subject}\nFrom: ${from}\n\n${snippet}`,\n metadata: { subject, from, threadId: detail.data.threadId ?? \"\" },\n timestamp: new Date(parseInt(detail.data.internalDate ?? \"0\")).toISOString()\n });\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString().slice(0, 10),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gmail\",\n title: `Email: ${item.metadata.subject}`,\n body: item.content,\n entities: extractEmailAddresses(item.content),\n timestamp: item.timestamp\n }));\n }\n};\nfunction extractEmailAddresses(text) {\n const emails = text.match(/[\\w.-]+@[\\w.-]+\\.\\w+/g) ?? [];\n return [...new Set(emails)];\n}\nfunction createGmailConnector() {\n return new GmailConnector();\n}\nexport {\n GmailConnector,\n createGmailConnector\n};\n"],"mappings":"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","names":[]}
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // ../integrations-gchat/dist/index.js
4
2
  var GChatConnector = class {
5
3
  type = "gchat";
@@ -38,4 +36,4 @@ export {
38
36
  GChatConnector,
39
37
  createGChatConnector
40
38
  };
41
- //# sourceMappingURL=dist-RMYCRZIU.js.map
39
+ //# sourceMappingURL=dist-EOAIYOVP.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../integrations-gchat/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GChatConnector = class {\n type = \"gchat\";\n async authenticate(_config) {\n throw new Error(\n \"Google Chat integration is not implemented yet. Disable gchat in your integrations config until the connector is available.\"\n );\n }\n async healthCheck() {\n throw new Error(\n \"Google Chat integration is not implemented yet. Disable gchat in your integrations config until the connector is available.\"\n );\n }\n async fetchDelta(_cursor) {\n return {\n items: [],\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gchat\",\n title: \"GChat message\",\n body: item.content,\n entities: [],\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGChatConnector() {\n return new GChatConnector();\n}\nexport {\n GChatConnector,\n createGChatConnector\n};\n"],"mappings":";;;AACA,IAAI,iBAAiB,MAAM;AAAA,EACzB,OAAO;AAAA,EACP,MAAM,aAAa,SAAS;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,cAAc;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,SAAS;AACxB,WAAO;AAAA,MACL,OAAO,CAAC;AAAA,MACR,YAA4B,oBAAI,KAAK,GAAG,YAAY;AAAA,MACpD,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,UAAU,UAAU;AACxB,WAAO,SAAS,IAAI,CAAC,UAAU;AAAA,MAC7B,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,UAAU,CAAC;AAAA,MACX,WAAW,KAAK;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AACA,SAAS,uBAAuB;AAC9B,SAAO,IAAI,eAAe;AAC5B;","names":[]}
1
+ {"version":3,"sources":["../../integrations-gchat/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GChatConnector = class {\n type = \"gchat\";\n async authenticate(_config) {\n throw new Error(\n \"Google Chat integration is not implemented yet. Disable gchat in your integrations config until the connector is available.\"\n );\n }\n async healthCheck() {\n throw new Error(\n \"Google Chat integration is not implemented yet. Disable gchat in your integrations config until the connector is available.\"\n );\n }\n async fetchDelta(_cursor) {\n return {\n items: [],\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gchat\",\n title: \"GChat message\",\n body: item.content,\n entities: [],\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGChatConnector() {\n return new GChatConnector();\n}\nexport {\n GChatConnector,\n createGChatConnector\n};\n"],"mappings":";AACA,IAAI,iBAAiB,MAAM;AAAA,EACzB,OAAO;AAAA,EACP,MAAM,aAAa,SAAS;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,cAAc;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,SAAS;AACxB,WAAO;AAAA,MACL,OAAO,CAAC;AAAA,MACR,YAA4B,oBAAI,KAAK,GAAG,YAAY;AAAA,MACpD,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,UAAU,UAAU;AACxB,WAAO,SAAS,IAAI,CAAC,UAAU;AAAA,MAC7B,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,UAAU,CAAC;AAAA,MACX,WAAW,KAAK;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AACA,SAAS,uBAAuB;AAC9B,SAAO,IAAI,eAAe;AAC5B;","names":[]}
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // ../integrations-github/dist/index.js
4
2
  var GitHubConnector = class {
5
3
  type = "github";
@@ -175,4 +173,4 @@ export {
175
173
  GitHubConnector,
176
174
  createGitHubConnector
177
175
  };
178
- //# sourceMappingURL=dist-NV2YVVHI.js.map
176
+ //# sourceMappingURL=dist-HJU53U7M.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../integrations-github/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GitHubConnector = class {\n type = \"github\";\n token;\n repositories;\n async authenticate(config) {\n this.token = config.credentials?.token;\n if (!this.token) {\n throw new Error(\"GitHub personal access token is required\");\n }\n this.repositories = config.repositories;\n }\n async healthCheck() {\n if (!this.token) throw new Error(\"GitHub personal access token is required\");\n const res = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `token ${this.token}`,\n \"User-Agent\": \"personal-assistant\",\n Accept: \"application/vnd.github+json\"\n }\n });\n if (!res.ok) {\n throw new Error(\"GitHub auth test failed: invalid token or insufficient scopes\");\n }\n const data = await res.json();\n return { summary: `Connected as ${data.login ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.token) throw new Error(\"Not authenticated\");\n const since = cursor ?? new Date(Date.now() - 864e5).toISOString();\n const items = [];\n const headers = {\n Authorization: `token ${this.token}`,\n Accept: \"application/vnd.github.v3+json\"\n };\n const notifRes = await fetch(\n `https://api.github.com/notifications?since=${since}&all=false`,\n { headers }\n );\n if (notifRes.ok) {\n const notifications = await notifRes.json();\n for (const notif of notifications) {\n if (this.repositories && !this.repositories.includes(notif.repository.full_name)) {\n continue;\n }\n items.push({\n id: notif.id,\n source: \"github\",\n type: notif.subject.type.toLowerCase(),\n content: `${notif.subject.type}: ${notif.subject.title} in ${notif.repository.full_name}`,\n metadata: {\n repo: notif.repository.full_name,\n subjectType: notif.subject.type,\n reason: notif.reason\n },\n timestamp: notif.updated_at\n });\n }\n }\n if (this.repositories && this.repositories.length > 0) {\n for (const repo of this.repositories) {\n const eventsRes = await fetch(\n `https://api.github.com/repos/${repo}/events?per_page=30`,\n { headers }\n );\n if (eventsRes.ok) {\n const events = await eventsRes.json();\n for (const event of events) {\n if (new Date(event.created_at) < new Date(since)) continue;\n items.push({\n id: event.id,\n source: \"github\",\n type: event.type,\n content: this.formatEventContent(event),\n metadata: {\n repo: event.repo.name,\n eventType: event.type,\n actor: event.actor.login,\n payload: this.extractPayloadSummary(event.type, event.payload)\n },\n timestamp: event.created_at\n });\n }\n }\n }\n } else {\n const eventsRes = await fetch(\"https://api.github.com/events?per_page=30\", {\n headers\n });\n if (eventsRes.ok) {\n const events = await eventsRes.json();\n for (const event of events) {\n if (new Date(event.created_at) < new Date(since)) continue;\n items.push({\n id: event.id,\n source: \"github\",\n type: event.type,\n content: this.formatEventContent(event),\n metadata: {\n repo: event.repo.name,\n eventType: event.type,\n actor: event.actor.login,\n payload: this.extractPayloadSummary(event.type, event.payload)\n },\n timestamp: event.created_at\n });\n }\n }\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n formatEventContent(event) {\n const summary = this.extractPayloadSummary(event.type, event.payload);\n const base = `${event.type} in ${event.repo.name} by ${event.actor.login}`;\n return summary ? `${base} \\u2014 ${summary}` : base;\n }\n extractPayloadSummary(type, payload) {\n switch (type) {\n case \"PushEvent\": {\n const commits = payload.commits;\n if (commits && commits.length > 0) {\n return commits.map((c) => c.message.split(\"\\n\")[0]).join(\"; \");\n }\n return \"\";\n }\n case \"PullRequestEvent\": {\n const pr = payload.pull_request;\n const action = payload.action;\n return pr ? `${action}: ${pr.title}` : \"\";\n }\n case \"IssuesEvent\": {\n const issue = payload.issue;\n const action = payload.action;\n return issue ? `${action}: ${issue.title}` : \"\";\n }\n case \"IssueCommentEvent\": {\n const issue = payload.issue;\n return issue ? `comment on: ${issue.title}` : \"\";\n }\n case \"CreateEvent\": {\n const refType = payload.ref_type;\n const ref = payload.ref;\n return ref ? `${refType}: ${ref}` : `${refType}`;\n }\n case \"DeleteEvent\": {\n const refType = payload.ref_type;\n const ref = payload.ref;\n return `deleted ${refType}: ${ref}`;\n }\n default:\n return \"\";\n }\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"github\",\n title: item.content,\n body: item.content,\n entities: [item.metadata.repo, item.metadata.actor].filter(Boolean),\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGitHubConnector() {\n return new GitHubConnector();\n}\nexport {\n GitHubConnector,\n createGitHubConnector\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../integrations-github/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GitHubConnector = class {\n type = \"github\";\n token;\n repositories;\n async authenticate(config) {\n this.token = config.credentials?.token;\n if (!this.token) {\n throw new Error(\"GitHub personal access token is required\");\n }\n this.repositories = config.repositories;\n }\n async healthCheck() {\n if (!this.token) throw new Error(\"GitHub personal access token is required\");\n const res = await fetch(\"https://api.github.com/user\", {\n headers: {\n Authorization: `token ${this.token}`,\n \"User-Agent\": \"personal-assistant\",\n Accept: \"application/vnd.github+json\"\n }\n });\n if (!res.ok) {\n throw new Error(\"GitHub auth test failed: invalid token or insufficient scopes\");\n }\n const data = await res.json();\n return { summary: `Connected as ${data.login ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.token) throw new Error(\"Not authenticated\");\n const since = cursor ?? new Date(Date.now() - 864e5).toISOString();\n const items = [];\n const headers = {\n Authorization: `token ${this.token}`,\n Accept: \"application/vnd.github.v3+json\"\n };\n const notifRes = await fetch(\n `https://api.github.com/notifications?since=${since}&all=false`,\n { headers }\n );\n if (notifRes.ok) {\n const notifications = await notifRes.json();\n for (const notif of notifications) {\n if (this.repositories && !this.repositories.includes(notif.repository.full_name)) {\n continue;\n }\n items.push({\n id: notif.id,\n source: \"github\",\n type: notif.subject.type.toLowerCase(),\n content: `${notif.subject.type}: ${notif.subject.title} in ${notif.repository.full_name}`,\n metadata: {\n repo: notif.repository.full_name,\n subjectType: notif.subject.type,\n reason: notif.reason\n },\n timestamp: notif.updated_at\n });\n }\n }\n if (this.repositories && this.repositories.length > 0) {\n for (const repo of this.repositories) {\n const eventsRes = await fetch(\n `https://api.github.com/repos/${repo}/events?per_page=30`,\n { headers }\n );\n if (eventsRes.ok) {\n const events = await eventsRes.json();\n for (const event of events) {\n if (new Date(event.created_at) < new Date(since)) continue;\n items.push({\n id: event.id,\n source: \"github\",\n type: event.type,\n content: this.formatEventContent(event),\n metadata: {\n repo: event.repo.name,\n eventType: event.type,\n actor: event.actor.login,\n payload: this.extractPayloadSummary(event.type, event.payload)\n },\n timestamp: event.created_at\n });\n }\n }\n }\n } else {\n const eventsRes = await fetch(\"https://api.github.com/events?per_page=30\", {\n headers\n });\n if (eventsRes.ok) {\n const events = await eventsRes.json();\n for (const event of events) {\n if (new Date(event.created_at) < new Date(since)) continue;\n items.push({\n id: event.id,\n source: \"github\",\n type: event.type,\n content: this.formatEventContent(event),\n metadata: {\n repo: event.repo.name,\n eventType: event.type,\n actor: event.actor.login,\n payload: this.extractPayloadSummary(event.type, event.payload)\n },\n timestamp: event.created_at\n });\n }\n }\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n formatEventContent(event) {\n const summary = this.extractPayloadSummary(event.type, event.payload);\n const base = `${event.type} in ${event.repo.name} by ${event.actor.login}`;\n return summary ? `${base} \\u2014 ${summary}` : base;\n }\n extractPayloadSummary(type, payload) {\n switch (type) {\n case \"PushEvent\": {\n const commits = payload.commits;\n if (commits && commits.length > 0) {\n return commits.map((c) => c.message.split(\"\\n\")[0]).join(\"; \");\n }\n return \"\";\n }\n case \"PullRequestEvent\": {\n const pr = payload.pull_request;\n const action = payload.action;\n return pr ? `${action}: ${pr.title}` : \"\";\n }\n case \"IssuesEvent\": {\n const issue = payload.issue;\n const action = payload.action;\n return issue ? `${action}: ${issue.title}` : \"\";\n }\n case \"IssueCommentEvent\": {\n const issue = payload.issue;\n return issue ? `comment on: ${issue.title}` : \"\";\n }\n case \"CreateEvent\": {\n const refType = payload.ref_type;\n const ref = payload.ref;\n return ref ? `${refType}: ${ref}` : `${refType}`;\n }\n case \"DeleteEvent\": {\n const refType = payload.ref_type;\n const ref = payload.ref;\n return `deleted ${refType}: ${ref}`;\n }\n default:\n return \"\";\n }\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"github\",\n title: item.content,\n body: item.content,\n entities: [item.metadata.repo, item.metadata.actor].filter(Boolean),\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGitHubConnector() {\n return new GitHubConnector();\n}\nexport {\n GitHubConnector,\n createGitHubConnector\n};\n"],"mappings":"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","names":[]}
@@ -3,12 +3,11 @@ import {
3
3
  createSlackConnector,
4
4
  openSocketModeConnection,
5
5
  validateSlackAppToken
6
- } from "./chunk-ZKKMIDRK.js";
7
- import "./chunk-7D4SUZUM.js";
6
+ } from "./chunk-YJ32S56Q.js";
8
7
  export {
9
8
  SlackConnector,
10
9
  createSlackConnector,
11
10
  openSocketModeConnection,
12
11
  validateSlackAppToken
13
12
  };
14
- //# sourceMappingURL=dist-THLCZNOZ.js.map
13
+ //# sourceMappingURL=dist-RFHCRKM3.js.map
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // ../integrations-gdrive/dist/index.js
4
2
  var GDriveDocsConnector = class {
5
3
  type = "gdrive";
@@ -88,4 +86,4 @@ export {
88
86
  GDriveDocsConnector,
89
87
  createGDriveDocsConnector
90
88
  };
91
- //# sourceMappingURL=dist-3PIJOFZ4.js.map
89
+ //# sourceMappingURL=dist-WFQSK6BF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../integrations-gdrive/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GDriveDocsConnector = class {\n type = \"gdrive\";\n credentials;\n async authenticate(config) {\n this.credentials = config.credentials;\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n }\n async healthCheck() {\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const about = await drive.about.get({ fields: \"user\" });\n return { summary: `Connected as ${about.data.user?.displayName ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.credentials) throw new Error(\"Not authenticated\");\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const modifiedAfter = cursor ?? new Date(Date.now() - 864e5).toISOString();\n const res = await drive.files.list({\n q: `modifiedTime > '${modifiedAfter}' and mimeType = 'application/vnd.google-apps.document' and trashed = false`,\n fields: \"files(id, name, modifiedTime, owners)\",\n pageSize: 50\n });\n const items = [];\n for (const file of res.data.files ?? []) {\n if (!file.id || !file.name) continue;\n let content = \"\";\n try {\n const exportRes = await drive.files.export({\n fileId: file.id,\n mimeType: \"text/plain\"\n });\n content = String(exportRes.data).slice(0, 5e3);\n } catch {\n content = `[Document: ${file.name}]`;\n }\n items.push({\n id: file.id,\n source: \"gdrive\",\n type: \"document\",\n content,\n metadata: {\n name: file.name,\n modifiedTime: file.modifiedTime ?? \"\"\n },\n timestamp: file.modifiedTime ?? (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gdrive\",\n title: `Doc: ${item.metadata.name}`,\n body: item.content.slice(0, 2e3),\n entities: [],\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGDriveDocsConnector() {\n return new GDriveDocsConnector();\n}\nexport {\n GDriveDocsConnector,\n createGDriveDocsConnector\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../integrations-gdrive/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GDriveDocsConnector = class {\n type = \"gdrive\";\n credentials;\n async authenticate(config) {\n this.credentials = config.credentials;\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n }\n async healthCheck() {\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const about = await drive.about.get({ fields: \"user\" });\n return { summary: `Connected as ${about.data.user?.displayName ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.credentials) throw new Error(\"Not authenticated\");\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const modifiedAfter = cursor ?? new Date(Date.now() - 864e5).toISOString();\n const res = await drive.files.list({\n q: `modifiedTime > '${modifiedAfter}' and mimeType = 'application/vnd.google-apps.document' and trashed = false`,\n fields: \"files(id, name, modifiedTime, owners)\",\n pageSize: 50\n });\n const items = [];\n for (const file of res.data.files ?? []) {\n if (!file.id || !file.name) continue;\n let content = \"\";\n try {\n const exportRes = await drive.files.export({\n fileId: file.id,\n mimeType: \"text/plain\"\n });\n content = String(exportRes.data).slice(0, 5e3);\n } catch {\n content = `[Document: ${file.name}]`;\n }\n items.push({\n id: file.id,\n source: \"gdrive\",\n type: \"document\",\n content,\n metadata: {\n name: file.name,\n modifiedTime: file.modifiedTime ?? \"\"\n },\n timestamp: file.modifiedTime ?? (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gdrive\",\n title: `Doc: ${item.metadata.name}`,\n body: item.content.slice(0, 2e3),\n entities: [],\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGDriveDocsConnector() {\n return new GDriveDocsConnector();\n}\nexport {\n GDriveDocsConnector,\n createGDriveDocsConnector\n};\n"],"mappings":"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","names":[]}
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // ../integrations-gitlab/dist/index.js
4
2
  var GitLabConnector = class {
5
3
  type = "gitlab";
@@ -99,4 +97,4 @@ export {
99
97
  GitLabConnector,
100
98
  createGitLabConnector
101
99
  };
102
- //# sourceMappingURL=dist-L76NGFFH.js.map
100
+ //# sourceMappingURL=dist-ZK23POW6.js.map