@agent-link/agent 0.1.84 → 0.1.86

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.
@@ -0,0 +1,103 @@
1
+ // ── Filesystem handlers for directory listing, file reading, workdir changes ──
2
+ import os from 'os';
3
+ import { existsSync } from 'fs';
4
+ import { readdir, stat } from 'fs/promises';
5
+ import { resolve, isAbsolute, basename } from 'path';
6
+ import { readFileForPreview } from './file-readers.js';
7
+ export async function handleListDirectory(msg, workDir, send) {
8
+ const dirPath = msg.dirPath || '';
9
+ const source = msg.source;
10
+ try {
11
+ // Empty path: list drives (Windows) or root (Unix)
12
+ if (!dirPath) {
13
+ if (os.platform() === 'win32') {
14
+ const drives = [];
15
+ for (const letter of 'CDEFGHIJKLMNOPQRSTUVWXYZ') {
16
+ const drivePath = letter + ':\\';
17
+ if (existsSync(drivePath)) {
18
+ drives.push({ name: letter + ':', type: 'directory' });
19
+ }
20
+ }
21
+ send({ type: 'directory_listing', dirPath: '', entries: drives, source });
22
+ return;
23
+ }
24
+ // Unix: list root
25
+ const entries = await listDirectoryEntries('/');
26
+ send({ type: 'directory_listing', dirPath: '/', entries, source });
27
+ return;
28
+ }
29
+ const resolved = isAbsolute(dirPath) ? resolve(dirPath) : resolve(workDir, dirPath);
30
+ const entries = await listDirectoryEntries(resolved);
31
+ send({ type: 'directory_listing', dirPath: resolved, entries, source });
32
+ }
33
+ catch (err) {
34
+ const error = err;
35
+ send({ type: 'directory_listing', dirPath, entries: [], error: error.message, source });
36
+ }
37
+ }
38
+ export async function listDirectoryEntries(dirPath) {
39
+ const items = await readdir(dirPath, { withFileTypes: true });
40
+ const entries = [];
41
+ for (const item of items) {
42
+ if (item.name.startsWith('.'))
43
+ continue;
44
+ if (item.name === 'node_modules')
45
+ continue;
46
+ entries.push({
47
+ name: item.name,
48
+ type: item.isDirectory() ? 'directory' : 'file',
49
+ });
50
+ }
51
+ entries.sort((a, b) => {
52
+ if (a.type !== b.type)
53
+ return a.type === 'directory' ? -1 : 1;
54
+ return a.name.localeCompare(b.name);
55
+ });
56
+ return entries;
57
+ }
58
+ export async function handleReadFile(msg, workDir, send) {
59
+ const filePath = msg.filePath;
60
+ try {
61
+ const resolved = isAbsolute(filePath) ? resolve(filePath) : resolve(workDir, filePath);
62
+ const stats = await stat(resolved);
63
+ const result = await readFileForPreview(resolved, stats.size);
64
+ send({
65
+ type: 'file_content',
66
+ filePath: resolved,
67
+ fileName: result.fileName,
68
+ content: result.content,
69
+ encoding: result.encoding,
70
+ mimeType: result.mimeType,
71
+ truncated: result.truncated,
72
+ totalSize: stats.size,
73
+ });
74
+ }
75
+ catch (err) {
76
+ send({
77
+ type: 'file_content',
78
+ filePath,
79
+ fileName: basename(filePath),
80
+ content: null,
81
+ encoding: 'utf8',
82
+ mimeType: 'application/octet-stream',
83
+ truncated: false,
84
+ totalSize: 0,
85
+ error: err.message,
86
+ });
87
+ }
88
+ }
89
+ export function handleChangeWorkDir(msg, state, send, onListSessions) {
90
+ const newDir = msg.workDir;
91
+ if (!existsSync(newDir)) {
92
+ send({ type: 'error', message: `Directory does not exist: ${newDir}` });
93
+ return;
94
+ }
95
+ // Only update agent-side workDir — existing conversations keep running in their own workDir
96
+ state.workDir = newDir;
97
+ console.log(`[AgentLink] Working directory changed to: ${newDir}`);
98
+ // Notify web client (server intercepts to update its state)
99
+ send({ type: 'workdir_changed', workDir: newDir });
100
+ // Auto-refresh session list for new directory
101
+ onListSessions();
102
+ }
103
+ //# sourceMappingURL=directory-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"directory-handlers.js","sourceRoot":"","sources":["../src/directory-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Agent naming — fictional character pools and role classification.
3
+ */
4
+ import type { TeamState } from './team-types.js';
5
+ /**
6
+ * Get the next color for an agent (based on current count).
7
+ */
8
+ export declare function getNextAgentColor(team: TeamState): string;
9
+ /** Track which characters have been used in this team to avoid duplicates. */
10
+ export declare function pickCharacter(team: TeamState, category: string): string;
11
+ /**
12
+ * Classify a subagent's role from its tool input into a character category.
13
+ */
14
+ export declare function classifyRole(input: {
15
+ name?: string;
16
+ description?: string;
17
+ prompt?: string;
18
+ }): string;
19
+ /**
20
+ * Derive a fictional character name for a subagent based on its role.
21
+ */
22
+ export declare function deriveAgentDisplayName(team: TeamState, input: {
23
+ name?: string;
24
+ description?: string;
25
+ prompt?: string;
26
+ }): string;
27
+ /**
28
+ * Derive a human-readable task title from the Agent tool input.
29
+ * Used on the Kanban board to describe what the agent is working on.
30
+ */
31
+ export declare function deriveTaskTitle(input: {
32
+ name?: string;
33
+ description?: string;
34
+ prompt?: string;
35
+ }): string;
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Agent naming — fictional character pools and role classification.
3
+ */
4
+ // ── Color palette for auto-assigning agent colors ──────────────────────
5
+ const AGENT_COLORS = [
6
+ '#EF4444', // red (Lead)
7
+ '#EAB308', // yellow
8
+ '#3B82F6', // blue
9
+ '#10B981', // emerald
10
+ '#8B5CF6', // violet
11
+ '#F97316', // orange
12
+ '#EC4899', // pink
13
+ '#06B6D4', // cyan
14
+ '#84CC16', // lime
15
+ '#6366F1', // indigo
16
+ ];
17
+ /**
18
+ * Get the next color for an agent (based on current count).
19
+ */
20
+ export function getNextAgentColor(team) {
21
+ const idx = team.agents.size % AGENT_COLORS.length;
22
+ return AGENT_COLORS[idx];
23
+ }
24
+ /**
25
+ * Fictional character pools grouped by role archetype.
26
+ * Each subagent gets a character name that fits its role.
27
+ */
28
+ const CHARACTER_POOLS = {
29
+ builder: ['Tony Stark', 'Neo', 'Hiro Hamada', 'Rocket', 'Q'],
30
+ designer: ['Elsa', 'Remy', 'Edna Mode', 'Violet', 'WALL-E'],
31
+ tester: ['Sherlock', 'L', 'Conan', 'Poirot', 'Columbo'],
32
+ writer: ['Hermione', 'Gandalf', 'Dumbledore', 'Yoda', 'Jarvis'],
33
+ reviewer: ['Spock', 'Baymax', 'Alfred', 'Morpheus', 'Obi-Wan'],
34
+ debugger: ['MacGyver', 'Strange', 'Lelouch', 'House', 'Lupin'],
35
+ analyst: ['Data', 'Cortana', 'Oracle', 'Vision', 'Friday'],
36
+ ops: ['Scotty', 'R2-D2', 'BB-8', 'C-3PO', 'HAL'],
37
+ general: ['Aragorn', 'Leia', 'Zoro', 'Totoro', 'Pikachu'],
38
+ };
39
+ /** Track which characters have been used in this team to avoid duplicates. */
40
+ export function pickCharacter(team, category) {
41
+ const pool = CHARACTER_POOLS[category] || CHARACTER_POOLS.general;
42
+ const usedNames = new Set([...team.agents.values()].map(a => a.role.name));
43
+ // Find an unused character from the pool
44
+ for (const name of pool) {
45
+ if (!usedNames.has(name))
46
+ return name;
47
+ }
48
+ // Fallback: try other pools
49
+ for (const names of Object.values(CHARACTER_POOLS)) {
50
+ for (const name of names) {
51
+ if (!usedNames.has(name))
52
+ return name;
53
+ }
54
+ }
55
+ return `Agent ${team.agents.size}`;
56
+ }
57
+ /**
58
+ * Classify a subagent's role from its tool input into a character category.
59
+ */
60
+ export function classifyRole(input) {
61
+ const text = [input.name, input.description, input.prompt].filter(Boolean).join(' ').toLowerCase();
62
+ if (/\b(test|testing|qa|verify|validation|spec)\b/.test(text))
63
+ return 'tester';
64
+ if (/\b(review|audit|check|inspect|security|lint)\b/.test(text))
65
+ return 'reviewer';
66
+ if (/\b(debug|fix|bug|patch|troubleshoot|diagnose)\b/.test(text))
67
+ return 'debugger';
68
+ if (/\b(design|ui|ux|layout|style|css|visual|mockup)\b/.test(text))
69
+ return 'designer';
70
+ if (/\b(writ|doc|readme|comment|markdown|copy)\b/.test(text))
71
+ return 'writer';
72
+ if (/\b(analy|research|investigat|explor|study|benchmark)\b/.test(text))
73
+ return 'analyst';
74
+ if (/\b(deploy|ci|cd|devops|infra|docker|k8s|config|setup|install|pipeline)\b/.test(text))
75
+ return 'ops';
76
+ if (/\b(build|implement|creat|develop|code|program|engineer|construct|make|add)\b/.test(text))
77
+ return 'builder';
78
+ return 'general';
79
+ }
80
+ /**
81
+ * Derive a fictional character name for a subagent based on its role.
82
+ */
83
+ export function deriveAgentDisplayName(team, input) {
84
+ const category = classifyRole(input);
85
+ return pickCharacter(team, category);
86
+ }
87
+ /**
88
+ * Derive a human-readable task title from the Agent tool input.
89
+ * Used on the Kanban board to describe what the agent is working on.
90
+ */
91
+ export function deriveTaskTitle(input) {
92
+ // Short description → use directly
93
+ if (input.description && input.description.length <= 80) {
94
+ return input.description;
95
+ }
96
+ // Colon-prefixed description → use the full thing if ≤ 80, otherwise prefix
97
+ if (input.description) {
98
+ if (input.description.length <= 80)
99
+ return input.description;
100
+ const colonIdx = input.description.indexOf(':');
101
+ if (colonIdx > 0 && colonIdx <= 40) {
102
+ return input.description.slice(0, colonIdx).trim();
103
+ }
104
+ return input.description.slice(0, 77) + '...';
105
+ }
106
+ // Descriptive input.name (not a generic ID)
107
+ if (input.name && !/^(worker|agent|hypothesis)-\d+$/i.test(input.name)) {
108
+ return input.name;
109
+ }
110
+ // Extract from prompt
111
+ if (input.prompt) {
112
+ const first = input.prompt.split('\n')[0].trim();
113
+ if (first.length <= 80)
114
+ return first;
115
+ return first.slice(0, 77) + '...';
116
+ }
117
+ return input.name || 'Task';
118
+ }
119
+ //# sourceMappingURL=team-naming.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-naming.js","sourceRoot":"","sources":["../src/team-naming.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Team persistence — disk I/O, serialization, and team listing.
3
+ */
4
+ import type { TeamState, TeamStateSerialized, TeamSummaryInfo } from './team-types.js';
5
+ /**
6
+ * Serialize TeamState for persistence/transmission (Map → array).
7
+ */
8
+ export declare function serializeTeam(team: TeamState, includeMessages?: boolean): TeamStateSerialized;
9
+ /**
10
+ * Deserialize a TeamStateSerialized back into a live TeamState.
11
+ */
12
+ export declare function deserializeTeam(data: TeamStateSerialized): TeamState;
13
+ /**
14
+ * Persist team state to disk (atomic write: tmp → rename).
15
+ */
16
+ export declare function persistTeam(team: TeamState): void;
17
+ /**
18
+ * Debounced persist — coalesces rapid state changes into a single write.
19
+ * Flushes after 500ms of quiet.
20
+ */
21
+ export declare function persistTeamDebounced(team: TeamState): void;
22
+ /**
23
+ * Flush all pending debounced persists immediately.
24
+ * Needs the activeTeam reference to resolve teams by ID.
25
+ */
26
+ export declare function flushPendingPersists(activeTeam: TeamState | null): void;
27
+ /**
28
+ * Load a team from disk by teamId.
29
+ */
30
+ export declare function loadTeam(teamId: string): TeamState | null;
31
+ /**
32
+ * List all persisted teams, sorted by createdAt descending (newest first).
33
+ */
34
+ export declare function listTeams(workDir?: string): TeamSummaryInfo[];
35
+ /**
36
+ * Delete a persisted team file.
37
+ */
38
+ export declare function deleteTeam(teamId: string): boolean;
39
+ export declare function renameTeam(teamId: string, newTitle: string): boolean;
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Team persistence — disk I/O, serialization, and team listing.
3
+ */
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, readdirSync, renameSync, unlinkSync } from 'fs';
5
+ import { join } from 'path';
6
+ import { CONFIG_DIR } from './config.js';
7
+ const TEAMS_DIR = join(CONFIG_DIR, 'teams');
8
+ /**
9
+ * Serialize TeamState for persistence/transmission (Map → array).
10
+ */
11
+ export function serializeTeam(team, includeMessages = false) {
12
+ return {
13
+ teamId: team.teamId,
14
+ title: team.title,
15
+ config: team.config,
16
+ workDir: team.workDir,
17
+ conversationId: team.conversationId,
18
+ claudeSessionId: team.claudeSessionId,
19
+ agents: [...team.agents.entries()].map(([, agent]) => ({
20
+ id: agent.role.id,
21
+ name: agent.role.name,
22
+ color: agent.role.color,
23
+ toolUseId: agent.toolUseId,
24
+ agentTaskId: agent.agentTaskId,
25
+ status: agent.status,
26
+ currentTaskId: agent.currentTaskId,
27
+ ...(includeMessages ? { messages: agent.messages } : {}),
28
+ })),
29
+ tasks: team.tasks,
30
+ feed: team.feed,
31
+ status: team.status,
32
+ leadStatus: team.leadStatus,
33
+ summary: team.summary,
34
+ totalCost: team.totalCost,
35
+ durationMs: team.durationMs,
36
+ createdAt: team.createdAt,
37
+ };
38
+ }
39
+ function ensureTeamsDir() {
40
+ if (!existsSync(TEAMS_DIR)) {
41
+ mkdirSync(TEAMS_DIR, { recursive: true });
42
+ }
43
+ }
44
+ /**
45
+ * Deserialize a TeamStateSerialized back into a live TeamState.
46
+ */
47
+ export function deserializeTeam(data) {
48
+ const agents = new Map();
49
+ for (const a of data.agents) {
50
+ agents.set(a.id, {
51
+ role: { id: a.id, name: a.name, color: a.color },
52
+ toolUseId: a.toolUseId,
53
+ agentTaskId: a.agentTaskId,
54
+ status: a.status,
55
+ currentTaskId: a.currentTaskId,
56
+ messages: a.messages || [],
57
+ });
58
+ }
59
+ return {
60
+ teamId: data.teamId,
61
+ title: data.title,
62
+ config: data.config,
63
+ workDir: data.workDir || '',
64
+ conversationId: data.conversationId,
65
+ claudeSessionId: data.claudeSessionId,
66
+ agents,
67
+ tasks: data.tasks,
68
+ feed: data.feed,
69
+ status: data.status,
70
+ leadStatus: data.leadStatus || '',
71
+ summary: data.summary,
72
+ totalCost: data.totalCost,
73
+ durationMs: data.durationMs,
74
+ createdAt: data.createdAt,
75
+ };
76
+ }
77
+ /**
78
+ * Persist team state to disk (atomic write: tmp → rename).
79
+ */
80
+ export function persistTeam(team) {
81
+ ensureTeamsDir();
82
+ const serialized = serializeTeam(team, true);
83
+ const filePath = join(TEAMS_DIR, `${team.teamId}.json`);
84
+ const tmpPath = filePath + '.tmp';
85
+ writeFileSync(tmpPath, JSON.stringify(serialized, null, 2), 'utf-8');
86
+ renameSync(tmpPath, filePath);
87
+ }
88
+ // Debounce timers for persist calls per team
89
+ const persistTimers = new Map();
90
+ /**
91
+ * Debounced persist — coalesces rapid state changes into a single write.
92
+ * Flushes after 500ms of quiet.
93
+ */
94
+ export function persistTeamDebounced(team) {
95
+ const existing = persistTimers.get(team.teamId);
96
+ if (existing)
97
+ clearTimeout(existing);
98
+ persistTimers.set(team.teamId, setTimeout(() => {
99
+ persistTimers.delete(team.teamId);
100
+ persistTeam(team);
101
+ }, 500));
102
+ }
103
+ /**
104
+ * Flush all pending debounced persists immediately.
105
+ * Needs the activeTeam reference to resolve teams by ID.
106
+ */
107
+ export function flushPendingPersists(activeTeam) {
108
+ for (const [teamId, timer] of persistTimers.entries()) {
109
+ clearTimeout(timer);
110
+ persistTimers.delete(teamId);
111
+ if (activeTeam?.teamId === teamId) {
112
+ persistTeam(activeTeam);
113
+ }
114
+ }
115
+ }
116
+ /**
117
+ * Load a team from disk by teamId.
118
+ */
119
+ export function loadTeam(teamId) {
120
+ const filePath = join(TEAMS_DIR, `${teamId}.json`);
121
+ try {
122
+ const raw = readFileSync(filePath, 'utf-8');
123
+ const data = JSON.parse(raw);
124
+ return deserializeTeam(data);
125
+ }
126
+ catch {
127
+ return null;
128
+ }
129
+ }
130
+ /**
131
+ * List all persisted teams, sorted by createdAt descending (newest first).
132
+ */
133
+ export function listTeams(workDir) {
134
+ ensureTeamsDir();
135
+ const files = readdirSync(TEAMS_DIR).filter(f => f.endsWith('.json'));
136
+ const teams = [];
137
+ for (const file of files) {
138
+ try {
139
+ const raw = readFileSync(join(TEAMS_DIR, file), 'utf-8');
140
+ const data = JSON.parse(raw);
141
+ // Filter by workDir if specified; old teams without workDir always show
142
+ if (workDir && data.workDir && data.workDir !== workDir)
143
+ continue;
144
+ teams.push({
145
+ teamId: data.teamId,
146
+ title: data.title,
147
+ status: data.status,
148
+ template: data.config.template,
149
+ agentCount: data.agents.length,
150
+ taskCount: data.tasks.length,
151
+ totalCost: data.totalCost,
152
+ workDir: data.workDir,
153
+ createdAt: data.createdAt,
154
+ });
155
+ }
156
+ catch {
157
+ // Skip corrupted files
158
+ }
159
+ }
160
+ teams.sort((a, b) => b.createdAt - a.createdAt);
161
+ return teams;
162
+ }
163
+ /**
164
+ * Delete a persisted team file.
165
+ */
166
+ export function deleteTeam(teamId) {
167
+ const filePath = join(TEAMS_DIR, `${teamId}.json`);
168
+ try {
169
+ unlinkSync(filePath);
170
+ return true;
171
+ }
172
+ catch {
173
+ return false;
174
+ }
175
+ }
176
+ export function renameTeam(teamId, newTitle) {
177
+ const filePath = join(TEAMS_DIR, `${teamId}.json`);
178
+ try {
179
+ const raw = readFileSync(filePath, 'utf-8');
180
+ const data = JSON.parse(raw);
181
+ data.title = newTitle;
182
+ const tmpPath = filePath + '.tmp';
183
+ writeFileSync(tmpPath, JSON.stringify(data, null, 2), 'utf-8');
184
+ renameSync(tmpPath, filePath);
185
+ return true;
186
+ }
187
+ catch {
188
+ return false;
189
+ }
190
+ }
191
+ //# sourceMappingURL=team-persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team-persistence.js","sourceRoot":"","sources":["../src/team-persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Team template definitions — predefined agent roles and lead instructions.
3
+ */
4
+ import type { TeamConfig, AgentsDefMap } from './team-types.js';
5
+ /**
6
+ * Build the agents definition JSON for the --agents CLI flag.
7
+ */
8
+ export declare function buildAgentsDef(template?: string): AgentsDefMap;
9
+ /**
10
+ * Build the lead prompt that instructs the Lead to use Agent tool.
11
+ */
12
+ export declare function buildLeadPrompt(config: TeamConfig, agentsDef: AgentsDefMap): string;