@mukulaggarwal/pacman 0.1.4 → 0.1.6
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 +10 -0
- package/dist/{chunk-DNI6TIXZ.js → chunk-LKKDJ5A7.js} +3 -3
- package/dist/{chunk-WH3UMGHQ.js → chunk-S5ZLV5QT.js} +2 -2
- package/dist/{chunk-YJ32S56Q.js → chunk-X6CHTBN2.js} +5 -3
- package/dist/chunk-X6CHTBN2.js.map +1 -0
- package/dist/daemon.js +1 -1
- package/dist/{dist-WFQSK6BF.js → dist-6XSJ2XC4.js} +48 -7
- package/dist/dist-6XSJ2XC4.js.map +1 -0
- package/dist/{dist-RFHCRKM3.js → dist-GJFZVMLI.js} +2 -2
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-compat.js +2 -2
- package/dist/onboarding-server.js +1684 -93
- package/dist/onboarding-server.js.map +1 -1
- package/dist/onboarding-web/assets/index-BwF9HPxA.css +1 -0
- package/dist/onboarding-web/assets/index-C0NQ8pNs.js +99 -0
- package/dist/onboarding-web/index.html +2 -2
- package/dist/slack-listener.d.ts +3 -0
- package/dist/slack-listener.js +146 -7
- package/dist/slack-listener.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-YJ32S56Q.js.map +0 -1
- package/dist/dist-WFQSK6BF.js.map +0 -1
- package/dist/onboarding-web/assets/index-BOAOMlJT.css +0 -1
- package/dist/onboarding-web/assets/index-roRRNUhE.js +0 -71
- /package/dist/{chunk-DNI6TIXZ.js.map → chunk-LKKDJ5A7.js.map} +0 -0
- /package/dist/{chunk-WH3UMGHQ.js.map → chunk-S5ZLV5QT.js.map} +0 -0
- /package/dist/{dist-RFHCRKM3.js.map → dist-GJFZVMLI.js.map} +0 -0
package/README.md
CHANGED
|
@@ -58,6 +58,16 @@ pacman init -d .personal-assistant
|
|
|
58
58
|
|
|
59
59
|
This launches the onboarding UI and configures your profile, assistant identity, storage backend, integrations, and sync schedule.
|
|
60
60
|
|
|
61
|
+
The onboarding form is checkpointed in browser `localStorage`, so refreshes and reopened tabs resume from the same draft.
|
|
62
|
+
|
|
63
|
+
</details>
|
|
64
|
+
|
|
65
|
+
<details>
|
|
66
|
+
<summary><strong>Hard reset the onboarding checkpoint</strong></summary>
|
|
67
|
+
|
|
68
|
+
Use the `Hard Reset Onboarding Draft` action from the completion screen, or remove the
|
|
69
|
+
`pacman.onboarding.v1` key from the browser's local storage for the onboarding page.
|
|
70
|
+
|
|
61
71
|
</details>
|
|
62
72
|
|
|
63
73
|
<details open>
|
|
@@ -61,7 +61,7 @@ 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-
|
|
64
|
+
const { createSlackConnector } = await import("./dist-GJFZVMLI.js");
|
|
65
65
|
return createSlackConnector();
|
|
66
66
|
}
|
|
67
67
|
case "gmail": {
|
|
@@ -77,7 +77,7 @@ async function loadConnector(configOrType) {
|
|
|
77
77
|
return createGitLabConnector();
|
|
78
78
|
}
|
|
79
79
|
case "gdrive": {
|
|
80
|
-
const { createGDriveDocsConnector } = await import("./dist-
|
|
80
|
+
const { createGDriveDocsConnector } = await import("./dist-6XSJ2XC4.js");
|
|
81
81
|
return createGDriveDocsConnector();
|
|
82
82
|
}
|
|
83
83
|
case "gchat": {
|
|
@@ -145,4 +145,4 @@ export {
|
|
|
145
145
|
loadConnector,
|
|
146
146
|
validateIntegrationConfig
|
|
147
147
|
};
|
|
148
|
-
//# sourceMappingURL=chunk-
|
|
148
|
+
//# sourceMappingURL=chunk-LKKDJ5A7.js.map
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
createNoopEventClient,
|
|
6
6
|
validateIntegrationConfig
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-LKKDJ5A7.js";
|
|
8
8
|
import {
|
|
9
9
|
createContextManager
|
|
10
10
|
} from "./chunk-UWT6AFJB.js";
|
|
@@ -809,4 +809,4 @@ export {
|
|
|
809
809
|
installCodexMcp,
|
|
810
810
|
startMcpServer
|
|
811
811
|
};
|
|
812
|
-
//# sourceMappingURL=chunk-
|
|
812
|
+
//# sourceMappingURL=chunk-S5ZLV5QT.js.map
|
|
@@ -73,11 +73,12 @@ var SlackConnector = class {
|
|
|
73
73
|
async listChannels() {
|
|
74
74
|
if (!this.token) throw new Error("Slack bot token is required");
|
|
75
75
|
const channels = [];
|
|
76
|
+
const seen = /* @__PURE__ */ new Set();
|
|
76
77
|
let cursor;
|
|
77
78
|
do {
|
|
78
79
|
const data = await slackApiRequest(
|
|
79
80
|
this.token,
|
|
80
|
-
"conversations
|
|
81
|
+
"users.conversations",
|
|
81
82
|
{
|
|
82
83
|
limit: "200",
|
|
83
84
|
types: "public_channel,private_channel",
|
|
@@ -86,7 +87,8 @@ var SlackConnector = class {
|
|
|
86
87
|
}
|
|
87
88
|
);
|
|
88
89
|
for (const channel of data.channels ?? []) {
|
|
89
|
-
if (!channel.id || !channel.name) continue;
|
|
90
|
+
if (!channel.id || !channel.name || seen.has(channel.id)) continue;
|
|
91
|
+
seen.add(channel.id);
|
|
90
92
|
channels.push({
|
|
91
93
|
id: channel.id,
|
|
92
94
|
name: channel.name,
|
|
@@ -288,4 +290,4 @@ export {
|
|
|
288
290
|
openSocketModeConnection,
|
|
289
291
|
createSlackConnector
|
|
290
292
|
};
|
|
291
|
-
//# sourceMappingURL=chunk-
|
|
293
|
+
//# sourceMappingURL=chunk-X6CHTBN2.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 const seen = /* @__PURE__ */ new Set();\n let cursor;\n do {\n const data = await slackApiRequest(\n this.token,\n \"users.conversations\",\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 || seen.has(channel.id)) continue;\n seen.add(channel.id);\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
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
var GDriveDocsConnector = class {
|
|
3
3
|
type = "gdrive";
|
|
4
4
|
credentials;
|
|
5
|
+
folders;
|
|
5
6
|
async authenticate(config) {
|
|
6
7
|
this.credentials = config.credentials;
|
|
8
|
+
this.folders = config.folders?.filter(Boolean);
|
|
7
9
|
if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {
|
|
8
10
|
throw new Error("Google Drive client ID, client secret, and refresh token are required");
|
|
9
11
|
}
|
|
@@ -32,13 +34,9 @@ var GDriveDocsConnector = class {
|
|
|
32
34
|
oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });
|
|
33
35
|
const drive = google.drive({ version: "v3", auth: oauth2Client });
|
|
34
36
|
const modifiedAfter = cursor ?? new Date(Date.now() - 864e5).toISOString();
|
|
35
|
-
const
|
|
36
|
-
q: `modifiedTime > '${modifiedAfter}' and mimeType = 'application/vnd.google-apps.document' and trashed = false`,
|
|
37
|
-
fields: "files(id, name, modifiedTime, owners)",
|
|
38
|
-
pageSize: 50
|
|
39
|
-
});
|
|
37
|
+
const files = this.folders && this.folders.length > 0 ? await this.listDocumentsInFolders(drive, this.folders, modifiedAfter) : await this.listAllDocuments(drive, modifiedAfter);
|
|
40
38
|
const items = [];
|
|
41
|
-
for (const file of
|
|
39
|
+
for (const file of files) {
|
|
42
40
|
if (!file.id || !file.name) continue;
|
|
43
41
|
let content = "";
|
|
44
42
|
try {
|
|
@@ -68,6 +66,49 @@ var GDriveDocsConnector = class {
|
|
|
68
66
|
hasMore: false
|
|
69
67
|
};
|
|
70
68
|
}
|
|
69
|
+
async listAllDocuments(drive, modifiedAfter) {
|
|
70
|
+
const res = await drive.files.list({
|
|
71
|
+
q: `modifiedTime > '${modifiedAfter}' and mimeType = 'application/vnd.google-apps.document' and trashed = false`,
|
|
72
|
+
fields: "files(id, name, modifiedTime, owners)",
|
|
73
|
+
pageSize: 50
|
|
74
|
+
});
|
|
75
|
+
return res.data.files ?? [];
|
|
76
|
+
}
|
|
77
|
+
async listDocumentsInFolders(drive, folderIds, modifiedAfter) {
|
|
78
|
+
const pendingFolderIds = [...folderIds];
|
|
79
|
+
const visitedFolderIds = /* @__PURE__ */ new Set();
|
|
80
|
+
const documentsById = /* @__PURE__ */ new Map();
|
|
81
|
+
while (pendingFolderIds.length > 0) {
|
|
82
|
+
const folderId = pendingFolderIds.shift();
|
|
83
|
+
if (!folderId || visitedFolderIds.has(folderId)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
visitedFolderIds.add(folderId);
|
|
87
|
+
let pageToken;
|
|
88
|
+
do {
|
|
89
|
+
const res = await drive.files.list({
|
|
90
|
+
q: `'${folderId}' in parents and trashed = false and (mimeType = 'application/vnd.google-apps.folder' or mimeType = 'application/vnd.google-apps.document')`,
|
|
91
|
+
fields: "nextPageToken, files(id, name, mimeType, modifiedTime, owners)",
|
|
92
|
+
pageSize: 100,
|
|
93
|
+
pageToken
|
|
94
|
+
});
|
|
95
|
+
for (const file of res.data.files ?? []) {
|
|
96
|
+
if (!file.id) {
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (file.mimeType === "application/vnd.google-apps.folder") {
|
|
100
|
+
pendingFolderIds.push(file.id);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
if (file.mimeType === "application/vnd.google-apps.document" && (!file.modifiedTime || file.modifiedTime > modifiedAfter)) {
|
|
104
|
+
documentsById.set(file.id, file);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
pageToken = res.data.nextPageToken ?? void 0;
|
|
108
|
+
} while (pageToken);
|
|
109
|
+
}
|
|
110
|
+
return [...documentsById.values()];
|
|
111
|
+
}
|
|
71
112
|
async normalize(rawItems) {
|
|
72
113
|
return rawItems.map((item) => ({
|
|
73
114
|
id: item.id,
|
|
@@ -86,4 +127,4 @@ export {
|
|
|
86
127
|
GDriveDocsConnector,
|
|
87
128
|
createGDriveDocsConnector
|
|
88
129
|
};
|
|
89
|
-
//# sourceMappingURL=dist-
|
|
130
|
+
//# sourceMappingURL=dist-6XSJ2XC4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../integrations-gdrive/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GDriveDocsConnector = class {\n type = \"gdrive\";\n credentials;\n folders;\n async authenticate(config) {\n this.credentials = config.credentials;\n this.folders = config.folders?.filter(Boolean);\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 files = this.folders && this.folders.length > 0 ? await this.listDocumentsInFolders(drive, this.folders, modifiedAfter) : await this.listAllDocuments(drive, modifiedAfter);\n const items = [];\n for (const file of 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 listAllDocuments(drive, modifiedAfter) {\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 return res.data.files ?? [];\n }\n async listDocumentsInFolders(drive, folderIds, modifiedAfter) {\n const pendingFolderIds = [...folderIds];\n const visitedFolderIds = /* @__PURE__ */ new Set();\n const documentsById = /* @__PURE__ */ new Map();\n while (pendingFolderIds.length > 0) {\n const folderId = pendingFolderIds.shift();\n if (!folderId || visitedFolderIds.has(folderId)) {\n continue;\n }\n visitedFolderIds.add(folderId);\n let pageToken;\n do {\n const res = await drive.files.list({\n q: `'${folderId}' in parents and trashed = false and (mimeType = 'application/vnd.google-apps.folder' or mimeType = 'application/vnd.google-apps.document')`,\n fields: \"nextPageToken, files(id, name, mimeType, modifiedTime, owners)\",\n pageSize: 100,\n pageToken\n });\n for (const file of res.data.files ?? []) {\n if (!file.id) {\n continue;\n }\n if (file.mimeType === \"application/vnd.google-apps.folder\") {\n pendingFolderIds.push(file.id);\n continue;\n }\n if (file.mimeType === \"application/vnd.google-apps.document\" && (!file.modifiedTime || file.modifiedTime > modifiedAfter)) {\n documentsById.set(file.id, file);\n }\n }\n pageToken = res.data.nextPageToken ?? void 0;\n } while (pageToken);\n }\n return [...documentsById.values()];\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":[]}
|
|
@@ -3,11 +3,11 @@ import {
|
|
|
3
3
|
createSlackConnector,
|
|
4
4
|
openSocketModeConnection,
|
|
5
5
|
validateSlackAppToken
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-X6CHTBN2.js";
|
|
7
7
|
export {
|
|
8
8
|
SlackConnector,
|
|
9
9
|
createSlackConnector,
|
|
10
10
|
openSocketModeConnection,
|
|
11
11
|
validateSlackAppToken
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=dist-
|
|
13
|
+
//# sourceMappingURL=dist-GJFZVMLI.js.map
|
package/dist/index.js
CHANGED
|
@@ -4,11 +4,11 @@ import {
|
|
|
4
4
|
installCodexMcp,
|
|
5
5
|
resolvePacmanServerCommand,
|
|
6
6
|
startMcpServer
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-S5ZLV5QT.js";
|
|
8
8
|
import {
|
|
9
9
|
createIndexer
|
|
10
10
|
} from "./chunk-3QNXXON5.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-LKKDJ5A7.js";
|
|
12
12
|
import {
|
|
13
13
|
createContextManager
|
|
14
14
|
} from "./chunk-UWT6AFJB.js";
|
|
@@ -297,7 +297,7 @@ async function resolveWorkspacePath(dirOpt) {
|
|
|
297
297
|
return path3.resolve(dirOpt);
|
|
298
298
|
}
|
|
299
299
|
var program = new Command();
|
|
300
|
-
program.name("pacman").description("Claude Code and Codex compatible, file-backed personal context manager").version("0.1.
|
|
300
|
+
program.name("pacman").description("Claude Code and Codex compatible, file-backed personal context manager").version("0.1.5");
|
|
301
301
|
program.command("init").description("Initialize Pac-Man and open onboarding UI").option("-p, --port <port>", "Port for onboarding server", "3847").option("-d, --dir <dir>", "Workspace directory", ".personal-assistant").action(async (opts) => {
|
|
302
302
|
const workspacePath = path3.resolve(opts.dir);
|
|
303
303
|
const port = parseInt(opts.port, 10);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../../claude-installer/dist/index.js","../../client-guidance/dist/index.js","../../codex-installer/dist/index.js"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\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 { renderTemplate, getTemplate } from '@personal-assistant/template-engine';\nimport { installClaude } from '@personal-assistant/claude-installer';\nimport { installCodex } from '@personal-assistant/codex-installer';\nimport { createNoopEventClient } from '@personal-assistant/event-client';\nimport type { StorageBackend, GDriveStorageConfig } from '@personal-assistant/core-types';\nimport {\n installClaudeMcp,\n installCodexMcp,\n resolvePacmanServerCommand,\n} from './mcp-installers.js';\nimport { startMcpServer } from './mcp-server.js';\n\n// Resolve workspace path: the pointer file written during `init` always wins\n// so all commands automatically find the configured workspace without --dir.\n// Pass an explicit absolute path via --dir to override (e.g. for multi-workspace setups).\nasync function resolveWorkspacePath(dirOpt: string): Promise<string> {\n const rcPath = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? '~',\n '.personal-assistant-rc.json',\n );\n try {\n const rc = JSON.parse(await fs.readFile(rcPath, 'utf-8')) as { workspacePath?: string };\n if (rc.workspacePath) return rc.workspacePath;\n } catch {\n // no pointer yet — fall through to explicit path\n }\n return path.resolve(dirOpt);\n}\n\nconst program = new Command();\n\nprogram\n .name('pacman')\n .description('Claude Code and Codex compatible, file-backed personal context manager')\n .version('0.1.3');\n\n// ---- init command ----\nprogram\n .command('init')\n .description('Initialize Pac-Man and open onboarding UI')\n .option('-p, --port <port>', 'Port for onboarding server', '3847')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = path.resolve(opts.dir);\n const port = parseInt(opts.port, 10);\n\n console.log(`Initializing Pac-Man workspace at ${workspacePath}...`);\n\n // Create workspace directory\n await fs.mkdir(workspacePath, { recursive: true });\n\n // Initialize storage and context\n const storage = createLocalStorage(workspacePath);\n const contextManager = createContextManager(storage);\n await contextManager.initWorkspace();\n\n console.log('Workspace initialized. Starting onboarding server...');\n\n // Start onboarding server\n const { startOnboardingServer } = await import('./onboarding-server.js');\n await startOnboardingServer(port, workspacePath);\n });\n\n// ---- daemon command ----\nprogram\n .command('daemon')\n .description('Start the sync daemon')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log(`Starting daemon with workspace at ${workspacePath}...`);\n\n const { startDaemon } = await import('./daemon.js');\n await startDaemon(workspacePath);\n });\n\n// ---- slack command ----\nprogram\n .command('slack')\n .description('Slack runtime management')\n .command('listen')\n .description('Start the real-time Slack listener')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log(`Starting Slack listener with workspace at ${workspacePath}...`);\n\n const { startSlackListener } = await import('./slack-listener.js');\n await startSlackListener(workspacePath);\n });\n\n// ---- claude install command ----\nprogram\n .command('claude')\n .description('Claude integration management')\n .command('install')\n .description('Install Claude Code integration (CLAUDE.md, settings, skill)')\n .option('-d, --dir <dir>', 'Project directory', '.')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const projectPath = path.resolve(opts.dir);\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n console.log('Installing Claude Code integration...');\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n let config;\n try {\n config = await configManager.loadConfig();\n } catch {\n console.error(\n 'Error: No configuration found. Run `pacman init` first.',\n );\n process.exit(1);\n }\n\n await installClaude({\n projectPath,\n workspacePath,\n config,\n });\n\n console.log('Claude Code integration installed:');\n console.log(` - ${projectPath}/CLAUDE.md`);\n console.log(` - ~/.claude/skills/pacman/SKILL.md`);\n console.log('');\n console.log('Next, register the MCP server with:');\n console.log(' pacman mcp claude install');\n console.log('');\n console.log('Restart Claude Code after the MCP install, then use:');\n console.log(' /pacman start <project_name>');\n });\n\n// ---- codex install command ----\nprogram\n .command('codex')\n .description('Codex integration management')\n .command('install')\n .description('Install Codex integration (AGENTS.md, skill)')\n .option('-d, --dir <dir>', 'Project directory', '.')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const projectPath = path.resolve(opts.dir);\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n console.log('Installing Codex integration...');\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n let config;\n try {\n config = await configManager.loadConfig();\n } catch {\n console.error(\n 'Error: No configuration found. Run `pacman init` first.',\n );\n process.exit(1);\n }\n\n await installCodex({\n projectPath,\n workspacePath,\n config,\n });\n\n console.log('Codex integration installed:');\n console.log(` - ${projectPath}/AGENTS.md`);\n console.log(` - ~/.codex/skills/pacman/SKILL.md`);\n console.log('');\n console.log('Next, register the MCP server with:');\n console.log(' pacman mcp codex install');\n console.log('');\n console.log('Restart Codex after the MCP install, then ask it to load or refresh');\n console.log('your Pac-Man context for a project.');\n });\n\n// ---- mcp command ----\nconst mcpCommand = program\n .command('mcp')\n .description('MCP server management');\n\nmcpCommand\n .command('serve')\n .description('Start the Pac-Man MCP server over stdio')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n await startMcpServer(workspacePath);\n });\n\nmcpCommand\n .command('claude')\n .description('Claude MCP integration management')\n .command('install')\n .description('Register the Pac-Man MCP server with Claude Code')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n await installClaudeMcp(workspacePath, resolvePacmanServerCommand);\n\n console.log('Claude MCP registration installed:');\n console.log(' - managed by Claude Code CLI');\n console.log(` - PA_WORKSPACE=${workspacePath}`);\n console.log('');\n console.log('Restart Claude Code to reload the Pac-Man MCP server.');\n });\n\nmcpCommand\n .command('codex')\n .description('Codex MCP integration management')\n .command('install')\n .description('Register the Pac-Man MCP server with Codex')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n await installCodexMcp(workspacePath, resolvePacmanServerCommand);\n\n console.log('Codex MCP registration installed:');\n console.log(' - managed by Codex CLI');\n console.log(` - PA_WORKSPACE=${workspacePath}`);\n console.log('');\n console.log('Restart Codex to reload the Pac-Man MCP server.');\n });\n\n// ---- sync command ----\nprogram\n .command('sync')\n .description('Run a one-time sync')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log('Running sync...');\n\n // Bootstrap: read config from local to determine storage backend\n const localStore = createLocalStorage(workspacePath);\n const bootConfigManager = createConfigManager(localStore);\n\n // Resolve storage — all operations use the user's chosen backend\n let resolvedStorage: StorageBackend = localStore;\n try {\n const config = await bootConfigManager.loadConfig();\n if (config.storage.mode === 'gdrive') {\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 }\n } catch {\n // Config not readable — continue with local storage\n }\n\n const indexer = createIndexer(resolvedStorage);\n await indexer.buildIndexes();\n\n console.log('Sync complete. Indexes rebuilt.');\n });\n\n// ---- status command ----\nprogram\n .command('status')\n .description('Show current configuration and status')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n try {\n const config = await configManager.loadConfig();\n console.log('Personal Assistant Status');\n console.log('========================');\n console.log(`Workspace: ${workspacePath}`);\n console.log(`User: ${config.user.name}`);\n console.log(`Assistant: ${config.user.assistantName}`);\n console.log(`Profile: ${config.user.profileType}`);\n console.log(`Storage: ${config.storage.mode}`);\n console.log(`Active Project: ${config.activeProject ?? 'none'}`);\n console.log(`Integrations: ${config.integrations.filter((i) => i.enabled).map((i) => i.type).join(', ') || 'none'}`);\n console.log(`Sync Time: ${config.sync.dailySyncTime} ${config.sync.timezone}`);\n console.log(`Slack Runtime: ${config.slackRuntime?.enabled ? `${config.slackRuntime.transport} (${config.slackRuntime.reviewMode})` : 'disabled'}`);\n } catch {\n console.log('No configuration found. Run `pacman init` first.');\n }\n });\n\nprogram.parse();\n","// src/index.ts\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n buildClaudeProjectMemory,\n buildClaudeSkillContent\n} from \"@personal-assistant/client-guidance\";\nasync function installClaude(options) {\n const { projectPath, config } = options;\n await Promise.all([\n generateClaudeMd(projectPath, config),\n generateGlobalSkill()\n ]);\n}\nasync function generateClaudeMd(projectPath, config) {\n await fs.mkdir(projectPath, { recursive: true });\n await fs.writeFile(path.join(projectPath, \"CLAUDE.md\"), buildClaudeProjectMemory(config), \"utf-8\");\n}\nasync function generateGlobalSkill() {\n const skillsRoot = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? \"~\",\n \".claude\",\n \"skills\"\n );\n const legacySkillDir = path.join(skillsRoot, \"personal-assistant\");\n const globalSkillDir = path.join(skillsRoot, \"pacman\");\n await fs.rm(legacySkillDir, { recursive: true, force: true });\n await fs.mkdir(globalSkillDir, { recursive: true });\n await fs.writeFile(path.join(globalSkillDir, \"SKILL.md\"), buildClaudeSkillContent(), \"utf-8\");\n}\nexport {\n installClaude\n};\n","// src/index.ts\nvar TOOL_GROUPS = [\n \"- Config: `config_get`, `config_get_storage_mode`, `config_get_active_project`, `config_set_active_project`\",\n \"- Projects: `project_list`, `project_suggest`, `project_get_context`\",\n \"- Read: `context_search`, `context_read_file`, `context_read_section`, `context_list_recent_updates`, `context_get_daily_summary`\",\n \"- Update: `context_propose_update`, `context_apply_update`, `context_append_note`, `context_rebuild_indexes`\",\n \"- Sync: `sync_run_now`, `sync_status`, `sync_list_integrations`\",\n \"- Events: `events_ping`\"\n];\nvar MCP_SERVER_NAME = \"pacman\";\nvar CLAUDE_START_COMMAND = \"/pacman start <project_name>\";\nfunction getStorageDescription(config) {\n return config.storage.mode === \"local\" ? `Local workspace at: ${config.storage.workspacePath}` : `Google Drive folder: ${config.storage.folderName} (ID: ${config.storage.folderId})`;\n}\nfunction buildSharedProjectSections(config) {\n return `## Context source of truth\n\nAll context is stored in:\n- ${getStorageDescription(config)}\n\nDo not assume any cloud database exists. Never store raw context outside user-controlled storage.\n\n## Context structure\n\nRead context in this order:\n1. context/canonical/ - long-lived, human-readable context (role, projects, stakeholders)\n2. context/derived/daily/ - machine-generated daily summaries\n3. context/derived/indexes/entities.json - extracted entities index\n4. context/raw/ - only when deeper detail is needed from integration data\n\n## Retrieval rule\n\nWhen the user asks about responsibilities, projects, stakeholders, status, history, routines, or prior decisions:\n- Call the Pac-Man MCP tools first\n- Use \\`context_search\\` to find relevant files\n- Use \\`context_read_file\\` or \\`context_read_section\\` for specific content\n- Answer only from retrieved context files\n- State uncertainty if context is missing or insufficient\n\n## Update rule\n\nWhen the conversation creates stable new context (new ownership, priority changes, new contacts):\n- Call \\`context_propose_update\\` with the target file, section, proposed content, and reason\n- If the auto-apply policy allows, call \\`context_apply_update\\`\n- Never silently mutate canonical context without proposing first\n\n## Project rule\n\n- If an active project is set, prefer project-specific files from context/canonical/projects/\n- If no project is set, call \\`project_suggest\\` to infer likely project\n- If multiple candidates exist, ask the user to confirm\n- Use \\`config_set_active_project\\` to set the active project\n\n## MCP usage\n\nThis project uses the Pac-Man MCP server. All context operations go through MCP tools:\n${TOOL_GROUPS.join(\"\\n\")}\n\n## User profile\n\n- Name: ${config.user.name}\n- Assistant name: ${config.user.assistantName}\n- Profile: ${config.user.profileType}\n`;\n}\nfunction buildClaudeProjectMemory(config) {\n return `# Pac-Man Project Rules\n\nThis project uses a local or Google Drive based context manager.\n\n${buildSharedProjectSections(config)}`;\n}\nfunction buildCodexProjectGuidance(config) {\n return `# Pac-Man Project Instructions\n\nThis repository uses a local or Google Drive based context manager.\n\n${buildSharedProjectSections(config)}\n\n## Codex startup rule\n\n- If Pac-Man MCP tools are unavailable, tell the user to run \\`pacman mcp codex install\\`\n- If the package is not installed globally, show the fallback command:\n \\`codex mcp add ${MCP_SERVER_NAME} --env PA_WORKSPACE=$HOME/.personal-assistant -- npx -y pacman mcp serve\\`\n- Tell the user to restart Codex after installing or updating the MCP registration\n`;\n}\nfunction buildClaudeSkillContent() {\n return `---\nname: pacman\ndescription: Start the Pac-Man workflow for a project using local or Google Drive context through MCP.\nargument-hint: start [project_name]\nallowed-tools: mcp__pacman__*\n---\n\n# Pac-Man Skill\n\nWhen this skill is invoked with \\`${CLAUDE_START_COMMAND}\\`:\n\n## Steps\n\n1. **Check MCP availability**:\n - If Pac-Man MCP tools are unavailable, stop and tell the user to install them with \\`pacman mcp claude install\\`\n - If the package is not installed globally, show the fallback command:\n \\`claude mcp add -s user --env=PA_WORKSPACE=$HOME/.personal-assistant ${MCP_SERVER_NAME} -- npx -y pacman mcp serve\\`\n - Tell the user to restart Claude Code after installing or updating the MCP registration\n\n2. **Check MCP health**:\n - Call \\`sync_status\\` before doing project selection\n - If the response shows an unhealthy storage backend, summarize the reason, fix steps, and restart steps, then stop\n - If the response shows failing integrations, warn the user that sync inputs may be stale and continue unless they want to troubleshoot first\n\n3. **Parse arguments**: Extract the project name from the command arguments.\n\n4. **Set active project**: If a project name is provided:\n - Call \\`config_set_active_project\\` with the project name\n - Call \\`project_get_context\\` to retrieve project-scoped context\n\n5. **Suggest project**: If no project name is provided:\n - Call \\`project_suggest\\` to get a suggested project\n - If one strong candidate exists (confidence > 0.7), suggest it to the user\n - If multiple candidates or low confidence, call \\`project_list\\` and ask the user to choose\n\n6. **Load context**: Once the project is set:\n - Read the project's canonical file from context/canonical/projects/\n - Read the latest daily summary from context/derived/daily/\n - Read the entities index for relevant people and services\n - Present a brief status summary to the user\n\n7. **Continue with MCP**: For all subsequent questions:\n - Use MCP tools to search and retrieve context\n - Answer only from retrieved context files\n - Propose updates when stable new facts emerge\n - State uncertainty when context is insufficient\n\n## Important rules\n\n- Never fabricate context that isn't in the retrieved files\n- Always use MCP tools for context operations\n- Propose updates rather than silently modifying canonical files\n- Respect the context hierarchy: canonical > derived > raw\n`;\n}\nfunction buildCodexSkillContent() {\n return `---\nname: pacman\ndescription: Use when the user asks to start, load, refresh, or inspect Pac-Man project context stored through the Pac-Man MCP workspace.\n---\n\n# Pac-Man\n\nUse this skill when the user asks to load or refresh Pac-Man context for a project.\n\n## Steps\n\n1. **Check MCP availability**:\n - If Pac-Man MCP tools are unavailable, stop and tell the user to install them with \\`pacman mcp codex install\\`\n - If the package is not installed globally, show the fallback command:\n \\`codex mcp add ${MCP_SERVER_NAME} --env PA_WORKSPACE=$HOME/.personal-assistant -- npx -y pacman mcp serve\\`\n - Tell the user to restart Codex after installing or updating the MCP registration\n\n2. **Check MCP health**:\n - Call \\`sync_status\\` before doing project selection\n - If the response shows an unhealthy storage backend, summarize the reason, fix steps, and restart steps, then stop\n - If the response shows failing integrations, warn the user that sync inputs may be stale and continue unless they want to troubleshoot first\n\n3. **Parse the project name**:\n - Extract the project name from the user's request if one is provided\n\n4. **Set or suggest the project**:\n - If a project name is provided, call \\`config_set_active_project\\` and then \\`project_get_context\\`\n - If no project name is provided, call \\`project_suggest\\`\n - If one strong candidate exists (confidence > 0.7), suggest it to the user\n - If multiple candidates or low confidence, call \\`project_list\\` and ask the user to choose\n\n5. **Load context**:\n - Read the project's canonical file from context/canonical/projects/\n - Read the latest daily summary from context/derived/daily/\n - Read the entities index for relevant people and services\n - Present a brief status summary to the user\n\n6. **Continue with MCP**:\n - Use MCP tools to search and retrieve context\n - Answer only from retrieved context files\n - Propose updates when stable new facts emerge\n - State uncertainty when context is insufficient\n\n## Important rules\n\n- Never fabricate context that isn't in the retrieved files\n- Always use MCP tools for context operations\n- Propose updates rather than silently modifying canonical files\n- Respect the context hierarchy: canonical > derived > raw\n`;\n}\nexport {\n buildClaudeProjectMemory,\n buildClaudeSkillContent,\n buildCodexProjectGuidance,\n buildCodexSkillContent\n};\n","// src/index.ts\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n buildCodexProjectGuidance,\n buildCodexSkillContent\n} from \"@personal-assistant/client-guidance\";\nasync function installCodex(options) {\n const { projectPath, config } = options;\n await Promise.all([\n generateAgentsMd(projectPath, config),\n generateGlobalSkill()\n ]);\n}\nasync function generateAgentsMd(projectPath, config) {\n await fs.mkdir(projectPath, { recursive: true });\n await fs.writeFile(\n path.join(projectPath, \"AGENTS.md\"),\n buildCodexProjectGuidance(config),\n \"utf-8\"\n );\n}\nasync function generateGlobalSkill() {\n const skillsRoot = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? \"~\",\n \".codex\",\n \"skills\"\n );\n const legacySkillDir = path.join(skillsRoot, \"personal-assistant\");\n const globalSkillDir = path.join(skillsRoot, \"pacman\");\n await fs.rm(legacySkillDir, { recursive: true, force: true });\n await fs.mkdir(globalSkillDir, { recursive: true });\n await fs.writeFile(\n path.join(globalSkillDir, \"SKILL.md\"),\n buildCodexSkillContent(),\n \"utf-8\"\n );\n}\nexport {\n installCodex\n};\n"],"mappings":"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","names":["path","fs","fs","path","generateGlobalSkill"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../../claude-installer/dist/index.js","../../client-guidance/dist/index.js","../../codex-installer/dist/index.js"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\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 { renderTemplate, getTemplate } from '@personal-assistant/template-engine';\nimport { installClaude } from '@personal-assistant/claude-installer';\nimport { installCodex } from '@personal-assistant/codex-installer';\nimport { createNoopEventClient } from '@personal-assistant/event-client';\nimport type { StorageBackend, GDriveStorageConfig } from '@personal-assistant/core-types';\nimport {\n installClaudeMcp,\n installCodexMcp,\n resolvePacmanServerCommand,\n} from './mcp-installers.js';\nimport { startMcpServer } from './mcp-server.js';\n\n// Resolve workspace path: the pointer file written during `init` always wins\n// so all commands automatically find the configured workspace without --dir.\n// Pass an explicit absolute path via --dir to override (e.g. for multi-workspace setups).\nasync function resolveWorkspacePath(dirOpt: string): Promise<string> {\n const rcPath = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? '~',\n '.personal-assistant-rc.json',\n );\n try {\n const rc = JSON.parse(await fs.readFile(rcPath, 'utf-8')) as { workspacePath?: string };\n if (rc.workspacePath) return rc.workspacePath;\n } catch {\n // no pointer yet — fall through to explicit path\n }\n return path.resolve(dirOpt);\n}\n\nconst program = new Command();\n\nprogram\n .name('pacman')\n .description('Claude Code and Codex compatible, file-backed personal context manager')\n .version('0.1.5');\n\n// ---- init command ----\nprogram\n .command('init')\n .description('Initialize Pac-Man and open onboarding UI')\n .option('-p, --port <port>', 'Port for onboarding server', '3847')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = path.resolve(opts.dir);\n const port = parseInt(opts.port, 10);\n\n console.log(`Initializing Pac-Man workspace at ${workspacePath}...`);\n\n // Create workspace directory\n await fs.mkdir(workspacePath, { recursive: true });\n\n // Initialize storage and context\n const storage = createLocalStorage(workspacePath);\n const contextManager = createContextManager(storage);\n await contextManager.initWorkspace();\n\n console.log('Workspace initialized. Starting onboarding server...');\n\n // Start onboarding server\n const { startOnboardingServer } = await import('./onboarding-server.js');\n await startOnboardingServer(port, workspacePath);\n });\n\n// ---- daemon command ----\nprogram\n .command('daemon')\n .description('Start the sync daemon')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log(`Starting daemon with workspace at ${workspacePath}...`);\n\n const { startDaemon } = await import('./daemon.js');\n await startDaemon(workspacePath);\n });\n\n// ---- slack command ----\nprogram\n .command('slack')\n .description('Slack runtime management')\n .command('listen')\n .description('Start the real-time Slack listener')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log(`Starting Slack listener with workspace at ${workspacePath}...`);\n\n const { startSlackListener } = await import('./slack-listener.js');\n await startSlackListener(workspacePath);\n });\n\n// ---- claude install command ----\nprogram\n .command('claude')\n .description('Claude integration management')\n .command('install')\n .description('Install Claude Code integration (CLAUDE.md, settings, skill)')\n .option('-d, --dir <dir>', 'Project directory', '.')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const projectPath = path.resolve(opts.dir);\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n console.log('Installing Claude Code integration...');\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n let config;\n try {\n config = await configManager.loadConfig();\n } catch {\n console.error(\n 'Error: No configuration found. Run `pacman init` first.',\n );\n process.exit(1);\n }\n\n await installClaude({\n projectPath,\n workspacePath,\n config,\n });\n\n console.log('Claude Code integration installed:');\n console.log(` - ${projectPath}/CLAUDE.md`);\n console.log(` - ~/.claude/skills/pacman/SKILL.md`);\n console.log('');\n console.log('Next, register the MCP server with:');\n console.log(' pacman mcp claude install');\n console.log('');\n console.log('Restart Claude Code after the MCP install, then use:');\n console.log(' /pacman start <project_name>');\n });\n\n// ---- codex install command ----\nprogram\n .command('codex')\n .description('Codex integration management')\n .command('install')\n .description('Install Codex integration (AGENTS.md, skill)')\n .option('-d, --dir <dir>', 'Project directory', '.')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const projectPath = path.resolve(opts.dir);\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n console.log('Installing Codex integration...');\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n let config;\n try {\n config = await configManager.loadConfig();\n } catch {\n console.error(\n 'Error: No configuration found. Run `pacman init` first.',\n );\n process.exit(1);\n }\n\n await installCodex({\n projectPath,\n workspacePath,\n config,\n });\n\n console.log('Codex integration installed:');\n console.log(` - ${projectPath}/AGENTS.md`);\n console.log(` - ~/.codex/skills/pacman/SKILL.md`);\n console.log('');\n console.log('Next, register the MCP server with:');\n console.log(' pacman mcp codex install');\n console.log('');\n console.log('Restart Codex after the MCP install, then ask it to load or refresh');\n console.log('your Pac-Man context for a project.');\n });\n\n// ---- mcp command ----\nconst mcpCommand = program\n .command('mcp')\n .description('MCP server management');\n\nmcpCommand\n .command('serve')\n .description('Start the Pac-Man MCP server over stdio')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n await startMcpServer(workspacePath);\n });\n\nmcpCommand\n .command('claude')\n .description('Claude MCP integration management')\n .command('install')\n .description('Register the Pac-Man MCP server with Claude Code')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n await installClaudeMcp(workspacePath, resolvePacmanServerCommand);\n\n console.log('Claude MCP registration installed:');\n console.log(' - managed by Claude Code CLI');\n console.log(` - PA_WORKSPACE=${workspacePath}`);\n console.log('');\n console.log('Restart Claude Code to reload the Pac-Man MCP server.');\n });\n\nmcpCommand\n .command('codex')\n .description('Codex MCP integration management')\n .command('install')\n .description('Register the Pac-Man MCP server with Codex')\n .option('-w, --workspace <workspace>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.workspace);\n\n await installCodexMcp(workspacePath, resolvePacmanServerCommand);\n\n console.log('Codex MCP registration installed:');\n console.log(' - managed by Codex CLI');\n console.log(` - PA_WORKSPACE=${workspacePath}`);\n console.log('');\n console.log('Restart Codex to reload the Pac-Man MCP server.');\n });\n\n// ---- sync command ----\nprogram\n .command('sync')\n .description('Run a one-time sync')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n console.log('Running sync...');\n\n // Bootstrap: read config from local to determine storage backend\n const localStore = createLocalStorage(workspacePath);\n const bootConfigManager = createConfigManager(localStore);\n\n // Resolve storage — all operations use the user's chosen backend\n let resolvedStorage: StorageBackend = localStore;\n try {\n const config = await bootConfigManager.loadConfig();\n if (config.storage.mode === 'gdrive') {\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 }\n } catch {\n // Config not readable — continue with local storage\n }\n\n const indexer = createIndexer(resolvedStorage);\n await indexer.buildIndexes();\n\n console.log('Sync complete. Indexes rebuilt.');\n });\n\n// ---- status command ----\nprogram\n .command('status')\n .description('Show current configuration and status')\n .option('-d, --dir <dir>', 'Workspace directory', '.personal-assistant')\n .action(async (opts) => {\n const workspacePath = await resolveWorkspacePath(opts.dir);\n\n const storage = createLocalStorage(workspacePath);\n const configManager = createConfigManager(storage);\n\n try {\n const config = await configManager.loadConfig();\n console.log('Personal Assistant Status');\n console.log('========================');\n console.log(`Workspace: ${workspacePath}`);\n console.log(`User: ${config.user.name}`);\n console.log(`Assistant: ${config.user.assistantName}`);\n console.log(`Profile: ${config.user.profileType}`);\n console.log(`Storage: ${config.storage.mode}`);\n console.log(`Active Project: ${config.activeProject ?? 'none'}`);\n console.log(`Integrations: ${config.integrations.filter((i) => i.enabled).map((i) => i.type).join(', ') || 'none'}`);\n console.log(`Sync Time: ${config.sync.dailySyncTime} ${config.sync.timezone}`);\n console.log(`Slack Runtime: ${config.slackRuntime?.enabled ? `${config.slackRuntime.transport} (${config.slackRuntime.reviewMode})` : 'disabled'}`);\n } catch {\n console.log('No configuration found. Run `pacman init` first.');\n }\n });\n\nprogram.parse();\n","// src/index.ts\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n buildClaudeProjectMemory,\n buildClaudeSkillContent\n} from \"@personal-assistant/client-guidance\";\nasync function installClaude(options) {\n const { projectPath, config } = options;\n await Promise.all([\n generateClaudeMd(projectPath, config),\n generateGlobalSkill()\n ]);\n}\nasync function generateClaudeMd(projectPath, config) {\n await fs.mkdir(projectPath, { recursive: true });\n await fs.writeFile(path.join(projectPath, \"CLAUDE.md\"), buildClaudeProjectMemory(config), \"utf-8\");\n}\nasync function generateGlobalSkill() {\n const skillsRoot = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? \"~\",\n \".claude\",\n \"skills\"\n );\n const legacySkillDir = path.join(skillsRoot, \"personal-assistant\");\n const globalSkillDir = path.join(skillsRoot, \"pacman\");\n await fs.rm(legacySkillDir, { recursive: true, force: true });\n await fs.mkdir(globalSkillDir, { recursive: true });\n await fs.writeFile(path.join(globalSkillDir, \"SKILL.md\"), buildClaudeSkillContent(), \"utf-8\");\n}\nexport {\n installClaude\n};\n","// src/index.ts\nvar TOOL_GROUPS = [\n \"- Config: `config_get`, `config_get_storage_mode`, `config_get_active_project`, `config_set_active_project`\",\n \"- Projects: `project_list`, `project_suggest`, `project_get_context`\",\n \"- Read: `context_search`, `context_read_file`, `context_read_section`, `context_list_recent_updates`, `context_get_daily_summary`\",\n \"- Update: `context_propose_update`, `context_apply_update`, `context_append_note`, `context_rebuild_indexes`\",\n \"- Sync: `sync_run_now`, `sync_status`, `sync_list_integrations`\",\n \"- Events: `events_ping`\"\n];\nvar MCP_SERVER_NAME = \"pacman\";\nvar CLAUDE_START_COMMAND = \"/pacman start <project_name>\";\nfunction getStorageDescription(config) {\n return config.storage.mode === \"local\" ? `Local workspace at: ${config.storage.workspacePath}` : `Google Drive folder: ${config.storage.folderName} (ID: ${config.storage.folderId})`;\n}\nfunction buildSharedProjectSections(config) {\n return `## Context source of truth\n\nAll context is stored in:\n- ${getStorageDescription(config)}\n\nDo not assume any cloud database exists. Never store raw context outside user-controlled storage.\n\n## Context structure\n\nRead context in this order:\n1. context/canonical/ - long-lived, human-readable context (role, projects, stakeholders)\n2. context/derived/daily/ - machine-generated daily summaries\n3. context/derived/indexes/entities.json - extracted entities index\n4. context/raw/ - only when deeper detail is needed from integration data\n\n## Retrieval rule\n\nWhen the user asks about responsibilities, projects, stakeholders, status, history, routines, or prior decisions:\n- Call the Pac-Man MCP tools first\n- Use \\`context_search\\` to find relevant files\n- Use \\`context_read_file\\` or \\`context_read_section\\` for specific content\n- Answer only from retrieved context files\n- State uncertainty if context is missing or insufficient\n\n## Update rule\n\nWhen the conversation creates stable new context (new ownership, priority changes, new contacts):\n- Call \\`context_propose_update\\` with the target file, section, proposed content, and reason\n- If the auto-apply policy allows, call \\`context_apply_update\\`\n- Never silently mutate canonical context without proposing first\n\n## Project rule\n\n- If an active project is set, prefer project-specific files from context/canonical/projects/\n- If no project is set, call \\`project_suggest\\` to infer likely project\n- If multiple candidates exist, ask the user to confirm\n- Use \\`config_set_active_project\\` to set the active project\n\n## MCP usage\n\nThis project uses the Pac-Man MCP server. All context operations go through MCP tools:\n${TOOL_GROUPS.join(\"\\n\")}\n\n## User profile\n\n- Name: ${config.user.name}\n- Assistant name: ${config.user.assistantName}\n- Profile: ${config.user.profileType}\n`;\n}\nfunction buildClaudeProjectMemory(config) {\n return `# Pac-Man Project Rules\n\nThis project uses a local or Google Drive based context manager.\n\n${buildSharedProjectSections(config)}`;\n}\nfunction buildCodexProjectGuidance(config) {\n return `# Pac-Man Project Instructions\n\nThis repository uses a local or Google Drive based context manager.\n\n${buildSharedProjectSections(config)}\n\n## Codex startup rule\n\n- If Pac-Man MCP tools are unavailable, tell the user to run \\`pacman mcp codex install\\`\n- If the package is not installed globally, show the fallback command:\n \\`codex mcp add ${MCP_SERVER_NAME} --env PA_WORKSPACE=$HOME/.personal-assistant -- npx -y pacman mcp serve\\`\n- Tell the user to restart Codex after installing or updating the MCP registration\n`;\n}\nfunction buildClaudeSkillContent() {\n return `---\nname: pacman\ndescription: Start the Pac-Man workflow for a project using local or Google Drive context through MCP.\nargument-hint: start [project_name]\nallowed-tools: mcp__pacman__*\n---\n\n# Pac-Man Skill\n\nWhen this skill is invoked with \\`${CLAUDE_START_COMMAND}\\`:\n\n## Steps\n\n1. **Check MCP availability**:\n - If Pac-Man MCP tools are unavailable, stop and tell the user to install them with \\`pacman mcp claude install\\`\n - If the package is not installed globally, show the fallback command:\n \\`claude mcp add -s user --env=PA_WORKSPACE=$HOME/.personal-assistant ${MCP_SERVER_NAME} -- npx -y pacman mcp serve\\`\n - Tell the user to restart Claude Code after installing or updating the MCP registration\n\n2. **Check MCP health**:\n - Call \\`sync_status\\` before doing project selection\n - If the response shows an unhealthy storage backend, summarize the reason, fix steps, and restart steps, then stop\n - If the response shows failing integrations, warn the user that sync inputs may be stale and continue unless they want to troubleshoot first\n\n3. **Parse arguments**: Extract the project name from the command arguments.\n\n4. **Set active project**: If a project name is provided:\n - Call \\`config_set_active_project\\` with the project name\n - Call \\`project_get_context\\` to retrieve project-scoped context\n\n5. **Suggest project**: If no project name is provided:\n - Call \\`project_suggest\\` to get a suggested project\n - If one strong candidate exists (confidence > 0.7), suggest it to the user\n - If multiple candidates or low confidence, call \\`project_list\\` and ask the user to choose\n\n6. **Load context**: Once the project is set:\n - Read the project's canonical file from context/canonical/projects/\n - Read the latest daily summary from context/derived/daily/\n - Read the entities index for relevant people and services\n - Present a brief status summary to the user\n\n7. **Continue with MCP**: For all subsequent questions:\n - Use MCP tools to search and retrieve context\n - Answer only from retrieved context files\n - Propose updates when stable new facts emerge\n - State uncertainty when context is insufficient\n\n## Important rules\n\n- Never fabricate context that isn't in the retrieved files\n- Always use MCP tools for context operations\n- Propose updates rather than silently modifying canonical files\n- Respect the context hierarchy: canonical > derived > raw\n`;\n}\nfunction buildCodexSkillContent() {\n return `---\nname: pacman\ndescription: Use when the user asks to start, load, refresh, or inspect Pac-Man project context stored through the Pac-Man MCP workspace.\n---\n\n# Pac-Man\n\nUse this skill when the user asks to load or refresh Pac-Man context for a project.\n\n## Steps\n\n1. **Check MCP availability**:\n - If Pac-Man MCP tools are unavailable, stop and tell the user to install them with \\`pacman mcp codex install\\`\n - If the package is not installed globally, show the fallback command:\n \\`codex mcp add ${MCP_SERVER_NAME} --env PA_WORKSPACE=$HOME/.personal-assistant -- npx -y pacman mcp serve\\`\n - Tell the user to restart Codex after installing or updating the MCP registration\n\n2. **Check MCP health**:\n - Call \\`sync_status\\` before doing project selection\n - If the response shows an unhealthy storage backend, summarize the reason, fix steps, and restart steps, then stop\n - If the response shows failing integrations, warn the user that sync inputs may be stale and continue unless they want to troubleshoot first\n\n3. **Parse the project name**:\n - Extract the project name from the user's request if one is provided\n\n4. **Set or suggest the project**:\n - If a project name is provided, call \\`config_set_active_project\\` and then \\`project_get_context\\`\n - If no project name is provided, call \\`project_suggest\\`\n - If one strong candidate exists (confidence > 0.7), suggest it to the user\n - If multiple candidates or low confidence, call \\`project_list\\` and ask the user to choose\n\n5. **Load context**:\n - Read the project's canonical file from context/canonical/projects/\n - Read the latest daily summary from context/derived/daily/\n - Read the entities index for relevant people and services\n - Present a brief status summary to the user\n\n6. **Continue with MCP**:\n - Use MCP tools to search and retrieve context\n - Answer only from retrieved context files\n - Propose updates when stable new facts emerge\n - State uncertainty when context is insufficient\n\n## Important rules\n\n- Never fabricate context that isn't in the retrieved files\n- Always use MCP tools for context operations\n- Propose updates rather than silently modifying canonical files\n- Respect the context hierarchy: canonical > derived > raw\n`;\n}\nexport {\n buildClaudeProjectMemory,\n buildClaudeSkillContent,\n buildCodexProjectGuidance,\n buildCodexSkillContent\n};\n","// src/index.ts\nimport * as fs from \"fs/promises\";\nimport * as path from \"path\";\nimport {\n buildCodexProjectGuidance,\n buildCodexSkillContent\n} from \"@personal-assistant/client-guidance\";\nasync function installCodex(options) {\n const { projectPath, config } = options;\n await Promise.all([\n generateAgentsMd(projectPath, config),\n generateGlobalSkill()\n ]);\n}\nasync function generateAgentsMd(projectPath, config) {\n await fs.mkdir(projectPath, { recursive: true });\n await fs.writeFile(\n path.join(projectPath, \"AGENTS.md\"),\n buildCodexProjectGuidance(config),\n \"utf-8\"\n );\n}\nasync function generateGlobalSkill() {\n const skillsRoot = path.join(\n process.env.HOME ?? process.env.USERPROFILE ?? \"~\",\n \".codex\",\n \"skills\"\n );\n const legacySkillDir = path.join(skillsRoot, \"personal-assistant\");\n const globalSkillDir = path.join(skillsRoot, \"pacman\");\n await fs.rm(legacySkillDir, { recursive: true, force: true });\n await fs.mkdir(globalSkillDir, { recursive: true });\n await fs.writeFile(\n path.join(globalSkillDir, \"SKILL.md\"),\n buildCodexSkillContent(),\n \"utf-8\"\n );\n}\nexport {\n installCodex\n};\n"],"mappings":"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","names":["path","fs","fs","path","generateGlobalSkill"]}
|
package/dist/mcp-compat.js
CHANGED
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
resolveCompatServerCommand,
|
|
7
7
|
resolveWorkspacePath,
|
|
8
8
|
startMcpServer
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-S5ZLV5QT.js";
|
|
10
10
|
import "./chunk-3QNXXON5.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-LKKDJ5A7.js";
|
|
12
12
|
import "./chunk-UWT6AFJB.js";
|
|
13
13
|
import "./chunk-TRQIZP6Z.js";
|
|
14
14
|
|