@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.
Files changed (178) hide show
  1. package/dist/adapters/claude.d.ts +2 -0
  2. package/dist/adapters/claude.js +43 -0
  3. package/dist/adapters/claude.js.map +1 -0
  4. package/dist/adapters/codex-cloud.d.ts +4 -0
  5. package/dist/adapters/codex-cloud.js +80 -0
  6. package/dist/adapters/codex-cloud.js.map +1 -0
  7. package/dist/adapters/codex-local.d.ts +17 -0
  8. package/dist/adapters/codex-local.js +180 -0
  9. package/dist/adapters/codex-local.js.map +1 -0
  10. package/dist/adapters/cursor-cloud.d.ts +2 -0
  11. package/dist/adapters/cursor-cloud.js +54 -0
  12. package/dist/adapters/cursor-cloud.js.map +1 -0
  13. package/dist/adapters/cursor-local.d.ts +2 -0
  14. package/dist/adapters/cursor-local.js +37 -0
  15. package/dist/adapters/cursor-local.js.map +1 -0
  16. package/dist/adapters/helpers.d.ts +15 -0
  17. package/dist/adapters/helpers.js +33 -0
  18. package/dist/adapters/helpers.js.map +1 -0
  19. package/dist/adapters/hermes.d.ts +2 -0
  20. package/dist/adapters/hermes.js +41 -0
  21. package/dist/adapters/hermes.js.map +1 -0
  22. package/dist/adapters/index.d.ts +2 -0
  23. package/dist/adapters/index.js +37 -0
  24. package/dist/adapters/index.js.map +1 -0
  25. package/dist/adapters/openclaw.d.ts +2 -0
  26. package/dist/adapters/openclaw.js +41 -0
  27. package/dist/adapters/openclaw.js.map +1 -0
  28. package/dist/adapters/presence.d.ts +2 -0
  29. package/dist/adapters/presence.js +36 -0
  30. package/dist/adapters/presence.js.map +1 -0
  31. package/dist/adapters/static-source.d.ts +15 -0
  32. package/dist/adapters/static-source.js +41 -0
  33. package/dist/adapters/static-source.js.map +1 -0
  34. package/dist/adapters/types.d.ts +44 -0
  35. package/dist/adapters/types.js +3 -0
  36. package/dist/adapters/types.js.map +1 -0
  37. package/dist/app-server.d.ts +94 -0
  38. package/dist/app-server.js +382 -0
  39. package/dist/app-server.js.map +1 -0
  40. package/dist/app-settings.d.ts +52 -0
  41. package/dist/app-settings.js +268 -0
  42. package/dist/app-settings.js.map +1 -0
  43. package/dist/appearance.d.ts +6 -0
  44. package/dist/appearance.js +84 -0
  45. package/dist/appearance.js.map +1 -0
  46. package/dist/aseprite.d.ts +4 -0
  47. package/dist/aseprite.js +42 -0
  48. package/dist/aseprite.js.map +1 -0
  49. package/dist/claude-agent-sdk.d.ts +44 -0
  50. package/dist/claude-agent-sdk.js +347 -0
  51. package/dist/claude-agent-sdk.js.map +1 -0
  52. package/dist/claude-home-cache.d.ts +61 -0
  53. package/dist/claude-home-cache.js +438 -0
  54. package/dist/claude-home-cache.js.map +1 -0
  55. package/dist/claude.d.ts +154 -0
  56. package/dist/claude.js +3495 -0
  57. package/dist/claude.js.map +1 -0
  58. package/dist/cloud.d.ts +2 -0
  59. package/dist/cloud.js +25 -0
  60. package/dist/cloud.js.map +1 -0
  61. package/dist/codex-command.d.ts +25 -0
  62. package/dist/codex-command.js +235 -0
  63. package/dist/codex-command.js.map +1 -0
  64. package/dist/codex-session-files.d.ts +8 -0
  65. package/dist/codex-session-files.js +509 -0
  66. package/dist/codex-session-files.js.map +1 -0
  67. package/dist/codex-thread-query.d.ts +14 -0
  68. package/dist/codex-thread-query.js +82 -0
  69. package/dist/codex-thread-query.js.map +1 -0
  70. package/dist/cursor-cloud-data.d.ts +34 -0
  71. package/dist/cursor-cloud-data.js +344 -0
  72. package/dist/cursor-cloud-data.js.map +1 -0
  73. package/dist/cursor-lib/local-discovery.d.ts +17 -0
  74. package/dist/cursor-lib/local-discovery.js +251 -0
  75. package/dist/cursor-lib/local-discovery.js.map +1 -0
  76. package/dist/cursor-lib/shared.d.ts +5 -0
  77. package/dist/cursor-lib/shared.js +88 -0
  78. package/dist/cursor-lib/shared.js.map +1 -0
  79. package/dist/cursor.d.ts +8 -0
  80. package/dist/cursor.js +1584 -0
  81. package/dist/cursor.js.map +1 -0
  82. package/dist/domain/codex-turn-semantics.d.ts +4 -0
  83. package/dist/domain/codex-turn-semantics.js +49 -0
  84. package/dist/domain/codex-turn-semantics.js.map +1 -0
  85. package/dist/domain/workload-policy.d.ts +8 -0
  86. package/dist/domain/workload-policy.js +268 -0
  87. package/dist/domain/workload-policy.js.map +1 -0
  88. package/dist/domain/workspace-activity.d.ts +10 -0
  89. package/dist/domain/workspace-activity.js +372 -0
  90. package/dist/domain/workspace-activity.js.map +1 -0
  91. package/dist/goal.d.ts +11 -0
  92. package/dist/goal.js +76 -0
  93. package/dist/goal.js.map +1 -0
  94. package/dist/hermes-hook-install.d.ts +12 -0
  95. package/dist/hermes-hook-install.js +335 -0
  96. package/dist/hermes-hook-install.js.map +1 -0
  97. package/dist/hermes.d.ts +97 -0
  98. package/dist/hermes.js +2446 -0
  99. package/dist/hermes.js.map +1 -0
  100. package/dist/index.d.ts +28 -0
  101. package/dist/index.js +47 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/live-monitor-lib/events.d.ts +43 -0
  104. package/dist/live-monitor-lib/events.js +1463 -0
  105. package/dist/live-monitor-lib/events.js.map +1 -0
  106. package/dist/live-monitor-lib/rollout-hooks.d.ts +13 -0
  107. package/dist/live-monitor-lib/rollout-hooks.js +253 -0
  108. package/dist/live-monitor-lib/rollout-hooks.js.map +1 -0
  109. package/dist/live-monitor.d.ts +102 -0
  110. package/dist/live-monitor.js +1461 -0
  111. package/dist/live-monitor.js.map +1 -0
  112. package/dist/local-thread-selection.d.ts +2 -0
  113. package/dist/local-thread-selection.js +58 -0
  114. package/dist/local-thread-selection.js.map +1 -0
  115. package/dist/openclaw.d.ts +41 -0
  116. package/dist/openclaw.js +715 -0
  117. package/dist/openclaw.js.map +1 -0
  118. package/dist/presence.d.ts +9 -0
  119. package/dist/presence.js +108 -0
  120. package/dist/presence.js.map +1 -0
  121. package/dist/project-identity.d.ts +7 -0
  122. package/dist/project-identity.js +162 -0
  123. package/dist/project-identity.js.map +1 -0
  124. package/dist/project-paths.d.ts +23 -0
  125. package/dist/project-paths.js +394 -0
  126. package/dist/project-paths.js.map +1 -0
  127. package/dist/project-storage.d.ts +7 -0
  128. package/dist/project-storage.js +79 -0
  129. package/dist/project-storage.js.map +1 -0
  130. package/dist/room-config.d.ts +21 -0
  131. package/dist/room-config.js +230 -0
  132. package/dist/room-config.js.map +1 -0
  133. package/dist/services/project-discovery.d.ts +1 -0
  134. package/dist/services/project-discovery.js +16 -0
  135. package/dist/services/project-discovery.js.map +1 -0
  136. package/dist/services/project-live-monitor.d.ts +1 -0
  137. package/dist/services/project-live-monitor.js +6 -0
  138. package/dist/services/project-live-monitor.js.map +1 -0
  139. package/dist/services/project-snapshot-coordinator.d.ts +49 -0
  140. package/dist/services/project-snapshot-coordinator.js +152 -0
  141. package/dist/services/project-snapshot-coordinator.js.map +1 -0
  142. package/dist/services/refresh-scheduler.d.ts +8 -0
  143. package/dist/services/refresh-scheduler.js +44 -0
  144. package/dist/services/refresh-scheduler.js.map +1 -0
  145. package/dist/services/snapshot-assembler.d.ts +8 -0
  146. package/dist/services/snapshot-assembler.js +167 -0
  147. package/dist/services/snapshot-assembler.js.map +1 -0
  148. package/dist/services/thread-store.d.ts +4 -0
  149. package/dist/services/thread-store.js +8 -0
  150. package/dist/services/thread-store.js.map +1 -0
  151. package/dist/snapshot-lib/activity-summary.d.ts +3 -0
  152. package/dist/snapshot-lib/activity-summary.js +220 -0
  153. package/dist/snapshot-lib/activity-summary.js.map +1 -0
  154. package/dist/snapshot-lib/dashboard-builder.d.ts +21 -0
  155. package/dist/snapshot-lib/dashboard-builder.js +146 -0
  156. package/dist/snapshot-lib/dashboard-builder.js.map +1 -0
  157. package/dist/snapshot-lib/thread-summary.d.ts +27 -0
  158. package/dist/snapshot-lib/thread-summary.js +953 -0
  159. package/dist/snapshot-lib/thread-summary.js.map +1 -0
  160. package/dist/snapshot.d.ts +2 -0
  161. package/dist/snapshot.js +21 -0
  162. package/dist/snapshot.js.map +1 -0
  163. package/dist/types.d.ts +368 -0
  164. package/dist/types.js +3 -0
  165. package/dist/types.js.map +1 -0
  166. package/dist/utils/json.d.ts +4 -0
  167. package/dist/utils/json.js +29 -0
  168. package/dist/utils/json.js.map +1 -0
  169. package/dist/utils/text.d.ts +3 -0
  170. package/dist/utils/text.js +26 -0
  171. package/dist/utils/text.js.map +1 -0
  172. package/dist/web-search.d.ts +1 -0
  173. package/dist/web-search.js +52 -0
  174. package/dist/web-search.js.map +1 -0
  175. package/dist/workload.d.ts +1 -0
  176. package/dist/workload.js +12 -0
  177. package/dist/workload.js.map +1 -0
  178. package/package.json +19 -0
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleProjectSnapshot = assembleProjectSnapshot;
4
+ const node_child_process_1 = require("node:child_process");
5
+ const node_util_1 = require("node:util");
6
+ const app_settings_1 = require("../app-settings");
7
+ const room_config_1 = require("../room-config");
8
+ const project_identity_1 = require("../project-identity");
9
+ const workload_policy_1 = require("../domain/workload-policy");
10
+ const workspace_activity_1 = require("../domain/workspace-activity");
11
+ const activity_summary_1 = require("../snapshot-lib/activity-summary");
12
+ const project_paths_1 = require("../project-paths");
13
+ const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
14
+ function normalizeAgentRoomIds(agents, input) {
15
+ return agents.map((agent) => ({
16
+ ...agent,
17
+ roomId: (0, room_config_1.findRoomForPaths)(input.roomConfig, input.projectRoot, agent.paths)
18
+ }));
19
+ }
20
+ function aggregateEvents(snapshots) {
21
+ return snapshots
22
+ .flatMap((snapshot) => snapshot.events)
23
+ .filter((event) => {
24
+ const createdAtMs = Date.parse(event.createdAt);
25
+ return Number.isFinite(createdAtMs) && Date.now() - createdAtMs <= 2 * 60 * 1000;
26
+ })
27
+ .sort((left, right) => right.createdAt.localeCompare(left.createdAt));
28
+ }
29
+ function aggregateNotes(snapshots) {
30
+ return Array.from(new Set(snapshots.flatMap((snapshot) => snapshot.notes).filter(Boolean)));
31
+ }
32
+ function aggregateCloudTasks(snapshots) {
33
+ return snapshots.flatMap((snapshot) => snapshot.cloudTasks ?? []);
34
+ }
35
+ function parseGitStatusPath(line) {
36
+ const rawPath = line.slice(3).trim();
37
+ if (!rawPath) {
38
+ return null;
39
+ }
40
+ const renamedPath = rawPath.includes(" -> ") ? rawPath.split(" -> ").pop() : rawPath;
41
+ return renamedPath?.replace(/^"|"$/g, "") || null;
42
+ }
43
+ async function changedProjectPaths(projectRoot) {
44
+ try {
45
+ const { stdout } = await execFileAsync("git", ["-C", projectRoot, "status", "--porcelain=v1", "--untracked-files=no"], { timeout: 750, maxBuffer: 256 * 1024 });
46
+ return stdout
47
+ .split(/\r?\n/)
48
+ .map((line) => parseGitStatusPath(line))
49
+ .filter((path) => Boolean(path))
50
+ .slice(0, 12);
51
+ }
52
+ catch {
53
+ return [];
54
+ }
55
+ }
56
+ const HOT_CHANGE_AGENT_DIAGNOSTIC_WINDOW_MS = 3 * 60 * 1000;
57
+ function normalizePathForMatch(value) {
58
+ return typeof value === "string" ? value.replace(/\\/g, "/").replace(/\/+/g, "/").replace(/\/$/g, "") : "";
59
+ }
60
+ function pathRelativeToProject(path, projectRoot) {
61
+ const normalizedPath = normalizePathForMatch(path);
62
+ const normalizedRoot = normalizePathForMatch(projectRoot);
63
+ if (!normalizedPath || !normalizedRoot) {
64
+ return normalizedPath;
65
+ }
66
+ const lowerPath = normalizedPath.toLowerCase();
67
+ const lowerRoot = normalizedRoot.toLowerCase();
68
+ if (lowerPath === lowerRoot) {
69
+ return "";
70
+ }
71
+ if (lowerPath.startsWith(`${lowerRoot}/`)) {
72
+ return normalizedPath.slice(normalizedRoot.length + 1);
73
+ }
74
+ return normalizedPath;
75
+ }
76
+ function pathsReferToSameFile(left, right, projectRoot) {
77
+ const leftRelative = pathRelativeToProject(left, projectRoot);
78
+ const rightRelative = pathRelativeToProject(right, projectRoot);
79
+ if (!leftRelative || !rightRelative) {
80
+ return false;
81
+ }
82
+ const leftLower = leftRelative.toLowerCase();
83
+ const rightLower = rightRelative.toLowerCase();
84
+ return leftLower === rightLower
85
+ || leftLower.endsWith(`/${rightLower}`)
86
+ || rightLower.endsWith(`/${leftLower}`);
87
+ }
88
+ function freshUnseatedHotChangeAgentDiagnostics(snapshot, now) {
89
+ const notes = [];
90
+ const hotChanges = snapshot.activity.hotChanges.filter((entry) => entry.agents.length === 0);
91
+ if (hotChanges.length === 0) {
92
+ return notes;
93
+ }
94
+ for (const hotChange of hotChanges) {
95
+ const matchingAgent = snapshot.agents.find((agent) => {
96
+ if (agent.source !== "local"
97
+ || agent.isCurrent
98
+ || agent.isOngoing
99
+ || agent.statusText === "active"
100
+ || agent.threadId === null) {
101
+ return false;
102
+ }
103
+ const updatedAtMs = Date.parse(agent.updatedAt);
104
+ if (!Number.isFinite(updatedAtMs) || now - updatedAtMs > HOT_CHANGE_AGENT_DIAGNOSTIC_WINDOW_MS) {
105
+ return false;
106
+ }
107
+ return agent.paths.some((path) => pathsReferToSameFile(path, hotChange.path, snapshot.projectRoot));
108
+ });
109
+ if (!matchingAgent) {
110
+ continue;
111
+ }
112
+ notes.push(`Hot change ${hotChange.label} has no agent attribution, but fresh local Codex thread ${matchingAgent.threadId} matches the path and is not current (status=${matchingAgent.statusText ?? "unknown"}, state=${matchingAgent.state}, ongoing=${matchingAgent.isOngoing}).`);
113
+ if (notes.length >= 3) {
114
+ break;
115
+ }
116
+ }
117
+ return notes;
118
+ }
119
+ async function assembleProjectSnapshot(input) {
120
+ const generatedAt = input.generatedAt ?? new Date().toISOString();
121
+ const projectRoot = input.projectRoot;
122
+ const appearanceSettings = (0, app_settings_1.describeStoredAppearanceSettings)();
123
+ const [projectIdentity, roomConfig] = await Promise.all([
124
+ (0, project_identity_1.resolveProjectIdentity)(projectRoot),
125
+ (0, room_config_1.loadRoomConfig)(projectRoot)
126
+ ]);
127
+ const now = input.currentnessNow ?? Date.now();
128
+ const projectLabel = projectIdentity?.worktreeName && projectIdentity.gitRoot
129
+ ? (0, project_paths_1.projectLabelFromRoot)(projectIdentity.gitRoot)
130
+ : (0, project_paths_1.projectLabelFromRoot)(projectRoot);
131
+ const events = aggregateEvents(input.adapterSnapshots);
132
+ const agents = normalizeAgentRoomIds(input.adapterSnapshots
133
+ .flatMap((snapshot) => snapshot.agents)
134
+ .map((agent) => ({
135
+ ...agent,
136
+ hatId: appearanceSettings.hatId
137
+ })), { projectRoot, roomConfig });
138
+ const agentsWithActivitySummary = (0, activity_summary_1.summarizeActivityByAgent)(agents, events, now);
139
+ const cloudTasks = aggregateCloudTasks(input.adapterSnapshots);
140
+ const rawEvents = input.adapterSnapshots.flatMap((snapshot) => snapshot.events);
141
+ const changedPaths = await changedProjectPaths(projectRoot);
142
+ const activity = (0, workspace_activity_1.buildWorkspaceActivitySnapshot)({
143
+ events: rawEvents,
144
+ agents: agentsWithActivitySummary,
145
+ generatedAt,
146
+ now,
147
+ changedPaths,
148
+ projectBranch: projectIdentity?.branch ?? null
149
+ });
150
+ const snapshot = (0, workload_policy_1.applyCurrentWorkloadState)({
151
+ projectRoot,
152
+ projectLabel,
153
+ projectIdentity,
154
+ generatedAt,
155
+ rooms: roomConfig,
156
+ agents: agentsWithActivitySummary,
157
+ cloudTasks,
158
+ events,
159
+ activity,
160
+ notes: aggregateNotes(input.adapterSnapshots)
161
+ }, now);
162
+ const diagnostics = freshUnseatedHotChangeAgentDiagnostics(snapshot, now);
163
+ return diagnostics.length > 0
164
+ ? { ...snapshot, notes: [...snapshot.notes, ...diagnostics] }
165
+ : snapshot;
166
+ }
167
+ //# sourceMappingURL=snapshot-assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-assembler.js","sourceRoot":"","sources":["../../src/services/snapshot-assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ProjectLiveMonitor, type ProjectLiveMonitorOptions } from "../live-monitor";
2
+ export type CodexThreadStoreOptions = ProjectLiveMonitorOptions;
3
+ export declare class CodexThreadStore extends ProjectLiveMonitor {
4
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CodexThreadStore = void 0;
4
+ const live_monitor_1 = require("../live-monitor");
5
+ class CodexThreadStore extends live_monitor_1.ProjectLiveMonitor {
6
+ }
7
+ exports.CodexThreadStore = CodexThreadStore;
8
+ //# sourceMappingURL=thread-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-store.js","sourceRoot":"","sources":["../../src/services/thread-store.ts"],"names":[],"mappings":";;;AAAA,kDAAqF;AAIrF,MAAa,gBAAiB,SAAQ,iCAAkB;CAAG;AAA3D,4CAA2D"}
@@ -0,0 +1,3 @@
1
+ import type { AgentActivitySummary, DashboardAgent, DashboardEvent } from "../types";
2
+ export declare function summarizeAgentActivity(agent: DashboardAgent, events: DashboardEvent[], now?: number): AgentActivitySummary;
3
+ export declare function summarizeActivityByAgent(agents: DashboardAgent[], events: DashboardEvent[], now?: number): DashboardAgent[];
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.summarizeAgentActivity = summarizeAgentActivity;
4
+ exports.summarizeActivityByAgent = summarizeActivityByAgent;
5
+ const node_path_1 = require("node:path");
6
+ const text_1 = require("../utils/text");
7
+ const HOT_FILE_WINDOW_MS = 2 * 60 * 1000;
8
+ const RUNNING_COMMAND_WINDOW_MS = 5 * 60 * 1000;
9
+ const LONG_RUNNING_COMMAND_MS = 30 * 1000;
10
+ function eventTimeMs(event) {
11
+ const createdAtMs = Date.parse(event.createdAt);
12
+ return Number.isFinite(createdAtMs) ? createdAtMs : 0;
13
+ }
14
+ function isoFromMs(value) {
15
+ return new Date(value).toISOString();
16
+ }
17
+ function displayFileLabel(path, fallback) {
18
+ if (!path) {
19
+ return (0, text_1.shortenText)(fallback || "Files", 48);
20
+ }
21
+ return (0, text_1.shortenText)((0, node_path_1.basename)(path) || path, 48);
22
+ }
23
+ function summarizeHotFiles(events, now) {
24
+ const byPath = new Map();
25
+ for (const event of events) {
26
+ if (event.kind !== "fileChange") {
27
+ continue;
28
+ }
29
+ const createdAtMs = eventTimeMs(event);
30
+ if (createdAtMs <= 0 || now - createdAtMs > HOT_FILE_WINDOW_MS) {
31
+ continue;
32
+ }
33
+ const key = event.path || event.detail || event.title || "files";
34
+ const existing = byPath.get(key);
35
+ const linesAdded = typeof event.linesAdded === "number" && Number.isFinite(event.linesAdded)
36
+ ? event.linesAdded
37
+ : undefined;
38
+ const linesRemoved = typeof event.linesRemoved === "number" && Number.isFinite(event.linesRemoved)
39
+ ? event.linesRemoved
40
+ : undefined;
41
+ if (!existing) {
42
+ byPath.set(key, {
43
+ path: event.path,
44
+ label: displayFileLabel(event.path, event.detail || event.title),
45
+ action: event.action ?? "edited",
46
+ count: 1,
47
+ lastUpdatedAt: event.createdAt,
48
+ latestMs: createdAtMs,
49
+ linesAdded,
50
+ linesRemoved
51
+ });
52
+ continue;
53
+ }
54
+ existing.count += 1;
55
+ if (linesAdded !== undefined) {
56
+ existing.linesAdded = (existing.linesAdded ?? 0) + linesAdded;
57
+ }
58
+ if (linesRemoved !== undefined) {
59
+ existing.linesRemoved = (existing.linesRemoved ?? 0) + linesRemoved;
60
+ }
61
+ if (createdAtMs >= existing.latestMs) {
62
+ existing.path = event.path;
63
+ existing.label = displayFileLabel(event.path, event.detail || event.title);
64
+ existing.action = event.action ?? existing.action;
65
+ existing.lastUpdatedAt = event.createdAt;
66
+ existing.latestMs = createdAtMs;
67
+ }
68
+ }
69
+ return [...byPath.values()]
70
+ .sort((left, right) => right.count - left.count || right.latestMs - left.latestMs)
71
+ .slice(0, 3)
72
+ .map(({ latestMs: _latestMs, ...entry }) => entry);
73
+ }
74
+ function commandKey(event) {
75
+ return event.itemId || event.command || event.detail || event.title || event.id;
76
+ }
77
+ function summarizeRunningCommandFromEvents(events, now) {
78
+ const commandEvents = events
79
+ .filter((event) => event.kind === "command")
80
+ .filter((event) => {
81
+ const createdAtMs = eventTimeMs(event);
82
+ return createdAtMs > 0 && now - createdAtMs <= RUNNING_COMMAND_WINDOW_MS;
83
+ })
84
+ .sort((left, right) => eventTimeMs(left) - eventTimeMs(right));
85
+ if (commandEvents.length === 0) {
86
+ return null;
87
+ }
88
+ const groups = new Map();
89
+ for (const event of commandEvents) {
90
+ const key = commandKey(event);
91
+ groups.set(key, [...(groups.get(key) ?? []), event]);
92
+ }
93
+ const summaries = [...groups.values()]
94
+ .map((group) => {
95
+ const sorted = [...group].sort((left, right) => eventTimeMs(left) - eventTimeMs(right));
96
+ const last = sorted[sorted.length - 1];
97
+ if (!last) {
98
+ return null;
99
+ }
100
+ if (sorted.some((event) => event.phase === "completed" || event.phase === "failed" || event.phase === "interrupted")) {
101
+ return null;
102
+ }
103
+ const firstStarted = sorted.find((event) => event.phase === "started") ?? sorted[0];
104
+ const startedAtMs = eventTimeMs(firstStarted);
105
+ const updatedAtMs = eventTimeMs(last);
106
+ const command = last.command || last.detail || last.title;
107
+ if (!command) {
108
+ return null;
109
+ }
110
+ return {
111
+ command: (0, text_1.shortenText)(command, 140),
112
+ cwd: last.cwd ?? last.path,
113
+ startedAt: isoFromMs(startedAtMs),
114
+ updatedAt: isoFromMs(updatedAtMs),
115
+ elapsedMs: Math.max(0, now - startedAtMs),
116
+ isLongRunning: now - startedAtMs >= LONG_RUNNING_COMMAND_MS,
117
+ outputEvents: sorted.filter((event) => event.phase === "updated").length
118
+ };
119
+ })
120
+ .filter((entry) => Boolean(entry));
121
+ return summaries.sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt))[0] ?? null;
122
+ }
123
+ function summarizeRunningCommandFromAgent(agent, now) {
124
+ if (agent.activityEvent?.type !== "commandExecution") {
125
+ return null;
126
+ }
127
+ if (agent.state !== "running" && agent.state !== "validating") {
128
+ return null;
129
+ }
130
+ const updatedAtMs = Date.parse(agent.updatedAt);
131
+ if (!Number.isFinite(updatedAtMs)) {
132
+ return null;
133
+ }
134
+ const command = agent.activityEvent.title || agent.detail;
135
+ return {
136
+ command: (0, text_1.shortenText)(command || "Command", 140),
137
+ cwd: agent.activityEvent.path ?? agent.cwd,
138
+ startedAt: isoFromMs(updatedAtMs),
139
+ updatedAt: isoFromMs(updatedAtMs),
140
+ elapsedMs: Math.max(0, now - updatedAtMs),
141
+ isLongRunning: now - updatedAtMs >= LONG_RUNNING_COMMAND_MS,
142
+ outputEvents: 0
143
+ };
144
+ }
145
+ function summarizeBlockers(agent, runningCommand) {
146
+ const blockers = [];
147
+ if (agent.needsUser?.kind === "approval") {
148
+ blockers.push({
149
+ kind: "approval",
150
+ title: agent.needsUser.networkApprovalContext ? "Network approval" : "Needs approval",
151
+ detail: (0, text_1.shortenText)(agent.needsUser.command || agent.needsUser.reason || agent.detail || "Approval required", 120),
152
+ since: agent.updatedAt
153
+ });
154
+ }
155
+ else if (agent.needsUser?.kind === "input") {
156
+ const questionCount = Array.isArray(agent.needsUser.questions) ? agent.needsUser.questions.length : 0;
157
+ blockers.push({
158
+ kind: "input",
159
+ title: "Needs input",
160
+ detail: (0, text_1.shortenText)(agent.needsUser.reason || (questionCount > 0 ? `${questionCount} question${questionCount === 1 ? "" : "s"}` : agent.detail || "Input required"), 120),
161
+ since: agent.updatedAt
162
+ });
163
+ }
164
+ else if (agent.state === "blocked") {
165
+ blockers.push({
166
+ kind: "failure",
167
+ title: "Blocked",
168
+ detail: (0, text_1.shortenText)(agent.detail || agent.statusText || "Blocked", 120),
169
+ since: agent.updatedAt
170
+ });
171
+ }
172
+ if (runningCommand?.isLongRunning) {
173
+ blockers.push({
174
+ kind: "longCommand",
175
+ title: (0, text_1.looksLikeValidationCommand)(runningCommand.command) ? "Long validation" : "Long command",
176
+ detail: runningCommand.command,
177
+ since: runningCommand.startedAt
178
+ });
179
+ }
180
+ return blockers.slice(0, 3);
181
+ }
182
+ function summarizeAgentActivity(agent, events, now = Date.now()) {
183
+ const hotFiles = summarizeHotFiles(events, now);
184
+ const runningCommand = summarizeRunningCommandFromEvents(events, now)
185
+ ?? summarizeRunningCommandFromAgent(agent, now);
186
+ const blockers = summarizeBlockers(agent, runningCommand);
187
+ const updatedAtValues = [
188
+ ...hotFiles.map((file) => Date.parse(file.lastUpdatedAt)),
189
+ runningCommand ? Date.parse(runningCommand.updatedAt) : 0,
190
+ ...blockers.map((blocker) => Date.parse(blocker.since))
191
+ ].filter((value) => Number.isFinite(value) && value > 0);
192
+ return {
193
+ hotFiles,
194
+ runningCommand,
195
+ blockers,
196
+ updatedAt: updatedAtValues.length > 0 ? isoFromMs(Math.max(...updatedAtValues)) : null
197
+ };
198
+ }
199
+ function summarizeActivityByAgent(agents, events, now = Date.now()) {
200
+ const eventsByThreadId = new Map();
201
+ for (const event of events) {
202
+ if (!event.threadId) {
203
+ continue;
204
+ }
205
+ eventsByThreadId.set(event.threadId, [...(eventsByThreadId.get(event.threadId) ?? []), event]);
206
+ }
207
+ return agents.map((agent) => {
208
+ const summary = summarizeAgentActivity(agent, agent.threadId ? eventsByThreadId.get(agent.threadId) ?? [] : [], now);
209
+ if (summary.hotFiles.length === 0
210
+ && !summary.runningCommand
211
+ && summary.blockers.length === 0) {
212
+ return agent;
213
+ }
214
+ return {
215
+ ...agent,
216
+ activitySummary: summary
217
+ };
218
+ });
219
+ }
220
+ //# sourceMappingURL=activity-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-summary.js","sourceRoot":"","sources":["../../src/snapshot-lib/activity-summary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { ProjectSnapshotCoordinator } from "../services/project-snapshot-coordinator";
2
+ import type { AgentGoalState, CloudTask, DashboardSnapshot, NeedsUserState, SnapshotOptions, CodexThread, DashboardEvent } from "../types";
3
+ export declare function filterProjectCloudTasks(tasks: CloudTask[], projectRoot: string): CloudTask[];
4
+ export declare function buildDashboardSnapshotFromState(input: {
5
+ projectRoot: string;
6
+ threads: CodexThread[];
7
+ cloudTasks?: CloudTask[];
8
+ events?: DashboardEvent[];
9
+ notes?: string[];
10
+ needsUserByThreadId?: Map<string, NeedsUserState>;
11
+ goalsByThreadId?: Map<string, AgentGoalState>;
12
+ subscribedThreadIds?: Set<string>;
13
+ stoppedAtByThreadId?: Map<string, number>;
14
+ ongoingThreadIds?: Set<string>;
15
+ }): Promise<DashboardSnapshot>;
16
+ export declare function createProjectSnapshotCoordinator(options: {
17
+ projectRoot: string;
18
+ localLimit?: number;
19
+ includeManagedCloud?: boolean;
20
+ }): Promise<ProjectSnapshotCoordinator>;
21
+ export declare function buildDashboardSnapshot(options: SnapshotOptions): Promise<DashboardSnapshot>;
@@ -0,0 +1,146 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.filterProjectCloudTasks = filterProjectCloudTasks;
37
+ exports.buildDashboardSnapshotFromState = buildDashboardSnapshotFromState;
38
+ exports.createProjectSnapshotCoordinator = createProjectSnapshotCoordinator;
39
+ exports.buildDashboardSnapshot = buildDashboardSnapshot;
40
+ const node_path_1 = require("node:path");
41
+ const app_server_1 = require("../app-server");
42
+ const codex_thread_query_1 = require("../codex-thread-query");
43
+ const snapshot_assembler_1 = require("../services/snapshot-assembler");
44
+ const project_snapshot_coordinator_1 = require("../services/project-snapshot-coordinator");
45
+ const DEFAULT_LOCAL_THREAD_LIMIT = 24;
46
+ function filterProjectCloudTasks(tasks, projectRoot) {
47
+ return tasks.filter((task) => {
48
+ const label = task.environmentLabel?.toLowerCase();
49
+ if (!label) {
50
+ return false;
51
+ }
52
+ return label.includes((0, node_path_1.basename)(projectRoot).toLowerCase());
53
+ });
54
+ }
55
+ async function buildLocalAgents(projectRoot, localLimit, notes, readThreads = true) {
56
+ try {
57
+ return await (0, app_server_1.withAppServerClient)(async (client) => {
58
+ const query = await (0, codex_thread_query_1.listCodexProjectThreadCandidates)({
59
+ client,
60
+ projectRoot,
61
+ localLimit
62
+ });
63
+ if (query.usedUnscopedFallback) {
64
+ notes.push("Local Codex cwd filter returned no project threads; used unscoped Windows path fallback.");
65
+ }
66
+ const threads = query.trackedThreads;
67
+ if (!readThreads) {
68
+ return threads;
69
+ }
70
+ return Promise.all(threads.map(async (thread) => mergeListedThreadMetadata(await (0, codex_thread_query_1.readCodexThreadWithTimeout)(client, thread.id).catch(() => thread), thread)));
71
+ });
72
+ }
73
+ catch (error) {
74
+ const message = error instanceof Error ? error.message : String(error);
75
+ notes.push(`Local Codex app-server unavailable: ${message}`);
76
+ return [];
77
+ }
78
+ }
79
+ function mergeListedThreadMetadata(thread, listedThread) {
80
+ return {
81
+ ...thread,
82
+ status: listedThread.status,
83
+ updatedAt: Math.max(thread.updatedAt, listedThread.updatedAt),
84
+ path: listedThread.path ?? thread.path
85
+ };
86
+ }
87
+ async function buildDashboardSnapshotFromState(input) {
88
+ const coordinator = await createProjectSnapshotCoordinator({
89
+ projectRoot: input.projectRoot,
90
+ includeManagedCloud: input.cloudTasks === undefined
91
+ });
92
+ try {
93
+ const snapshot = await coordinator.buildSnapshot(input);
94
+ if (!snapshot) {
95
+ throw new Error("One-shot snapshot build was superseded unexpectedly.");
96
+ }
97
+ return snapshot;
98
+ }
99
+ finally {
100
+ await coordinator.dispose();
101
+ }
102
+ }
103
+ async function createProjectSnapshotCoordinator(options) {
104
+ const [{ buildCodexLocalAdapterSnapshotFromState }, { cloudTasksToAgents, codexCloudAdapter }, { claudeAdapter }, { cursorCloudAdapter }, { cursorLocalAdapter }, { hermesAdapter }, { openClawAdapter }, { presenceAdapter }] = await Promise.all([
105
+ Promise.resolve().then(() => __importStar(require("../adapters/codex-local"))),
106
+ Promise.resolve().then(() => __importStar(require("../adapters/codex-cloud"))),
107
+ Promise.resolve().then(() => __importStar(require("../adapters/claude"))),
108
+ Promise.resolve().then(() => __importStar(require("../adapters/cursor-cloud"))),
109
+ Promise.resolve().then(() => __importStar(require("../adapters/cursor-local"))),
110
+ Promise.resolve().then(() => __importStar(require("../adapters/hermes"))),
111
+ Promise.resolve().then(() => __importStar(require("../adapters/openclaw"))),
112
+ Promise.resolve().then(() => __importStar(require("../adapters/presence")))
113
+ ]);
114
+ const staticSourceContexts = {
115
+ projectRoot: options.projectRoot,
116
+ localLimit: options.localLimit ?? DEFAULT_LOCAL_THREAD_LIMIT,
117
+ readThreads: true
118
+ };
119
+ const secondarySources = [
120
+ options.includeManagedCloud ? codexCloudAdapter.createSource(staticSourceContexts) : null,
121
+ claudeAdapter.createSource(staticSourceContexts),
122
+ cursorLocalAdapter.createSource(staticSourceContexts),
123
+ cursorCloudAdapter.createSource(staticSourceContexts),
124
+ hermesAdapter.createSource(staticSourceContexts),
125
+ openClawAdapter.createSource(staticSourceContexts),
126
+ presenceAdapter.createSource(staticSourceContexts)
127
+ ].filter((source) => source !== null);
128
+ return new project_snapshot_coordinator_1.ProjectSnapshotCoordinator(options.projectRoot, {
129
+ secondarySources,
130
+ buildLocalSnapshot: buildCodexLocalAdapterSnapshotFromState,
131
+ cloudTasksToAgents,
132
+ assemble: snapshot_assembler_1.assembleProjectSnapshot
133
+ });
134
+ }
135
+ async function buildDashboardSnapshot(options) {
136
+ const notes = [];
137
+ const threads = await buildLocalAgents(options.projectRoot, options.localLimit ?? DEFAULT_LOCAL_THREAD_LIMIT, notes, options.readThreads !== false);
138
+ const initialCloudTasks = options.includeCloud === false ? [] : undefined;
139
+ return buildDashboardSnapshotFromState({
140
+ projectRoot: options.projectRoot,
141
+ threads,
142
+ cloudTasks: initialCloudTasks,
143
+ notes
144
+ });
145
+ }
146
+ //# sourceMappingURL=dashboard-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-builder.js","sourceRoot":"","sources":["../../src/snapshot-lib/dashboard-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { AgentActivityEvent, ActivityState, CodexThread, DashboardEvent } from "../types";
2
+ export declare function formatGoalCommandLabel(value: string): string;
3
+ export declare function pickThreadLabel(thread: CodexThread): string;
4
+ export declare function latestAgentMessageForThread(thread: CodexThread): string | null;
5
+ export declare function syncSummaryWithLatestThreadMessage(thread: CodexThread, summary: ReturnType<typeof summariseThread>, recentEvents?: DashboardEvent[]): {
6
+ latestMessage: string | null;
7
+ summary: ReturnType<typeof summariseThread>;
8
+ };
9
+ export declare function parseThreadSourceMeta(thread: CodexThread): {
10
+ sourceKind: string;
11
+ parentThreadId: string | null;
12
+ depth: number;
13
+ agentNickname: string | null;
14
+ agentRole: string | null;
15
+ };
16
+ export declare function parentThreadIdForThread(thread: CodexThread): string | null;
17
+ export declare function isStaleActiveSubagentThread(thread: CodexThread, nowMs?: number): boolean;
18
+ export declare function inferThreadAgentRole(thread: CodexThread, sourceKind: string): string | null;
19
+ export declare function isOngoingThread(thread: CodexThread): boolean;
20
+ export declare function summariseThread(thread: CodexThread): {
21
+ state: ActivityState;
22
+ detail: string;
23
+ paths: string[];
24
+ activityEvent: AgentActivityEvent | null;
25
+ };
26
+ export declare function buildActivityEventFromDashboardEvent(event: DashboardEvent): AgentActivityEvent | null;
27
+ export declare function applyRecentActivityEvent(thread: CodexThread, summary: ReturnType<typeof summariseThread>, recentEvents: DashboardEvent[]): ReturnType<typeof summariseThread>;