@jsayubi/ccgram 1.0.0
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/.env.example +19 -0
- package/LICENSE +21 -0
- package/README.md +338 -0
- package/ccgram.service +24 -0
- package/config/channels.json +58 -0
- package/config/default.json +27 -0
- package/config/defaults/config.json +16 -0
- package/config/defaults/i18n.json +32 -0
- package/config/email-template.json +31 -0
- package/config/test-with-subagent.json +16 -0
- package/config/user.json +27 -0
- package/dist/claude-hook-notify.d.ts +7 -0
- package/dist/claude-hook-notify.d.ts.map +1 -0
- package/dist/claude-hook-notify.js +154 -0
- package/dist/claude-hook-notify.js.map +1 -0
- package/dist/claude-remote.d.ts +50 -0
- package/dist/claude-remote.d.ts.map +1 -0
- package/dist/claude-remote.js +927 -0
- package/dist/claude-remote.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +110 -0
- package/dist/cli.js.map +1 -0
- package/dist/enhanced-hook-notify.d.ts +16 -0
- package/dist/enhanced-hook-notify.d.ts.map +1 -0
- package/dist/enhanced-hook-notify.js +288 -0
- package/dist/enhanced-hook-notify.js.map +1 -0
- package/dist/permission-hook.d.ts +15 -0
- package/dist/permission-hook.d.ts.map +1 -0
- package/dist/permission-hook.js +357 -0
- package/dist/permission-hook.js.map +1 -0
- package/dist/prompt-bridge.d.ts +50 -0
- package/dist/prompt-bridge.d.ts.map +1 -0
- package/dist/prompt-bridge.js +173 -0
- package/dist/prompt-bridge.js.map +1 -0
- package/dist/question-notify.d.ts +16 -0
- package/dist/question-notify.d.ts.map +1 -0
- package/dist/question-notify.js +272 -0
- package/dist/question-notify.js.map +1 -0
- package/dist/setup.d.ts +10 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +649 -0
- package/dist/setup.js.map +1 -0
- package/dist/smart-monitor.d.ts +7 -0
- package/dist/smart-monitor.d.ts.map +1 -0
- package/dist/smart-monitor.js +256 -0
- package/dist/smart-monitor.js.map +1 -0
- package/dist/src/automation/claude-automation.d.ts +45 -0
- package/dist/src/automation/claude-automation.d.ts.map +1 -0
- package/dist/src/automation/claude-automation.js +367 -0
- package/dist/src/automation/claude-automation.js.map +1 -0
- package/dist/src/automation/clipboard-automation.d.ts +35 -0
- package/dist/src/automation/clipboard-automation.d.ts.map +1 -0
- package/dist/src/automation/clipboard-automation.js +242 -0
- package/dist/src/automation/clipboard-automation.js.map +1 -0
- package/dist/src/automation/simple-automation.d.ts +56 -0
- package/dist/src/automation/simple-automation.d.ts.map +1 -0
- package/dist/src/automation/simple-automation.js +283 -0
- package/dist/src/automation/simple-automation.js.map +1 -0
- package/dist/src/channels/base/channel.d.ts +60 -0
- package/dist/src/channels/base/channel.d.ts.map +1 -0
- package/dist/src/channels/base/channel.js +96 -0
- package/dist/src/channels/base/channel.js.map +1 -0
- package/dist/src/channels/email/smtp.d.ts +74 -0
- package/dist/src/channels/email/smtp.d.ts.map +1 -0
- package/dist/src/channels/email/smtp.js +605 -0
- package/dist/src/channels/email/smtp.js.map +1 -0
- package/dist/src/channels/line/line.d.ts +36 -0
- package/dist/src/channels/line/line.d.ts.map +1 -0
- package/dist/src/channels/line/line.js +180 -0
- package/dist/src/channels/line/line.js.map +1 -0
- package/dist/src/channels/line/webhook.d.ts +55 -0
- package/dist/src/channels/line/webhook.d.ts.map +1 -0
- package/dist/src/channels/line/webhook.js +191 -0
- package/dist/src/channels/line/webhook.js.map +1 -0
- package/dist/src/channels/local/desktop.d.ts +30 -0
- package/dist/src/channels/local/desktop.d.ts.map +1 -0
- package/dist/src/channels/local/desktop.js +161 -0
- package/dist/src/channels/local/desktop.js.map +1 -0
- package/dist/src/channels/telegram/telegram.d.ts +43 -0
- package/dist/src/channels/telegram/telegram.d.ts.map +1 -0
- package/dist/src/channels/telegram/telegram.js +223 -0
- package/dist/src/channels/telegram/telegram.js.map +1 -0
- package/dist/src/channels/telegram/webhook.d.ts +75 -0
- package/dist/src/channels/telegram/webhook.d.ts.map +1 -0
- package/dist/src/channels/telegram/webhook.js +278 -0
- package/dist/src/channels/telegram/webhook.js.map +1 -0
- package/dist/src/config-manager.d.ts +16 -0
- package/dist/src/config-manager.d.ts.map +1 -0
- package/dist/src/config-manager.js +152 -0
- package/dist/src/config-manager.js.map +1 -0
- package/dist/src/core/config.d.ts +28 -0
- package/dist/src/core/config.d.ts.map +1 -0
- package/dist/src/core/config.js +248 -0
- package/dist/src/core/config.js.map +1 -0
- package/dist/src/core/logger.d.ts +19 -0
- package/dist/src/core/logger.d.ts.map +1 -0
- package/dist/src/core/logger.js +47 -0
- package/dist/src/core/logger.js.map +1 -0
- package/dist/src/core/notifier.d.ts +45 -0
- package/dist/src/core/notifier.d.ts.map +1 -0
- package/dist/src/core/notifier.js +189 -0
- package/dist/src/core/notifier.js.map +1 -0
- package/dist/src/daemon/taskping-daemon.d.ts +38 -0
- package/dist/src/daemon/taskping-daemon.d.ts.map +1 -0
- package/dist/src/daemon/taskping-daemon.js +306 -0
- package/dist/src/daemon/taskping-daemon.js.map +1 -0
- package/dist/src/relay/claude-command-bridge.d.ts +57 -0
- package/dist/src/relay/claude-command-bridge.d.ts.map +1 -0
- package/dist/src/relay/claude-command-bridge.js +188 -0
- package/dist/src/relay/claude-command-bridge.js.map +1 -0
- package/dist/src/relay/command-relay.d.ts +94 -0
- package/dist/src/relay/command-relay.d.ts.map +1 -0
- package/dist/src/relay/command-relay.js +463 -0
- package/dist/src/relay/command-relay.js.map +1 -0
- package/dist/src/relay/email-listener.d.ts +65 -0
- package/dist/src/relay/email-listener.d.ts.map +1 -0
- package/dist/src/relay/email-listener.js +460 -0
- package/dist/src/relay/email-listener.js.map +1 -0
- package/dist/src/relay/relay-pty.d.ts +21 -0
- package/dist/src/relay/relay-pty.d.ts.map +1 -0
- package/dist/src/relay/relay-pty.js +696 -0
- package/dist/src/relay/relay-pty.js.map +1 -0
- package/dist/src/relay/smart-injector.d.ts +30 -0
- package/dist/src/relay/smart-injector.d.ts.map +1 -0
- package/dist/src/relay/smart-injector.js +233 -0
- package/dist/src/relay/smart-injector.js.map +1 -0
- package/dist/src/relay/tmux-injector.d.ts +46 -0
- package/dist/src/relay/tmux-injector.d.ts.map +1 -0
- package/dist/src/relay/tmux-injector.js +413 -0
- package/dist/src/relay/tmux-injector.js.map +1 -0
- package/dist/src/tools/config-manager.d.ts +33 -0
- package/dist/src/tools/config-manager.d.ts.map +1 -0
- package/dist/src/tools/config-manager.js +448 -0
- package/dist/src/tools/config-manager.js.map +1 -0
- package/dist/src/tools/installer.d.ts +38 -0
- package/dist/src/tools/installer.d.ts.map +1 -0
- package/dist/src/tools/installer.js +222 -0
- package/dist/src/tools/installer.js.map +1 -0
- package/dist/src/types/callbacks.d.ts +29 -0
- package/dist/src/types/callbacks.d.ts.map +1 -0
- package/dist/src/types/callbacks.js +7 -0
- package/dist/src/types/callbacks.js.map +1 -0
- package/dist/src/types/config.d.ts +56 -0
- package/dist/src/types/config.d.ts.map +1 -0
- package/dist/src/types/config.js +6 -0
- package/dist/src/types/config.js.map +1 -0
- package/dist/src/types/hooks.d.ts +47 -0
- package/dist/src/types/hooks.d.ts.map +1 -0
- package/dist/src/types/hooks.js +6 -0
- package/dist/src/types/hooks.js.map +1 -0
- package/dist/src/types/index.d.ts +7 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +23 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/ipc.d.ts +43 -0
- package/dist/src/types/ipc.d.ts.map +1 -0
- package/dist/src/types/ipc.js +7 -0
- package/dist/src/types/ipc.js.map +1 -0
- package/dist/src/types/session.d.ts +70 -0
- package/dist/src/types/session.d.ts.map +1 -0
- package/dist/src/types/session.js +9 -0
- package/dist/src/types/session.js.map +1 -0
- package/dist/src/types/telegram.d.ts +58 -0
- package/dist/src/types/telegram.d.ts.map +1 -0
- package/dist/src/types/telegram.js +6 -0
- package/dist/src/types/telegram.js.map +1 -0
- package/dist/src/utils/active-check.d.ts +19 -0
- package/dist/src/utils/active-check.d.ts.map +1 -0
- package/dist/src/utils/active-check.js +41 -0
- package/dist/src/utils/active-check.js.map +1 -0
- package/dist/src/utils/callback-parser.d.ts +21 -0
- package/dist/src/utils/callback-parser.d.ts.map +1 -0
- package/dist/src/utils/callback-parser.js +58 -0
- package/dist/src/utils/callback-parser.js.map +1 -0
- package/dist/src/utils/controller-injector.d.ts +21 -0
- package/dist/src/utils/controller-injector.d.ts.map +1 -0
- package/dist/src/utils/controller-injector.js +108 -0
- package/dist/src/utils/controller-injector.js.map +1 -0
- package/dist/src/utils/conversation-tracker.d.ts +32 -0
- package/dist/src/utils/conversation-tracker.d.ts.map +1 -0
- package/dist/src/utils/conversation-tracker.js +119 -0
- package/dist/src/utils/conversation-tracker.js.map +1 -0
- package/dist/src/utils/http-request.d.ts +25 -0
- package/dist/src/utils/http-request.d.ts.map +1 -0
- package/dist/src/utils/http-request.js +66 -0
- package/dist/src/utils/http-request.js.map +1 -0
- package/dist/src/utils/optional-require.d.ts +13 -0
- package/dist/src/utils/optional-require.d.ts.map +1 -0
- package/dist/src/utils/optional-require.js +37 -0
- package/dist/src/utils/optional-require.js.map +1 -0
- package/dist/src/utils/paths.d.ts +11 -0
- package/dist/src/utils/paths.d.ts.map +1 -0
- package/dist/src/utils/paths.js +28 -0
- package/dist/src/utils/paths.js.map +1 -0
- package/dist/src/utils/pty-session-manager.d.ts +42 -0
- package/dist/src/utils/pty-session-manager.d.ts.map +1 -0
- package/dist/src/utils/pty-session-manager.js +182 -0
- package/dist/src/utils/pty-session-manager.js.map +1 -0
- package/dist/src/utils/subagent-tracker.d.ts +64 -0
- package/dist/src/utils/subagent-tracker.d.ts.map +1 -0
- package/dist/src/utils/subagent-tracker.js +191 -0
- package/dist/src/utils/subagent-tracker.js.map +1 -0
- package/dist/src/utils/tmux-monitor.d.ts +102 -0
- package/dist/src/utils/tmux-monitor.d.ts.map +1 -0
- package/dist/src/utils/tmux-monitor.js +642 -0
- package/dist/src/utils/tmux-monitor.js.map +1 -0
- package/dist/src/utils/trace-capture.d.ts +42 -0
- package/dist/src/utils/trace-capture.d.ts.map +1 -0
- package/dist/src/utils/trace-capture.js +102 -0
- package/dist/src/utils/trace-capture.js.map +1 -0
- package/dist/start-all-webhooks.d.ts +7 -0
- package/dist/start-all-webhooks.d.ts.map +1 -0
- package/dist/start-all-webhooks.js +98 -0
- package/dist/start-all-webhooks.js.map +1 -0
- package/dist/start-line-webhook.d.ts +7 -0
- package/dist/start-line-webhook.d.ts.map +1 -0
- package/dist/start-line-webhook.js +59 -0
- package/dist/start-line-webhook.js.map +1 -0
- package/dist/start-relay-pty.d.ts +7 -0
- package/dist/start-relay-pty.d.ts.map +1 -0
- package/dist/start-relay-pty.js +173 -0
- package/dist/start-relay-pty.js.map +1 -0
- package/dist/start-telegram-webhook.d.ts +7 -0
- package/dist/start-telegram-webhook.d.ts.map +1 -0
- package/dist/start-telegram-webhook.js +80 -0
- package/dist/start-telegram-webhook.js.map +1 -0
- package/dist/user-prompt-hook.d.ts +13 -0
- package/dist/user-prompt-hook.d.ts.map +1 -0
- package/dist/user-prompt-hook.js +45 -0
- package/dist/user-prompt-hook.js.map +1 -0
- package/dist/workspace-router.d.ts +78 -0
- package/dist/workspace-router.d.ts.map +1 -0
- package/dist/workspace-router.js +408 -0
- package/dist/workspace-router.js.map +1 -0
- package/dist/workspace-telegram-bot.d.ts +3 -0
- package/dist/workspace-telegram-bot.d.ts.map +1 -0
- package/dist/workspace-telegram-bot.js +1172 -0
- package/dist/workspace-telegram-bot.js.map +1 -0
- package/package.json +80 -0
- package/src/types/callbacks.ts +39 -0
- package/src/types/config.ts +63 -0
- package/src/types/hooks.ts +50 -0
- package/src/types/index.ts +6 -0
- package/src/types/ipc.ts +55 -0
- package/src/types/session.ts +72 -0
- package/src/types/telegram.ts +66 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start-telegram-webhook.js","sourceRoot":"","sources":["../start-telegram-webhook.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
|
|
4
|
+
*
|
|
5
|
+
* Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
|
|
6
|
+
* active-check.ts can detect when the user is actively working at the terminal
|
|
7
|
+
* and suppress redundant Telegram notifications.
|
|
8
|
+
*
|
|
9
|
+
* Must be fast — registered with timeout: 2 in settings.json.
|
|
10
|
+
* No stdout output. No Telegram calls.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=user-prompt-hook.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-hook.d.ts","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";AAEA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* UserPromptSubmit hook — called by Claude Code whenever the user submits a prompt.
|
|
5
|
+
*
|
|
6
|
+
* Writes the current Unix timestamp to /tmp/claude_last_msg_time so that
|
|
7
|
+
* active-check.ts can detect when the user is actively working at the terminal
|
|
8
|
+
* and suppress redundant Telegram notifications.
|
|
9
|
+
*
|
|
10
|
+
* Must be fast — registered with timeout: 2 in settings.json.
|
|
11
|
+
* No stdout output. No Telegram calls.
|
|
12
|
+
*/
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const path_1 = __importDefault(require("path"));
|
|
18
|
+
const paths_1 = require("./src/utils/paths");
|
|
19
|
+
require('dotenv').config({ path: path_1.default.join(paths_1.PROJECT_ROOT, '.env'), quiet: true });
|
|
20
|
+
const fs_1 = __importDefault(require("fs"));
|
|
21
|
+
const LAST_MSG_FILE = '/tmp/claude_last_msg_time';
|
|
22
|
+
// Write current Unix timestamp immediately
|
|
23
|
+
try {
|
|
24
|
+
fs_1.default.writeFileSync(LAST_MSG_FILE, String(Math.floor(Date.now() / 1000)));
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Non-fatal — active-check will just assume user is inactive
|
|
28
|
+
}
|
|
29
|
+
// Drain stdin using the standard hook pattern (data not needed)
|
|
30
|
+
let resolved = false;
|
|
31
|
+
process.stdin.setEncoding('utf8');
|
|
32
|
+
process.stdin.on('data', () => { });
|
|
33
|
+
process.stdin.on('end', () => {
|
|
34
|
+
if (!resolved) {
|
|
35
|
+
resolved = true;
|
|
36
|
+
process.stdin.destroy();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
setTimeout(() => {
|
|
40
|
+
if (!resolved) {
|
|
41
|
+
resolved = true;
|
|
42
|
+
process.stdin.destroy();
|
|
43
|
+
}
|
|
44
|
+
}, 500);
|
|
45
|
+
//# sourceMappingURL=user-prompt-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-prompt-hook.js","sourceRoot":"","sources":["../user-prompt-hook.ts"],"names":[],"mappings":";;AAEA;;;;;;;;;GASG;;;;;AAEH,gDAAwB;AACxB,6CAAiD;AACjD,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,cAAI,CAAC,IAAI,CAAC,oBAAY,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AAEjF,4CAAoB;AAEpB,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAElD,2CAA2C;AAC3C,IAAI,CAAC;IACH,YAAE,CAAC,aAAa,CAAC,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAAC,MAAM,CAAC;IACP,6DAA6D;AAC/D,CAAC;AAED,gEAAgE;AAChE,IAAI,QAAQ,GAAG,KAAK,CAAC;AACrB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AAClC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AACnC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,CAAC,CAAC;AACH,UAAU,CAAC,GAAG,EAAE;IACd,IAAI,CAAC,QAAQ,EAAE,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC;QAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;IAAC,CAAC;AAC9D,CAAC,EAAE,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Workspace Router - Maps workspace names to Claude Code sessions.
|
|
4
|
+
*
|
|
5
|
+
* Reads the session map and resolves human-friendly project names
|
|
6
|
+
* (e.g. "wp-super-ai") to active tmux sessions so commands can be
|
|
7
|
+
* routed without memorising tokens.
|
|
8
|
+
*/
|
|
9
|
+
import type { SessionEntry, SessionMap, ResolveResult } from './src/types';
|
|
10
|
+
declare const SESSION_MAP_PATH: string;
|
|
11
|
+
/**
|
|
12
|
+
* Extract a short project name from a cwd path.
|
|
13
|
+
* "/home/user/projects/my-project" -> "my-project"
|
|
14
|
+
*/
|
|
15
|
+
declare function extractWorkspaceName(cwd: string | null): string | null;
|
|
16
|
+
/** Read the session map from disk. */
|
|
17
|
+
declare function readSessionMap(): SessionMap;
|
|
18
|
+
/** Write the session map to disk. */
|
|
19
|
+
declare function writeSessionMap(map: SessionMap): void;
|
|
20
|
+
/** Check whether a session has expired. */
|
|
21
|
+
declare function isExpired(session: SessionEntry | Record<string, unknown>): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Find the most recent non-expired session whose workspace name matches.
|
|
24
|
+
* Returns { token, session } or null.
|
|
25
|
+
*/
|
|
26
|
+
declare function findSessionByWorkspace(workspaceName: string): {
|
|
27
|
+
token: string;
|
|
28
|
+
session: SessionEntry;
|
|
29
|
+
} | null;
|
|
30
|
+
/**
|
|
31
|
+
* List all active (non-expired) sessions grouped by workspace.
|
|
32
|
+
* Returns an array of { workspace, token, session, age }.
|
|
33
|
+
*/
|
|
34
|
+
declare function listActiveSessions(): Array<{
|
|
35
|
+
workspace: string;
|
|
36
|
+
token: string;
|
|
37
|
+
session: SessionEntry;
|
|
38
|
+
age: string;
|
|
39
|
+
}>;
|
|
40
|
+
/**
|
|
41
|
+
* Register or update a session in the map.
|
|
42
|
+
* Called by the hook notifier when Claude starts/stops.
|
|
43
|
+
*/
|
|
44
|
+
declare function upsertSession({ cwd, tmuxSession, status, sessionId, sessionType }: {
|
|
45
|
+
cwd: string;
|
|
46
|
+
tmuxSession: string;
|
|
47
|
+
status: string;
|
|
48
|
+
sessionId?: string | null;
|
|
49
|
+
sessionType?: 'tmux' | 'pty';
|
|
50
|
+
}): {
|
|
51
|
+
token: string;
|
|
52
|
+
workspace: string | null;
|
|
53
|
+
};
|
|
54
|
+
/** Remove expired sessions from the map. */
|
|
55
|
+
declare function pruneExpired(): number;
|
|
56
|
+
/**
|
|
57
|
+
* Resolve a workspace name by exact match, then prefix match.
|
|
58
|
+
*/
|
|
59
|
+
declare function resolveWorkspace(name: string): ResolveResult;
|
|
60
|
+
declare function getDefaultWorkspace(): string | null;
|
|
61
|
+
declare function setDefaultWorkspace(name: string | null): void;
|
|
62
|
+
/**
|
|
63
|
+
* Track which Telegram message_id belongs to which workspace.
|
|
64
|
+
* Prunes entries older than 24 hours on each write.
|
|
65
|
+
*/
|
|
66
|
+
declare function trackNotificationMessage(messageId: number | string, workspace: string, type: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Look up which workspace a Telegram message belongs to.
|
|
69
|
+
* Returns the workspace name or null.
|
|
70
|
+
*/
|
|
71
|
+
declare function getWorkspaceForMessage(messageId: number | string | null | undefined): string | null;
|
|
72
|
+
declare function recordProjectUsage(name: string, projectPath: string): void;
|
|
73
|
+
declare function getRecentProjects(limit?: number): Array<{
|
|
74
|
+
name: string;
|
|
75
|
+
path: string;
|
|
76
|
+
}>;
|
|
77
|
+
export { extractWorkspaceName, readSessionMap, writeSessionMap, findSessionByWorkspace, resolveWorkspace, listActiveSessions, upsertSession, pruneExpired, isExpired, getDefaultWorkspace, setDefaultWorkspace, trackNotificationMessage, getWorkspaceForMessage, recordProjectUsage, getRecentProjects, SESSION_MAP_PATH, };
|
|
78
|
+
//# sourceMappingURL=workspace-router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-router.d.ts","sourceRoot":"","sources":["../workspace-router.ts"],"names":[],"mappings":";AAEA;;;;;;GAMG;AAQH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,aAAa,EAId,MAAM,aAAa,CAAC;AAKrB,QAAA,MAAM,gBAAgB,QACsB,CAAC;AAG7C;;;GAGG;AACH,iBAAS,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAG/D;AAED,sCAAsC;AACtC,iBAAS,cAAc,IAAI,UAAU,CAWpC;AAED,qCAAqC;AACrC,iBAAS,eAAe,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAM9C;AAED,2CAA2C;AAC3C,iBAAS,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAI3E;AAED;;;GAGG;AACH,iBAAS,sBAAsB,CAAC,aAAa,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAA;CAAE,GAAG,IAAI,CAgBtG;AAED;;;GAGG;AACH,iBAAS,kBAAkB,IAAI,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA+B7G;AAED;;;GAGG;AACH,iBAAS,aAAa,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;CAC9B,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAkC9C;AAED,4CAA4C;AAC5C,iBAAS,YAAY,IAAI,MAAM,CAa9B;AAoBD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CA2CrD;AAID,iBAAS,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAQ5C;AAED,iBAAS,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAWtD;AAuBD;;;GAGG;AACH,iBAAS,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAcnG;AAED;;;GAGG;AACH,iBAAS,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAO5F;AAYD,iBAAS,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAQnE;AAID,iBAAS,iBAAiB,CAAC,KAAK,GAAE,MAAW,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAuEpF;AAED,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,GACjB,CAAC"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* Workspace Router - Maps workspace names to Claude Code sessions.
|
|
5
|
+
*
|
|
6
|
+
* Reads the session map and resolves human-friendly project names
|
|
7
|
+
* (e.g. "wp-super-ai") to active tmux sessions so commands can be
|
|
8
|
+
* routed without memorising tokens.
|
|
9
|
+
*/
|
|
10
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
11
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
12
|
+
};
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.SESSION_MAP_PATH = void 0;
|
|
15
|
+
exports.extractWorkspaceName = extractWorkspaceName;
|
|
16
|
+
exports.readSessionMap = readSessionMap;
|
|
17
|
+
exports.writeSessionMap = writeSessionMap;
|
|
18
|
+
exports.findSessionByWorkspace = findSessionByWorkspace;
|
|
19
|
+
exports.resolveWorkspace = resolveWorkspace;
|
|
20
|
+
exports.listActiveSessions = listActiveSessions;
|
|
21
|
+
exports.upsertSession = upsertSession;
|
|
22
|
+
exports.pruneExpired = pruneExpired;
|
|
23
|
+
exports.isExpired = isExpired;
|
|
24
|
+
exports.getDefaultWorkspace = getDefaultWorkspace;
|
|
25
|
+
exports.setDefaultWorkspace = setDefaultWorkspace;
|
|
26
|
+
exports.trackNotificationMessage = trackNotificationMessage;
|
|
27
|
+
exports.getWorkspaceForMessage = getWorkspaceForMessage;
|
|
28
|
+
exports.recordProjectUsage = recordProjectUsage;
|
|
29
|
+
exports.getRecentProjects = getRecentProjects;
|
|
30
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
31
|
+
const fs_1 = __importDefault(require("fs"));
|
|
32
|
+
const path_1 = __importDefault(require("path"));
|
|
33
|
+
const paths_1 = require("./src/utils/paths");
|
|
34
|
+
require('dotenv').config({ path: path_1.default.join(paths_1.PROJECT_ROOT, '.env'), quiet: true });
|
|
35
|
+
const logger_1 = __importDefault(require("./src/core/logger"));
|
|
36
|
+
const logger = new logger_1.default('router');
|
|
37
|
+
const DATA_DIR = process.env.CCGRAM_DATA_DIR || path_1.default.join(paths_1.PROJECT_ROOT, 'src/data');
|
|
38
|
+
const SESSION_MAP_PATH = process.env.SESSION_MAP_PATH
|
|
39
|
+
|| path_1.default.join(DATA_DIR, 'session-map.json');
|
|
40
|
+
exports.SESSION_MAP_PATH = SESSION_MAP_PATH;
|
|
41
|
+
const SESSION_TIMEOUT_HOURS = parseInt(process.env.SESSION_TIMEOUT || '', 10) || 24;
|
|
42
|
+
/**
|
|
43
|
+
* Extract a short project name from a cwd path.
|
|
44
|
+
* "/home/user/projects/my-project" -> "my-project"
|
|
45
|
+
*/
|
|
46
|
+
function extractWorkspaceName(cwd) {
|
|
47
|
+
if (!cwd)
|
|
48
|
+
return null;
|
|
49
|
+
return path_1.default.basename(cwd);
|
|
50
|
+
}
|
|
51
|
+
/** Read the session map from disk. */
|
|
52
|
+
function readSessionMap() {
|
|
53
|
+
try {
|
|
54
|
+
const raw = fs_1.default.readFileSync(SESSION_MAP_PATH, 'utf8');
|
|
55
|
+
return JSON.parse(raw);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (err && typeof err === 'object' && 'code' in err && err.code === 'ENOENT') {
|
|
59
|
+
return {};
|
|
60
|
+
}
|
|
61
|
+
logger.error(`Failed to read session map: ${err.message}`);
|
|
62
|
+
return {};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/** Write the session map to disk. */
|
|
66
|
+
function writeSessionMap(map) {
|
|
67
|
+
const dir = path_1.default.dirname(SESSION_MAP_PATH);
|
|
68
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
69
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
70
|
+
}
|
|
71
|
+
fs_1.default.writeFileSync(SESSION_MAP_PATH, JSON.stringify(map, null, 2), 'utf8');
|
|
72
|
+
}
|
|
73
|
+
/** Check whether a session has expired. */
|
|
74
|
+
function isExpired(session) {
|
|
75
|
+
const now = Math.floor(Date.now() / 1000);
|
|
76
|
+
const expiresAt = session.expiresAt;
|
|
77
|
+
return !!(expiresAt && expiresAt < now);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Find the most recent non-expired session whose workspace name matches.
|
|
81
|
+
* Returns { token, session } or null.
|
|
82
|
+
*/
|
|
83
|
+
function findSessionByWorkspace(workspaceName) {
|
|
84
|
+
const map = readSessionMap();
|
|
85
|
+
let best = null;
|
|
86
|
+
for (const [token, session] of Object.entries(map)) {
|
|
87
|
+
if (isExpired(session))
|
|
88
|
+
continue;
|
|
89
|
+
const name = extractWorkspaceName(session.cwd);
|
|
90
|
+
if (name && name.toLowerCase() === workspaceName.toLowerCase()) {
|
|
91
|
+
if (!best || session.createdAt > best.session.createdAt) {
|
|
92
|
+
best = { token, session };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return best;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* List all active (non-expired) sessions grouped by workspace.
|
|
100
|
+
* Returns an array of { workspace, token, session, age }.
|
|
101
|
+
*/
|
|
102
|
+
function listActiveSessions() {
|
|
103
|
+
const map = readSessionMap();
|
|
104
|
+
const now = Math.floor(Date.now() / 1000);
|
|
105
|
+
const results = [];
|
|
106
|
+
// Keep only the most recent session per workspace
|
|
107
|
+
const byWorkspace = new Map();
|
|
108
|
+
for (const [token, session] of Object.entries(map)) {
|
|
109
|
+
if (isExpired(session))
|
|
110
|
+
continue;
|
|
111
|
+
const workspace = extractWorkspaceName(session.cwd) || 'unknown';
|
|
112
|
+
const existing = byWorkspace.get(workspace);
|
|
113
|
+
if (!existing || session.createdAt > existing.session.createdAt) {
|
|
114
|
+
byWorkspace.set(workspace, { token, session });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
for (const [workspace, { token, session }] of byWorkspace) {
|
|
118
|
+
const ageSec = now - session.createdAt;
|
|
119
|
+
results.push({
|
|
120
|
+
workspace,
|
|
121
|
+
token,
|
|
122
|
+
session,
|
|
123
|
+
age: formatAge(ageSec),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
// Sort newest first
|
|
127
|
+
results.sort((a, b) => b.session.createdAt - a.session.createdAt);
|
|
128
|
+
return results;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Register or update a session in the map.
|
|
132
|
+
* Called by the hook notifier when Claude starts/stops.
|
|
133
|
+
*/
|
|
134
|
+
function upsertSession({ cwd, tmuxSession, status, sessionId, sessionType }) {
|
|
135
|
+
const map = readSessionMap();
|
|
136
|
+
const workspace = extractWorkspaceName(cwd);
|
|
137
|
+
const now = Math.floor(Date.now() / 1000);
|
|
138
|
+
const expiresAt = now + SESSION_TIMEOUT_HOURS * 3600;
|
|
139
|
+
// Try to find an existing session for this workspace + tmux combo
|
|
140
|
+
let existingToken = null;
|
|
141
|
+
for (const [token, sess] of Object.entries(map)) {
|
|
142
|
+
if (sess.cwd === cwd && sess.tmuxSession === tmuxSession && !isExpired(sess)) {
|
|
143
|
+
existingToken = token;
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
const token = existingToken || generateToken();
|
|
148
|
+
// Preserve existing sessionType if a new one isn't explicitly provided
|
|
149
|
+
const resolvedSessionType = sessionType ?? (existingToken ? map[existingToken].sessionType : undefined);
|
|
150
|
+
map[token] = {
|
|
151
|
+
type: resolvedSessionType || 'tmux',
|
|
152
|
+
...(resolvedSessionType !== undefined ? { sessionType: resolvedSessionType } : {}),
|
|
153
|
+
createdAt: existingToken ? map[existingToken].createdAt : now,
|
|
154
|
+
expiresAt,
|
|
155
|
+
cwd,
|
|
156
|
+
sessionId: sessionId || (existingToken ? map[existingToken].sessionId : null) || null,
|
|
157
|
+
tmuxSession: tmuxSession || `claude-${workspace}`,
|
|
158
|
+
description: `${status} - ${workspace}`,
|
|
159
|
+
};
|
|
160
|
+
writeSessionMap(map);
|
|
161
|
+
recordProjectUsage(workspace, cwd);
|
|
162
|
+
return { token, workspace };
|
|
163
|
+
}
|
|
164
|
+
/** Remove expired sessions from the map. */
|
|
165
|
+
function pruneExpired() {
|
|
166
|
+
const map = readSessionMap();
|
|
167
|
+
let pruned = 0;
|
|
168
|
+
for (const [token, session] of Object.entries(map)) {
|
|
169
|
+
if (isExpired(session)) {
|
|
170
|
+
delete map[token];
|
|
171
|
+
pruned++;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
if (pruned > 0) {
|
|
175
|
+
writeSessionMap(map);
|
|
176
|
+
}
|
|
177
|
+
return pruned;
|
|
178
|
+
}
|
|
179
|
+
// ── Helpers ──────────────────────────────────────────────────────
|
|
180
|
+
function generateToken() {
|
|
181
|
+
return crypto_1.default.randomBytes(4).toString('hex').toUpperCase();
|
|
182
|
+
}
|
|
183
|
+
function formatAge(seconds) {
|
|
184
|
+
if (seconds < 60)
|
|
185
|
+
return `${seconds}s ago`;
|
|
186
|
+
if (seconds < 3600)
|
|
187
|
+
return `${Math.floor(seconds / 60)}m ago`;
|
|
188
|
+
if (seconds < 86400)
|
|
189
|
+
return `${Math.floor(seconds / 3600)}h ago`;
|
|
190
|
+
return `${Math.floor(seconds / 86400)}d ago`;
|
|
191
|
+
}
|
|
192
|
+
// ── Prefix / Fuzzy Workspace Resolution ─────────────────────────
|
|
193
|
+
const DEFAULT_WORKSPACE_PATH = process.env.DEFAULT_WORKSPACE_PATH || path_1.default.join(DATA_DIR, 'default-workspace.json');
|
|
194
|
+
const MESSAGE_WORKSPACE_MAP_PATH = process.env.MESSAGE_WORKSPACE_MAP_PATH || path_1.default.join(DATA_DIR, 'message-workspace-map.json');
|
|
195
|
+
/**
|
|
196
|
+
* Resolve a workspace name by exact match, then prefix match.
|
|
197
|
+
*/
|
|
198
|
+
function resolveWorkspace(name) {
|
|
199
|
+
const map = readSessionMap();
|
|
200
|
+
const lower = name.toLowerCase();
|
|
201
|
+
// Build deduplicated workspace → { token, session } map (newest wins)
|
|
202
|
+
const byWorkspace = new Map();
|
|
203
|
+
for (const [token, session] of Object.entries(map)) {
|
|
204
|
+
if (isExpired(session))
|
|
205
|
+
continue;
|
|
206
|
+
const ws = extractWorkspaceName(session.cwd);
|
|
207
|
+
if (!ws)
|
|
208
|
+
continue;
|
|
209
|
+
const existing = byWorkspace.get(ws.toLowerCase());
|
|
210
|
+
if (!existing || session.createdAt > existing.session.createdAt) {
|
|
211
|
+
byWorkspace.set(ws.toLowerCase(), { workspace: ws, token, session });
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Exact match (case-insensitive)
|
|
215
|
+
const exact = byWorkspace.get(lower);
|
|
216
|
+
if (exact) {
|
|
217
|
+
return { type: 'exact', match: { token: exact.token, session: exact.session }, workspace: exact.workspace };
|
|
218
|
+
}
|
|
219
|
+
// Prefix match
|
|
220
|
+
const prefixMatches = [];
|
|
221
|
+
for (const [wsLower, entry] of byWorkspace) {
|
|
222
|
+
if (wsLower.startsWith(lower)) {
|
|
223
|
+
prefixMatches.push(entry);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (prefixMatches.length === 1) {
|
|
227
|
+
const m = prefixMatches[0];
|
|
228
|
+
return { type: 'prefix', match: { token: m.token, session: m.session }, workspace: m.workspace };
|
|
229
|
+
}
|
|
230
|
+
if (prefixMatches.length > 1) {
|
|
231
|
+
return {
|
|
232
|
+
type: 'ambiguous',
|
|
233
|
+
matches: prefixMatches.map(m => ({ workspace: m.workspace, token: m.token, session: m.session })),
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return { type: 'none' };
|
|
237
|
+
}
|
|
238
|
+
// ── Default Workspace ───────────────────────────────────────────
|
|
239
|
+
function getDefaultWorkspace() {
|
|
240
|
+
try {
|
|
241
|
+
const raw = fs_1.default.readFileSync(DEFAULT_WORKSPACE_PATH, 'utf8');
|
|
242
|
+
const data = JSON.parse(raw);
|
|
243
|
+
return data.workspace || null;
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
return null;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function setDefaultWorkspace(name) {
|
|
250
|
+
const dir = path_1.default.dirname(DEFAULT_WORKSPACE_PATH);
|
|
251
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
252
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
253
|
+
}
|
|
254
|
+
if (name) {
|
|
255
|
+
fs_1.default.writeFileSync(DEFAULT_WORKSPACE_PATH, JSON.stringify({ workspace: name }, null, 2), 'utf8');
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
// Clear default
|
|
259
|
+
try {
|
|
260
|
+
fs_1.default.unlinkSync(DEFAULT_WORKSPACE_PATH);
|
|
261
|
+
}
|
|
262
|
+
catch { }
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// ── Message-to-Workspace Tracking (for reply-to routing) ────────
|
|
266
|
+
const MESSAGE_MAP_MAX_AGE_MS = 24 * 60 * 60 * 1000; // 24 hours
|
|
267
|
+
function readMessageMap() {
|
|
268
|
+
try {
|
|
269
|
+
const raw = fs_1.default.readFileSync(MESSAGE_WORKSPACE_MAP_PATH, 'utf8');
|
|
270
|
+
return JSON.parse(raw);
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
return {};
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
function writeMessageMap(map) {
|
|
277
|
+
const dir = path_1.default.dirname(MESSAGE_WORKSPACE_MAP_PATH);
|
|
278
|
+
if (!fs_1.default.existsSync(dir)) {
|
|
279
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
280
|
+
}
|
|
281
|
+
fs_1.default.writeFileSync(MESSAGE_WORKSPACE_MAP_PATH, JSON.stringify(map, null, 2), 'utf8');
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Track which Telegram message_id belongs to which workspace.
|
|
285
|
+
* Prunes entries older than 24 hours on each write.
|
|
286
|
+
*/
|
|
287
|
+
function trackNotificationMessage(messageId, workspace, type) {
|
|
288
|
+
if (!messageId || !workspace)
|
|
289
|
+
return;
|
|
290
|
+
const map = readMessageMap();
|
|
291
|
+
const now = Date.now();
|
|
292
|
+
// Prune old entries
|
|
293
|
+
for (const [id, entry] of Object.entries(map)) {
|
|
294
|
+
if (now - entry.timestamp > MESSAGE_MAP_MAX_AGE_MS) {
|
|
295
|
+
delete map[id];
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
map[String(messageId)] = { workspace, type, timestamp: now };
|
|
299
|
+
writeMessageMap(map);
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Look up which workspace a Telegram message belongs to.
|
|
303
|
+
* Returns the workspace name or null.
|
|
304
|
+
*/
|
|
305
|
+
function getWorkspaceForMessage(messageId) {
|
|
306
|
+
if (!messageId)
|
|
307
|
+
return null;
|
|
308
|
+
const map = readMessageMap();
|
|
309
|
+
const entry = map[String(messageId)];
|
|
310
|
+
if (!entry)
|
|
311
|
+
return null;
|
|
312
|
+
if (Date.now() - entry.timestamp > MESSAGE_MAP_MAX_AGE_MS)
|
|
313
|
+
return null;
|
|
314
|
+
return entry.workspace;
|
|
315
|
+
}
|
|
316
|
+
// ── Project History (persists across session expiry/pruning) ─────
|
|
317
|
+
const PROJECT_HISTORY_PATH = process.env.PROJECT_HISTORY_PATH || path_1.default.join(DATA_DIR, 'project-history.json');
|
|
318
|
+
function readProjectHistory() {
|
|
319
|
+
try {
|
|
320
|
+
return JSON.parse(fs_1.default.readFileSync(PROJECT_HISTORY_PATH, 'utf8'));
|
|
321
|
+
}
|
|
322
|
+
catch {
|
|
323
|
+
return {};
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function recordProjectUsage(name, projectPath) {
|
|
327
|
+
const history = readProjectHistory();
|
|
328
|
+
history[name] = { path: projectPath, lastUsed: Date.now() };
|
|
329
|
+
const entries = Object.entries(history).sort((a, b) => b[1].lastUsed - a[1].lastUsed);
|
|
330
|
+
const trimmed = Object.fromEntries(entries.slice(0, 50));
|
|
331
|
+
const dir = path_1.default.dirname(PROJECT_HISTORY_PATH);
|
|
332
|
+
if (!fs_1.default.existsSync(dir))
|
|
333
|
+
fs_1.default.mkdirSync(dir, { recursive: true });
|
|
334
|
+
fs_1.default.writeFileSync(PROJECT_HISTORY_PATH, JSON.stringify(trimmed, null, 2), 'utf8');
|
|
335
|
+
}
|
|
336
|
+
const PINNED_PROJECTS = ['assistant', 'ccgram'];
|
|
337
|
+
function getRecentProjects(limit = 10) {
|
|
338
|
+
const home = process.env.HOME || require('os').homedir();
|
|
339
|
+
const history = readProjectHistory();
|
|
340
|
+
// 1. Scan project directories and get modification times
|
|
341
|
+
const projects = new Map();
|
|
342
|
+
const scanDirs = process.env.PROJECT_DIRS
|
|
343
|
+
? process.env.PROJECT_DIRS.split(',').map(d => d.trim()).filter(Boolean)
|
|
344
|
+
: [path_1.default.join(home, 'projects'), path_1.default.join(home, 'tools')];
|
|
345
|
+
for (const base of scanDirs) {
|
|
346
|
+
try {
|
|
347
|
+
const entries = fs_1.default.readdirSync(base, { withFileTypes: true });
|
|
348
|
+
for (const e of entries) {
|
|
349
|
+
if (!e.isDirectory())
|
|
350
|
+
continue;
|
|
351
|
+
const fullPath = path_1.default.join(base, e.name);
|
|
352
|
+
try {
|
|
353
|
+
const mtime = fs_1.default.statSync(fullPath).mtimeMs;
|
|
354
|
+
const existing = projects.get(e.name);
|
|
355
|
+
if (!existing || mtime > existing.lastActive) {
|
|
356
|
+
projects.set(e.name, { path: fullPath, lastActive: mtime });
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
catch { }
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
catch { }
|
|
363
|
+
}
|
|
364
|
+
// Also check ~/assistant directly (not under ~/projects/ or ~/tools/)
|
|
365
|
+
try {
|
|
366
|
+
const assistantPath = path_1.default.join(home, 'assistant');
|
|
367
|
+
const mtime = fs_1.default.statSync(assistantPath).mtimeMs;
|
|
368
|
+
const existing = projects.get('assistant');
|
|
369
|
+
if (!existing || mtime > existing.lastActive) {
|
|
370
|
+
projects.set('assistant', { path: assistantPath, lastActive: mtime });
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
catch { }
|
|
374
|
+
// 2. Merge with project history (use whichever timestamp is more recent)
|
|
375
|
+
for (const [name, data] of Object.entries(history)) {
|
|
376
|
+
const existing = projects.get(name);
|
|
377
|
+
if (existing) {
|
|
378
|
+
existing.lastActive = Math.max(existing.lastActive, data.lastUsed);
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
// History entry for a directory not in scan dirs — only include if path still exists
|
|
382
|
+
try {
|
|
383
|
+
if (fs_1.default.statSync(data.path).isDirectory()) {
|
|
384
|
+
projects.set(name, { path: data.path, lastActive: data.lastUsed });
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
catch { }
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// 3. Separate pinned from unpinned
|
|
391
|
+
const pinned = [];
|
|
392
|
+
const unpinned = [];
|
|
393
|
+
for (const [name, data] of projects) {
|
|
394
|
+
if (PINNED_PROJECTS.includes(name)) {
|
|
395
|
+
pinned.push({ name, path: data.path });
|
|
396
|
+
}
|
|
397
|
+
else {
|
|
398
|
+
unpinned.push({ name, path: data.path, lastActive: data.lastActive });
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
// 4. Sort pinned in defined order, unpinned by lastActive descending
|
|
402
|
+
pinned.sort((a, b) => PINNED_PROJECTS.indexOf(a.name) - PINNED_PROJECTS.indexOf(b.name));
|
|
403
|
+
unpinned.sort((a, b) => b.lastActive - a.lastActive);
|
|
404
|
+
// 5. Combine: pinned first, then unpinned, limited to N
|
|
405
|
+
const result = [...pinned, ...unpinned].slice(0, limit);
|
|
406
|
+
return result.map(({ name, path: p }) => ({ name, path: p }));
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=workspace-router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-router.js","sourceRoot":"","sources":["../workspace-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-telegram-bot.d.ts","sourceRoot":"","sources":["../workspace-telegram-bot.ts"],"names":[],"mappings":""}
|