@agents-tower/core 0.1.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/dist/adapters/claude.d.ts +2 -0
- package/dist/adapters/claude.js +43 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex-cloud.d.ts +4 -0
- package/dist/adapters/codex-cloud.js +80 -0
- package/dist/adapters/codex-cloud.js.map +1 -0
- package/dist/adapters/codex-local.d.ts +17 -0
- package/dist/adapters/codex-local.js +180 -0
- package/dist/adapters/codex-local.js.map +1 -0
- package/dist/adapters/cursor-cloud.d.ts +2 -0
- package/dist/adapters/cursor-cloud.js +54 -0
- package/dist/adapters/cursor-cloud.js.map +1 -0
- package/dist/adapters/cursor-local.d.ts +2 -0
- package/dist/adapters/cursor-local.js +37 -0
- package/dist/adapters/cursor-local.js.map +1 -0
- package/dist/adapters/helpers.d.ts +15 -0
- package/dist/adapters/helpers.js +33 -0
- package/dist/adapters/helpers.js.map +1 -0
- package/dist/adapters/hermes.d.ts +2 -0
- package/dist/adapters/hermes.js +41 -0
- package/dist/adapters/hermes.js.map +1 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +37 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/openclaw.d.ts +2 -0
- package/dist/adapters/openclaw.js +41 -0
- package/dist/adapters/openclaw.js.map +1 -0
- package/dist/adapters/presence.d.ts +2 -0
- package/dist/adapters/presence.js +36 -0
- package/dist/adapters/presence.js.map +1 -0
- package/dist/adapters/static-source.d.ts +15 -0
- package/dist/adapters/static-source.js +41 -0
- package/dist/adapters/static-source.js.map +1 -0
- package/dist/adapters/types.d.ts +44 -0
- package/dist/adapters/types.js +3 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/app-server.d.ts +94 -0
- package/dist/app-server.js +382 -0
- package/dist/app-server.js.map +1 -0
- package/dist/app-settings.d.ts +52 -0
- package/dist/app-settings.js +268 -0
- package/dist/app-settings.js.map +1 -0
- package/dist/appearance.d.ts +6 -0
- package/dist/appearance.js +84 -0
- package/dist/appearance.js.map +1 -0
- package/dist/aseprite.d.ts +4 -0
- package/dist/aseprite.js +42 -0
- package/dist/aseprite.js.map +1 -0
- package/dist/claude-agent-sdk.d.ts +44 -0
- package/dist/claude-agent-sdk.js +347 -0
- package/dist/claude-agent-sdk.js.map +1 -0
- package/dist/claude-home-cache.d.ts +61 -0
- package/dist/claude-home-cache.js +438 -0
- package/dist/claude-home-cache.js.map +1 -0
- package/dist/claude.d.ts +154 -0
- package/dist/claude.js +3495 -0
- package/dist/claude.js.map +1 -0
- package/dist/cloud.d.ts +2 -0
- package/dist/cloud.js +25 -0
- package/dist/cloud.js.map +1 -0
- package/dist/codex-command.d.ts +25 -0
- package/dist/codex-command.js +235 -0
- package/dist/codex-command.js.map +1 -0
- package/dist/codex-session-files.d.ts +8 -0
- package/dist/codex-session-files.js +509 -0
- package/dist/codex-session-files.js.map +1 -0
- package/dist/codex-thread-query.d.ts +14 -0
- package/dist/codex-thread-query.js +82 -0
- package/dist/codex-thread-query.js.map +1 -0
- package/dist/cursor-cloud-data.d.ts +34 -0
- package/dist/cursor-cloud-data.js +344 -0
- package/dist/cursor-cloud-data.js.map +1 -0
- package/dist/cursor-lib/local-discovery.d.ts +17 -0
- package/dist/cursor-lib/local-discovery.js +251 -0
- package/dist/cursor-lib/local-discovery.js.map +1 -0
- package/dist/cursor-lib/shared.d.ts +5 -0
- package/dist/cursor-lib/shared.js +88 -0
- package/dist/cursor-lib/shared.js.map +1 -0
- package/dist/cursor.d.ts +8 -0
- package/dist/cursor.js +1584 -0
- package/dist/cursor.js.map +1 -0
- package/dist/domain/codex-turn-semantics.d.ts +4 -0
- package/dist/domain/codex-turn-semantics.js +49 -0
- package/dist/domain/codex-turn-semantics.js.map +1 -0
- package/dist/domain/workload-policy.d.ts +8 -0
- package/dist/domain/workload-policy.js +268 -0
- package/dist/domain/workload-policy.js.map +1 -0
- package/dist/domain/workspace-activity.d.ts +10 -0
- package/dist/domain/workspace-activity.js +372 -0
- package/dist/domain/workspace-activity.js.map +1 -0
- package/dist/goal.d.ts +11 -0
- package/dist/goal.js +76 -0
- package/dist/goal.js.map +1 -0
- package/dist/hermes-hook-install.d.ts +12 -0
- package/dist/hermes-hook-install.js +335 -0
- package/dist/hermes-hook-install.js.map +1 -0
- package/dist/hermes.d.ts +97 -0
- package/dist/hermes.js +2446 -0
- package/dist/hermes.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +47 -0
- package/dist/index.js.map +1 -0
- package/dist/live-monitor-lib/events.d.ts +43 -0
- package/dist/live-monitor-lib/events.js +1463 -0
- package/dist/live-monitor-lib/events.js.map +1 -0
- package/dist/live-monitor-lib/rollout-hooks.d.ts +13 -0
- package/dist/live-monitor-lib/rollout-hooks.js +253 -0
- package/dist/live-monitor-lib/rollout-hooks.js.map +1 -0
- package/dist/live-monitor.d.ts +102 -0
- package/dist/live-monitor.js +1461 -0
- package/dist/live-monitor.js.map +1 -0
- package/dist/local-thread-selection.d.ts +2 -0
- package/dist/local-thread-selection.js +58 -0
- package/dist/local-thread-selection.js.map +1 -0
- package/dist/openclaw.d.ts +41 -0
- package/dist/openclaw.js +715 -0
- package/dist/openclaw.js.map +1 -0
- package/dist/presence.d.ts +9 -0
- package/dist/presence.js +108 -0
- package/dist/presence.js.map +1 -0
- package/dist/project-identity.d.ts +7 -0
- package/dist/project-identity.js +162 -0
- package/dist/project-identity.js.map +1 -0
- package/dist/project-paths.d.ts +23 -0
- package/dist/project-paths.js +394 -0
- package/dist/project-paths.js.map +1 -0
- package/dist/project-storage.d.ts +7 -0
- package/dist/project-storage.js +79 -0
- package/dist/project-storage.js.map +1 -0
- package/dist/room-config.d.ts +21 -0
- package/dist/room-config.js +230 -0
- package/dist/room-config.js.map +1 -0
- package/dist/services/project-discovery.d.ts +1 -0
- package/dist/services/project-discovery.js +16 -0
- package/dist/services/project-discovery.js.map +1 -0
- package/dist/services/project-live-monitor.d.ts +1 -0
- package/dist/services/project-live-monitor.js +6 -0
- package/dist/services/project-live-monitor.js.map +1 -0
- package/dist/services/project-snapshot-coordinator.d.ts +49 -0
- package/dist/services/project-snapshot-coordinator.js +152 -0
- package/dist/services/project-snapshot-coordinator.js.map +1 -0
- package/dist/services/refresh-scheduler.d.ts +8 -0
- package/dist/services/refresh-scheduler.js +44 -0
- package/dist/services/refresh-scheduler.js.map +1 -0
- package/dist/services/snapshot-assembler.d.ts +8 -0
- package/dist/services/snapshot-assembler.js +167 -0
- package/dist/services/snapshot-assembler.js.map +1 -0
- package/dist/services/thread-store.d.ts +4 -0
- package/dist/services/thread-store.js +8 -0
- package/dist/services/thread-store.js.map +1 -0
- package/dist/snapshot-lib/activity-summary.d.ts +3 -0
- package/dist/snapshot-lib/activity-summary.js +220 -0
- package/dist/snapshot-lib/activity-summary.js.map +1 -0
- package/dist/snapshot-lib/dashboard-builder.d.ts +21 -0
- package/dist/snapshot-lib/dashboard-builder.js +146 -0
- package/dist/snapshot-lib/dashboard-builder.js.map +1 -0
- package/dist/snapshot-lib/thread-summary.d.ts +27 -0
- package/dist/snapshot-lib/thread-summary.js +953 -0
- package/dist/snapshot-lib/thread-summary.js.map +1 -0
- package/dist/snapshot.d.ts +2 -0
- package/dist/snapshot.js +21 -0
- package/dist/snapshot.js.map +1 -0
- package/dist/types.d.ts +368 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json.d.ts +4 -0
- package/dist/utils/json.js +29 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/utils/text.d.ts +3 -0
- package/dist/utils/text.js +26 -0
- package/dist/utils/text.js.map +1 -0
- package/dist/web-search.d.ts +1 -0
- package/dist/web-search.js +52 -0
- package/dist/web-search.js.map +1 -0
- package/dist/workload.d.ts +1 -0
- package/dist/workload.js +12 -0
- package/dist/workload.js.map +1 -0
- package/package.json +19 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DashboardAgent, DashboardEvent } from "./types";
|
|
2
|
+
interface RawCursorAgent {
|
|
3
|
+
id: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
status?: string;
|
|
6
|
+
createdAt?: string;
|
|
7
|
+
updatedAt?: string;
|
|
8
|
+
summary?: string;
|
|
9
|
+
source?: {
|
|
10
|
+
repository?: string;
|
|
11
|
+
ref?: string;
|
|
12
|
+
prUrl?: string | null;
|
|
13
|
+
};
|
|
14
|
+
target?: {
|
|
15
|
+
url?: string;
|
|
16
|
+
branchName?: string;
|
|
17
|
+
prUrl?: string | null;
|
|
18
|
+
autoCreatePr?: boolean;
|
|
19
|
+
};
|
|
20
|
+
model?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function cursorApiKeyConfigured(): boolean;
|
|
23
|
+
export declare function describeCursorAgentAvailability(projectRoot: string): Promise<string | null>;
|
|
24
|
+
export declare function cursorAgentMatchesRepository(agent: Pick<RawCursorAgent, "source" | "target">, repositoryUrl: string | null | undefined): boolean;
|
|
25
|
+
export declare function loadCursorCloudProjectSnapshotData(projectRoot: string, options?: {
|
|
26
|
+
limit?: number;
|
|
27
|
+
knownConversationMessageIds?: Map<string, Set<string>>;
|
|
28
|
+
emitConversationEvents?: boolean;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
agents: DashboardAgent[];
|
|
31
|
+
events: DashboardEvent[];
|
|
32
|
+
}>;
|
|
33
|
+
export declare function loadCursorAgents(projectRoot: string, limit?: number): Promise<DashboardAgent[]>;
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cursorApiKeyConfigured = cursorApiKeyConfigured;
|
|
4
|
+
exports.describeCursorAgentAvailability = describeCursorAgentAvailability;
|
|
5
|
+
exports.cursorAgentMatchesRepository = cursorAgentMatchesRepository;
|
|
6
|
+
exports.loadCursorCloudProjectSnapshotData = loadCursorCloudProjectSnapshotData;
|
|
7
|
+
exports.loadCursorAgents = loadCursorAgents;
|
|
8
|
+
const appearance_1 = require("./appearance");
|
|
9
|
+
const app_settings_1 = require("./app-settings");
|
|
10
|
+
const shared_1 = require("./cursor-lib/shared");
|
|
11
|
+
const DEFAULT_CURSOR_API_BASE_URL = "https://api.cursor.com";
|
|
12
|
+
const DEFAULT_CURSOR_AGENT_LIMIT = 24;
|
|
13
|
+
const CURSOR_API_PAGE_SIZE = 100;
|
|
14
|
+
const CURSOR_CLOUD_CONVERSATION_WINDOW_MS = 30 * 60 * 1000;
|
|
15
|
+
function cursorApiKey() {
|
|
16
|
+
const value = process.env.CURSOR_API_KEY;
|
|
17
|
+
if (typeof value === "string") {
|
|
18
|
+
const trimmed = value.trim();
|
|
19
|
+
if (trimmed.length > 0) {
|
|
20
|
+
return trimmed;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return (0, app_settings_1.getStoredCursorApiKeySync)();
|
|
24
|
+
}
|
|
25
|
+
function cursorApiKeyConfigured() {
|
|
26
|
+
return cursorApiKey() !== null;
|
|
27
|
+
}
|
|
28
|
+
function cursorApiBaseUrl() {
|
|
29
|
+
const configured = process.env.CURSOR_API_BASE_URL;
|
|
30
|
+
if (typeof configured !== "string" || configured.trim().length === 0) {
|
|
31
|
+
return DEFAULT_CURSOR_API_BASE_URL;
|
|
32
|
+
}
|
|
33
|
+
return configured.trim().replace(/[\\/]+$/, "");
|
|
34
|
+
}
|
|
35
|
+
function cursorAgentLimit() {
|
|
36
|
+
const raw = Number.parseInt(process.env.CURSOR_AGENT_LIMIT ?? "", 10);
|
|
37
|
+
if (!Number.isFinite(raw)) {
|
|
38
|
+
return DEFAULT_CURSOR_AGENT_LIMIT;
|
|
39
|
+
}
|
|
40
|
+
return Math.max(1, Math.min(100, raw));
|
|
41
|
+
}
|
|
42
|
+
function isCursorAgentOngoing(status) {
|
|
43
|
+
const normalized = typeof status === "string" ? status.trim().toUpperCase() : "";
|
|
44
|
+
return normalized === "CREATING" || normalized === "RUNNING";
|
|
45
|
+
}
|
|
46
|
+
function cursorDetail(agent) {
|
|
47
|
+
const status = typeof agent.status === "string" ? agent.status.trim() : "UNKNOWN";
|
|
48
|
+
const branchName = agent.target?.branchName ?? null;
|
|
49
|
+
const prUrl = agent.target?.prUrl ?? null;
|
|
50
|
+
const summary = typeof agent.summary === "string" ? agent.summary.trim() : "";
|
|
51
|
+
if (summary) {
|
|
52
|
+
return summary;
|
|
53
|
+
}
|
|
54
|
+
if (branchName && prUrl) {
|
|
55
|
+
return `${status} · ${branchName} · PR ready`;
|
|
56
|
+
}
|
|
57
|
+
if (branchName) {
|
|
58
|
+
return `${status} · ${branchName}`;
|
|
59
|
+
}
|
|
60
|
+
return status;
|
|
61
|
+
}
|
|
62
|
+
async function describeCursorAgentAvailability(projectRoot) {
|
|
63
|
+
if (!cursorApiKeyConfigured()) {
|
|
64
|
+
return "Cursor background agents disabled: CURSOR_API_KEY is not configured for this process.";
|
|
65
|
+
}
|
|
66
|
+
const repositoryUrl = await (0, shared_1.gitRemoteOriginUrl)(projectRoot);
|
|
67
|
+
if (!repositoryUrl) {
|
|
68
|
+
return "Cursor background agents unavailable for this project: git remote.origin.url is missing.";
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function cursorAuthHeader(apiKey, scheme) {
|
|
73
|
+
if (scheme === "basic") {
|
|
74
|
+
const token = Buffer.from(`${apiKey}:`, "utf8").toString("base64");
|
|
75
|
+
return `Basic ${token}`;
|
|
76
|
+
}
|
|
77
|
+
return `Bearer ${apiKey}`;
|
|
78
|
+
}
|
|
79
|
+
async function fetchCursorListPage(apiKey, cursor, pageSize) {
|
|
80
|
+
const url = new URL("/v0/agents", cursorApiBaseUrl());
|
|
81
|
+
url.searchParams.set("limit", String(pageSize));
|
|
82
|
+
if (cursor) {
|
|
83
|
+
url.searchParams.set("cursor", cursor);
|
|
84
|
+
}
|
|
85
|
+
return fetchCursorJson(apiKey, url);
|
|
86
|
+
}
|
|
87
|
+
async function fetchCursorJson(apiKey, url) {
|
|
88
|
+
let firstFailure = null;
|
|
89
|
+
for (const scheme of ["bearer", "basic"]) {
|
|
90
|
+
const response = await fetch(url, {
|
|
91
|
+
headers: {
|
|
92
|
+
Accept: "application/json",
|
|
93
|
+
Authorization: cursorAuthHeader(apiKey, scheme)
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (response.ok) {
|
|
97
|
+
return await response.json();
|
|
98
|
+
}
|
|
99
|
+
const body = await response.text().catch(() => "");
|
|
100
|
+
const detail = body.trim();
|
|
101
|
+
const error = new Error(detail.length > 0
|
|
102
|
+
? `Cursor API ${response.status}: ${detail}`
|
|
103
|
+
: `Cursor API ${response.status}: ${response.statusText}`);
|
|
104
|
+
if (firstFailure === null) {
|
|
105
|
+
firstFailure = error;
|
|
106
|
+
}
|
|
107
|
+
if (scheme === "bearer" && (response.status === 401 || response.status === 403)) {
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
throw firstFailure ?? new Error("Cursor API request failed");
|
|
113
|
+
}
|
|
114
|
+
async function listCursorBackgroundAgents(limit = cursorAgentLimit()) {
|
|
115
|
+
const apiKey = cursorApiKey();
|
|
116
|
+
if (!apiKey) {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
const agents = [];
|
|
120
|
+
let cursor = null;
|
|
121
|
+
while (agents.length < limit) {
|
|
122
|
+
const pageSize = Math.min(CURSOR_API_PAGE_SIZE, limit - agents.length);
|
|
123
|
+
const parsed = await fetchCursorListPage(apiKey, cursor, pageSize);
|
|
124
|
+
const pageAgents = Array.isArray(parsed.agents) ? parsed.agents : [];
|
|
125
|
+
agents.push(...pageAgents);
|
|
126
|
+
const nextCursor = typeof parsed.nextCursor === "string" && parsed.nextCursor.trim().length > 0
|
|
127
|
+
? parsed.nextCursor.trim()
|
|
128
|
+
: null;
|
|
129
|
+
if (!nextCursor || pageAgents.length === 0) {
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
cursor = nextCursor;
|
|
133
|
+
}
|
|
134
|
+
return agents;
|
|
135
|
+
}
|
|
136
|
+
function cursorAgentRepositories(agent) {
|
|
137
|
+
const candidates = [
|
|
138
|
+
agent.source?.repository,
|
|
139
|
+
agent.source?.prUrl,
|
|
140
|
+
agent.target?.prUrl
|
|
141
|
+
]
|
|
142
|
+
.map((value) => (0, shared_1.normalizeRepositoryUrl)(value))
|
|
143
|
+
.filter((value) => value !== null);
|
|
144
|
+
return [...new Set(candidates)];
|
|
145
|
+
}
|
|
146
|
+
function cursorAgentMatchesRepository(agent, repositoryUrl) {
|
|
147
|
+
const normalizedRepository = (0, shared_1.normalizeRepositoryUrl)(repositoryUrl);
|
|
148
|
+
if (normalizedRepository === null) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
return cursorAgentRepositories(agent).includes(normalizedRepository);
|
|
152
|
+
}
|
|
153
|
+
function cursorConversationMessageType(message) {
|
|
154
|
+
const normalized = typeof message.type === "string" ? message.type.trim().toLowerCase() : "";
|
|
155
|
+
switch (normalized) {
|
|
156
|
+
case "user_message":
|
|
157
|
+
case "user":
|
|
158
|
+
return "userMessage";
|
|
159
|
+
case "assistant_message":
|
|
160
|
+
case "assistant":
|
|
161
|
+
return "agentMessage";
|
|
162
|
+
default:
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function cursorConversationMessageText(message) {
|
|
167
|
+
if (typeof message.text !== "string") {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
const normalized = message.text.replace(/\s+/g, " ").trim();
|
|
171
|
+
return normalized.length > 0 ? normalized : null;
|
|
172
|
+
}
|
|
173
|
+
async function fetchCursorAgentConversation(apiKey, agentId) {
|
|
174
|
+
const url = new URL(`/v0/agents/${encodeURIComponent(agentId)}/conversation`, cursorApiBaseUrl());
|
|
175
|
+
const parsed = await fetchCursorJson(apiKey, url);
|
|
176
|
+
return Array.isArray(parsed.messages) ? parsed.messages : [];
|
|
177
|
+
}
|
|
178
|
+
function shouldFetchCursorAgentConversation(agent, nowMs) {
|
|
179
|
+
if (isCursorAgentOngoing(agent.status)) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
const updatedAtMs = Date.parse(agent.updatedAt ?? agent.createdAt ?? "");
|
|
183
|
+
if (!Number.isFinite(updatedAtMs)) {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
return nowMs - updatedAtMs <= CURSOR_CLOUD_CONVERSATION_WINDOW_MS;
|
|
187
|
+
}
|
|
188
|
+
function cursorConversationEvent(input) {
|
|
189
|
+
const messageId = typeof input.message.id === "string" ? input.message.id.trim() : "";
|
|
190
|
+
const type = cursorConversationMessageType(input.message);
|
|
191
|
+
const text = cursorConversationMessageText(input.message);
|
|
192
|
+
if (messageId.length === 0 || !type || !text) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
id: `${input.projectRoot}::cursor-cloud::${input.agentId}::${messageId}`,
|
|
197
|
+
source: "cursor",
|
|
198
|
+
confidence: "typed",
|
|
199
|
+
threadId: input.agentId,
|
|
200
|
+
createdAt: input.createdAt,
|
|
201
|
+
method: type === "userMessage" ? "cursor/cloud/userMessage" : "cursor/cloud/agentMessage",
|
|
202
|
+
itemId: messageId,
|
|
203
|
+
itemType: type === "userMessage" ? "user_message" : "assistant_message",
|
|
204
|
+
kind: "message",
|
|
205
|
+
phase: "updated",
|
|
206
|
+
title: type === "userMessage" ? "Cursor prompt" : "Cursor reply",
|
|
207
|
+
detail: text,
|
|
208
|
+
path: input.projectRoot,
|
|
209
|
+
action: "said",
|
|
210
|
+
isImage: false
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function loadCursorCloudProjectSnapshotData(projectRoot, options) {
|
|
214
|
+
const limit = options?.limit ?? cursorAgentLimit();
|
|
215
|
+
const apiKey = cursorApiKey();
|
|
216
|
+
if (!apiKey) {
|
|
217
|
+
return { agents: [], events: [] };
|
|
218
|
+
}
|
|
219
|
+
const repositoryUrl = await (0, shared_1.gitRemoteOriginUrl)(projectRoot);
|
|
220
|
+
if (!repositoryUrl) {
|
|
221
|
+
return { agents: [], events: [] };
|
|
222
|
+
}
|
|
223
|
+
const listedAgents = await listCursorBackgroundAgents(limit);
|
|
224
|
+
const matchingAgents = listedAgents.filter((agent) => cursorAgentMatchesRepository(agent, repositoryUrl));
|
|
225
|
+
const nowMs = Date.now();
|
|
226
|
+
const knownConversationMessageIds = options?.knownConversationMessageIds ?? new Map();
|
|
227
|
+
const emitConversationEvents = options?.emitConversationEvents ?? false;
|
|
228
|
+
const conversations = new Map();
|
|
229
|
+
await Promise.all(matchingAgents.map(async (agent) => {
|
|
230
|
+
if (!shouldFetchCursorAgentConversation(agent, nowMs)) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
try {
|
|
234
|
+
conversations.set(agent.id, await fetchCursorAgentConversation(apiKey, agent.id));
|
|
235
|
+
}
|
|
236
|
+
catch {
|
|
237
|
+
// Conversation polling is best-effort; keep status-only agent visibility when it fails.
|
|
238
|
+
}
|
|
239
|
+
}));
|
|
240
|
+
const agents = [];
|
|
241
|
+
const events = [];
|
|
242
|
+
for (const agent of matchingAgents) {
|
|
243
|
+
const conversation = conversations.get(agent.id) ?? [];
|
|
244
|
+
const latestAssistantMessage = conversation
|
|
245
|
+
.slice()
|
|
246
|
+
.reverse()
|
|
247
|
+
.find((message) => cursorConversationMessageType(message) === "agentMessage" && cursorConversationMessageText(message)) ?? null;
|
|
248
|
+
const appearance = await (0, appearance_1.ensureAgentAppearance)(projectRoot, `cursor:${agent.id}`);
|
|
249
|
+
const state = (0, shared_1.cursorStatusToActivityState)(agent.status);
|
|
250
|
+
const updatedAt = agent.updatedAt ?? agent.createdAt ?? new Date().toISOString();
|
|
251
|
+
const label = typeof agent.name === "string" && agent.name.trim().length > 0
|
|
252
|
+
? agent.name.trim()
|
|
253
|
+
: `Cursor ${agent.id}`;
|
|
254
|
+
const detail = cursorDetail(agent);
|
|
255
|
+
const branchName = agent.target?.branchName ?? agent.source?.ref ?? null;
|
|
256
|
+
const repository = (0, shared_1.normalizeRepositoryUrl)(agent.source?.repository);
|
|
257
|
+
const summary = typeof agent.summary === "string" && agent.summary.trim().length > 0
|
|
258
|
+
? agent.summary.trim()
|
|
259
|
+
: null;
|
|
260
|
+
const latestAssistantText = latestAssistantMessage ? cursorConversationMessageText(latestAssistantMessage) : null;
|
|
261
|
+
const activityEvent = latestAssistantText
|
|
262
|
+
? {
|
|
263
|
+
type: "agentMessage",
|
|
264
|
+
action: "said",
|
|
265
|
+
path: projectRoot,
|
|
266
|
+
title: latestAssistantText,
|
|
267
|
+
isImage: false
|
|
268
|
+
}
|
|
269
|
+
: null;
|
|
270
|
+
const knownIds = knownConversationMessageIds.get(agent.id) ?? new Set();
|
|
271
|
+
if (!knownConversationMessageIds.has(agent.id)) {
|
|
272
|
+
knownConversationMessageIds.set(agent.id, knownIds);
|
|
273
|
+
}
|
|
274
|
+
conversation.forEach((message, index) => {
|
|
275
|
+
const messageId = typeof message.id === "string" ? message.id.trim() : "";
|
|
276
|
+
if (messageId.length === 0) {
|
|
277
|
+
return;
|
|
278
|
+
}
|
|
279
|
+
const seen = knownIds.has(messageId);
|
|
280
|
+
knownIds.add(messageId);
|
|
281
|
+
if (!emitConversationEvents || seen) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
const createdAt = typeof message.createdAt === "string" && Number.isFinite(Date.parse(message.createdAt))
|
|
285
|
+
? new Date(message.createdAt).toISOString()
|
|
286
|
+
: new Date(nowMs + index).toISOString();
|
|
287
|
+
const event = cursorConversationEvent({
|
|
288
|
+
projectRoot,
|
|
289
|
+
agentId: agent.id,
|
|
290
|
+
message,
|
|
291
|
+
createdAt
|
|
292
|
+
});
|
|
293
|
+
if (event) {
|
|
294
|
+
events.push(event);
|
|
295
|
+
}
|
|
296
|
+
});
|
|
297
|
+
agents.push({
|
|
298
|
+
id: `cursor:${agent.id}`,
|
|
299
|
+
label,
|
|
300
|
+
source: "cursor",
|
|
301
|
+
sourceKind: (0, shared_1.sourceKindFromModel)(agent.model),
|
|
302
|
+
parentThreadId: null,
|
|
303
|
+
depth: 0,
|
|
304
|
+
isCurrent: false,
|
|
305
|
+
isOngoing: isCursorAgentOngoing(agent.status),
|
|
306
|
+
statusText: agent.status ?? null,
|
|
307
|
+
role: "cursor",
|
|
308
|
+
nickname: null,
|
|
309
|
+
isSubagent: false,
|
|
310
|
+
state,
|
|
311
|
+
detail,
|
|
312
|
+
cwd: projectRoot,
|
|
313
|
+
roomId: null,
|
|
314
|
+
appearance,
|
|
315
|
+
updatedAt,
|
|
316
|
+
stoppedAt: state === "done" || state === "blocked" || state === "idle" ? updatedAt : null,
|
|
317
|
+
paths: [projectRoot],
|
|
318
|
+
activityEvent,
|
|
319
|
+
latestMessage: latestAssistantMessage ? (cursorConversationMessageText(latestAssistantMessage) ?? summary) : summary,
|
|
320
|
+
threadId: agent.id,
|
|
321
|
+
taskId: agent.id,
|
|
322
|
+
resumeCommand: null,
|
|
323
|
+
url: agent.target?.url ?? null,
|
|
324
|
+
git: {
|
|
325
|
+
sha: null,
|
|
326
|
+
branch: branchName,
|
|
327
|
+
originUrl: repository
|
|
328
|
+
},
|
|
329
|
+
provenance: "cursor",
|
|
330
|
+
confidence: "typed",
|
|
331
|
+
needsUser: null,
|
|
332
|
+
liveSubscription: "readOnly",
|
|
333
|
+
network: null
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
return {
|
|
337
|
+
agents: agents.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)),
|
|
338
|
+
events: events.sort((left, right) => right.createdAt.localeCompare(left.createdAt))
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
async function loadCursorAgents(projectRoot, limit = cursorAgentLimit()) {
|
|
342
|
+
return (await loadCursorCloudProjectSnapshotData(projectRoot, { limit })).agents;
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=cursor-cloud-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cursor-cloud-data.js","sourceRoot":"","sources":["../src/cursor-cloud-data.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface CursorWorkspaceEntry {
|
|
2
|
+
id: string;
|
|
3
|
+
root: string;
|
|
4
|
+
label: string;
|
|
5
|
+
stateFilePath: string;
|
|
6
|
+
backupFilePath: string;
|
|
7
|
+
updatedAtMs: number;
|
|
8
|
+
}
|
|
9
|
+
export declare function cursorLocalSessionLimit(): number;
|
|
10
|
+
export declare function cursorLogsDir(): Promise<string | null>;
|
|
11
|
+
export declare function cursorTranscriptFiles(projectRoot: string): Promise<Array<{
|
|
12
|
+
sessionId: string;
|
|
13
|
+
filePath: string;
|
|
14
|
+
createdAtMs: number;
|
|
15
|
+
updatedAtMs: number;
|
|
16
|
+
}>>;
|
|
17
|
+
export declare function loadCursorWorkspaceEntries(limit?: number): Promise<CursorWorkspaceEntry[]>;
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cursorLocalSessionLimit = cursorLocalSessionLimit;
|
|
4
|
+
exports.cursorLogsDir = cursorLogsDir;
|
|
5
|
+
exports.cursorTranscriptFiles = cursorTranscriptFiles;
|
|
6
|
+
exports.loadCursorWorkspaceEntries = loadCursorWorkspaceEntries;
|
|
7
|
+
const promises_1 = require("node:fs/promises");
|
|
8
|
+
const node_path_1 = require("node:path");
|
|
9
|
+
const project_paths_1 = require("../project-paths");
|
|
10
|
+
const DEFAULT_CURSOR_LOCAL_SESSION_LIMIT = 12;
|
|
11
|
+
function cursorLocalSessionLimit() {
|
|
12
|
+
const raw = Number.parseInt(process.env.CURSOR_LOCAL_SESSION_LIMIT ?? "", 10);
|
|
13
|
+
if (!Number.isFinite(raw)) {
|
|
14
|
+
return DEFAULT_CURSOR_LOCAL_SESSION_LIMIT;
|
|
15
|
+
}
|
|
16
|
+
return Math.max(1, Math.min(50, raw));
|
|
17
|
+
}
|
|
18
|
+
function pathExists(path) {
|
|
19
|
+
return (0, promises_1.stat)(path).then(() => true).catch(() => false);
|
|
20
|
+
}
|
|
21
|
+
function decodeCursorWorkspaceFolderUri(input) {
|
|
22
|
+
if (typeof input !== "string" || input.trim().length === 0) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const trimmed = input.trim();
|
|
26
|
+
const windowsUriMatch = trimmed.match(/^file:\/\/\/([a-zA-Z]):\/(.*)$/);
|
|
27
|
+
if (windowsUriMatch) {
|
|
28
|
+
return (0, project_paths_1.canonicalizeProjectPath)(`${windowsUriMatch[1]}:/${decodeURIComponent(windowsUriMatch[2])}`);
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const url = new URL(trimmed);
|
|
32
|
+
const decodedPath = decodeURIComponent(url.pathname);
|
|
33
|
+
const windowsPathMatch = decodedPath.match(/^\/([a-zA-Z]):\/(.*)$/);
|
|
34
|
+
if (windowsPathMatch) {
|
|
35
|
+
return (0, project_paths_1.canonicalizeProjectPath)(`${windowsPathMatch[1]}:/${windowsPathMatch[2]}`);
|
|
36
|
+
}
|
|
37
|
+
return (0, project_paths_1.canonicalizeProjectPath)(decodedPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return (0, project_paths_1.canonicalizeProjectPath)(decodeURIComponent(trimmed));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async function cursorUserDataDir() {
|
|
44
|
+
const candidates = new Set();
|
|
45
|
+
const explicit = (0, project_paths_1.canonicalizeProjectPath)(process.env.CURSOR_USER_DATA_DIR);
|
|
46
|
+
if (explicit) {
|
|
47
|
+
candidates.add(explicit);
|
|
48
|
+
}
|
|
49
|
+
const appData = (0, project_paths_1.canonicalizeProjectPath)(process.env.APPDATA);
|
|
50
|
+
if (appData) {
|
|
51
|
+
candidates.add((0, node_path_1.join)(appData, "Cursor"));
|
|
52
|
+
}
|
|
53
|
+
if (await pathExists("/mnt/c/Users")) {
|
|
54
|
+
try {
|
|
55
|
+
const users = await (0, promises_1.readdir)("/mnt/c/Users", { withFileTypes: true });
|
|
56
|
+
for (const entry of users) {
|
|
57
|
+
if (!entry.isDirectory()) {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
candidates.add(`/mnt/c/Users/${entry.name}/AppData/Roaming/Cursor`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// ignore
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
for (const candidate of candidates) {
|
|
68
|
+
if (candidate && await pathExists(candidate)) {
|
|
69
|
+
return candidate;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
async function cursorWorkspaceStorageDir() {
|
|
75
|
+
const explicit = (0, project_paths_1.canonicalizeProjectPath)(process.env.CURSOR_WORKSPACE_STORAGE_DIR);
|
|
76
|
+
if (explicit && await pathExists(explicit)) {
|
|
77
|
+
return explicit;
|
|
78
|
+
}
|
|
79
|
+
const userDataDir = await cursorUserDataDir();
|
|
80
|
+
if (!userDataDir) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
const workspaceStorage = (0, node_path_1.join)(userDataDir, "User", "workspaceStorage");
|
|
84
|
+
return await pathExists(workspaceStorage) ? workspaceStorage : null;
|
|
85
|
+
}
|
|
86
|
+
async function cursorLogsDir() {
|
|
87
|
+
const explicit = (0, project_paths_1.canonicalizeProjectPath)(process.env.CURSOR_LOGS_DIR);
|
|
88
|
+
if (explicit && await pathExists(explicit)) {
|
|
89
|
+
return explicit;
|
|
90
|
+
}
|
|
91
|
+
const userDataDir = await cursorUserDataDir();
|
|
92
|
+
if (!userDataDir) {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
const logsDir = (0, node_path_1.join)(userDataDir, "logs");
|
|
96
|
+
return await pathExists(logsDir) ? logsDir : null;
|
|
97
|
+
}
|
|
98
|
+
async function cursorProjectsDirs() {
|
|
99
|
+
const candidates = new Set();
|
|
100
|
+
const explicit = (0, project_paths_1.canonicalizeProjectPath)(process.env.CURSOR_PROJECTS_DIR);
|
|
101
|
+
if (explicit) {
|
|
102
|
+
candidates.add(explicit);
|
|
103
|
+
}
|
|
104
|
+
const homeDir = (0, project_paths_1.canonicalizeProjectPath)(process.env.HOME);
|
|
105
|
+
if (homeDir) {
|
|
106
|
+
candidates.add((0, node_path_1.join)(homeDir, ".cursor", "projects"));
|
|
107
|
+
}
|
|
108
|
+
if (await pathExists("/mnt/c/Users")) {
|
|
109
|
+
try {
|
|
110
|
+
const users = await (0, promises_1.readdir)("/mnt/c/Users", { withFileTypes: true });
|
|
111
|
+
for (const entry of users) {
|
|
112
|
+
if (!entry.isDirectory()) {
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
candidates.add(`/mnt/c/Users/${entry.name}/.cursor/projects`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// ignore
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const available = [];
|
|
123
|
+
for (const candidate of candidates) {
|
|
124
|
+
if (candidate && await pathExists(candidate)) {
|
|
125
|
+
available.push(candidate);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return available;
|
|
129
|
+
}
|
|
130
|
+
function cursorProjectKeyCandidates(projectRoot) {
|
|
131
|
+
const canonicalRoot = (0, project_paths_1.canonicalizeProjectPath)(projectRoot);
|
|
132
|
+
if (!canonicalRoot) {
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
const candidates = new Set();
|
|
136
|
+
const unixStyle = canonicalRoot.replace(/^\/+/, "").replace(/[\\/]+/g, "-");
|
|
137
|
+
if (unixStyle.length > 0) {
|
|
138
|
+
candidates.add(unixStyle);
|
|
139
|
+
}
|
|
140
|
+
const windowsMountMatch = canonicalRoot.match(/^\/mnt\/([a-zA-Z])\/(.+)$/);
|
|
141
|
+
if (windowsMountMatch) {
|
|
142
|
+
const rest = windowsMountMatch[2].replace(/[\\/]+/g, "-");
|
|
143
|
+
candidates.add(`${windowsMountMatch[1].toLowerCase()}-${rest}`);
|
|
144
|
+
candidates.add(`${windowsMountMatch[1].toUpperCase()}-${rest}`);
|
|
145
|
+
}
|
|
146
|
+
return [...candidates];
|
|
147
|
+
}
|
|
148
|
+
async function cursorTranscriptDir(projectRoot) {
|
|
149
|
+
const projectKeys = cursorProjectKeyCandidates(projectRoot);
|
|
150
|
+
if (projectKeys.length === 0) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const projectDirs = await cursorProjectsDirs();
|
|
154
|
+
for (const baseDir of projectDirs) {
|
|
155
|
+
for (const projectKey of projectKeys) {
|
|
156
|
+
const candidate = (0, node_path_1.join)(baseDir, projectKey, "agent-transcripts");
|
|
157
|
+
if (await pathExists(candidate)) {
|
|
158
|
+
return candidate;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
async function cursorTranscriptFiles(projectRoot) {
|
|
165
|
+
const transcriptsDir = await cursorTranscriptDir(projectRoot);
|
|
166
|
+
if (!transcriptsDir) {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
const entries = await (0, promises_1.readdir)(transcriptsDir, { withFileTypes: true }).catch(() => []);
|
|
170
|
+
const files = [];
|
|
171
|
+
for (const entry of entries) {
|
|
172
|
+
const sessionId = entry.name.replace(/\.jsonl$/i, "");
|
|
173
|
+
let filePath = null;
|
|
174
|
+
if (entry.isFile() && entry.name.endsWith(".jsonl")) {
|
|
175
|
+
filePath = (0, node_path_1.join)(transcriptsDir, entry.name);
|
|
176
|
+
}
|
|
177
|
+
else if (entry.isDirectory()) {
|
|
178
|
+
const nested = (0, node_path_1.join)(transcriptsDir, entry.name, `${entry.name}.jsonl`);
|
|
179
|
+
if (await pathExists(nested)) {
|
|
180
|
+
filePath = nested;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
const nestedEntries = await (0, promises_1.readdir)((0, node_path_1.join)(transcriptsDir, entry.name), { withFileTypes: true }).catch(() => []);
|
|
184
|
+
const nestedFile = nestedEntries.find((candidate) => candidate.isFile() && candidate.name.endsWith(".jsonl")) ?? null;
|
|
185
|
+
if (nestedFile) {
|
|
186
|
+
filePath = (0, node_path_1.join)(transcriptsDir, entry.name, nestedFile.name);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (!filePath) {
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
const fileStats = await (0, promises_1.stat)(filePath).catch(() => null);
|
|
194
|
+
if (!fileStats?.isFile()) {
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
files.push({
|
|
198
|
+
sessionId,
|
|
199
|
+
filePath,
|
|
200
|
+
createdAtMs: fileStats.birthtimeMs || fileStats.ctimeMs || fileStats.mtimeMs,
|
|
201
|
+
updatedAtMs: fileStats.mtimeMs
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
return files.sort((left, right) => right.updatedAtMs - left.updatedAtMs);
|
|
205
|
+
}
|
|
206
|
+
async function loadCursorWorkspaceEntries(limit = 50) {
|
|
207
|
+
const workspaceStorage = await cursorWorkspaceStorageDir();
|
|
208
|
+
if (!workspaceStorage) {
|
|
209
|
+
return [];
|
|
210
|
+
}
|
|
211
|
+
const entries = await (0, promises_1.readdir)(workspaceStorage, { withFileTypes: true }).catch(() => []);
|
|
212
|
+
const workspaces = [];
|
|
213
|
+
for (const entry of entries) {
|
|
214
|
+
if (!entry.isDirectory()) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const storageDir = (0, node_path_1.join)(workspaceStorage, entry.name);
|
|
218
|
+
const workspaceJsonPath = (0, node_path_1.join)(storageDir, "workspace.json");
|
|
219
|
+
const stateFilePath = (0, node_path_1.join)(storageDir, "state.vscdb");
|
|
220
|
+
const backupFilePath = (0, node_path_1.join)(storageDir, "state.vscdb.backup");
|
|
221
|
+
if (!await pathExists(workspaceJsonPath) || !await pathExists(stateFilePath)) {
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
try {
|
|
225
|
+
const rawWorkspace = JSON.parse(await (0, promises_1.readFile)(workspaceJsonPath, "utf8"));
|
|
226
|
+
const root = decodeCursorWorkspaceFolderUri(rawWorkspace.folder);
|
|
227
|
+
if (!root) {
|
|
228
|
+
continue;
|
|
229
|
+
}
|
|
230
|
+
const stateStats = await (0, promises_1.stat)(stateFilePath).catch(() => null);
|
|
231
|
+
const backupStats = await (0, promises_1.stat)(backupFilePath).catch(() => null);
|
|
232
|
+
const workspaceStats = await (0, promises_1.stat)(workspaceJsonPath).catch(() => null);
|
|
233
|
+
const updatedAtMs = Math.max(stateStats?.mtimeMs ?? 0, backupStats?.mtimeMs ?? 0, workspaceStats?.mtimeMs ?? 0);
|
|
234
|
+
workspaces.push({
|
|
235
|
+
id: entry.name,
|
|
236
|
+
root,
|
|
237
|
+
label: (0, project_paths_1.projectLabelFromRoot)(root),
|
|
238
|
+
stateFilePath,
|
|
239
|
+
backupFilePath,
|
|
240
|
+
updatedAtMs
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
catch {
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return workspaces
|
|
248
|
+
.sort((left, right) => right.updatedAtMs - left.updatedAtMs)
|
|
249
|
+
.slice(0, limit);
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=local-discovery.js.map
|