@agentmeshhq/agent 0.4.2 → 0.4.4

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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/dist/__tests__/cli-command-uniqueness.test.d.ts +10 -0
  3. package/dist/__tests__/cli-command-uniqueness.test.js +67 -0
  4. package/dist/__tests__/cli-command-uniqueness.test.js.map +1 -0
  5. package/dist/__tests__/evicted-cleanup.test.d.ts +10 -0
  6. package/dist/__tests__/evicted-cleanup.test.js +459 -0
  7. package/dist/__tests__/evicted-cleanup.test.js.map +1 -0
  8. package/dist/__tests__/local.test.d.ts +1 -0
  9. package/dist/__tests__/local.test.js +124 -0
  10. package/dist/__tests__/local.test.js.map +1 -0
  11. package/dist/__tests__/tmux-send.test.d.ts +10 -0
  12. package/dist/__tests__/tmux-send.test.js +96 -0
  13. package/dist/__tests__/tmux-send.test.js.map +1 -0
  14. package/dist/cli/inbox.d.ts +5 -0
  15. package/dist/cli/inbox.js +123 -0
  16. package/dist/cli/inbox.js.map +1 -0
  17. package/dist/cli/index.js +263 -11
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/cli/issue.d.ts +42 -0
  20. package/dist/cli/issue.js +297 -0
  21. package/dist/cli/issue.js.map +1 -0
  22. package/dist/cli/local.d.ts +27 -6
  23. package/dist/cli/local.js +319 -36
  24. package/dist/cli/local.js.map +1 -1
  25. package/dist/cli/ready.d.ts +5 -0
  26. package/dist/cli/ready.js +131 -0
  27. package/dist/cli/ready.js.map +1 -0
  28. package/dist/cli/sync.d.ts +8 -0
  29. package/dist/cli/sync.js +154 -0
  30. package/dist/cli/sync.js.map +1 -0
  31. package/dist/cli/token.js +242 -9
  32. package/dist/cli/token.js.map +1 -1
  33. package/dist/cli/whoami.d.ts +6 -0
  34. package/dist/cli/whoami.js +109 -5
  35. package/dist/cli/whoami.js.map +1 -1
  36. package/dist/core/cleanup/eligibility.d.ts +41 -0
  37. package/dist/core/cleanup/eligibility.js +64 -0
  38. package/dist/core/cleanup/eligibility.js.map +1 -0
  39. package/dist/core/cleanup/scheduler.d.ts +50 -0
  40. package/dist/core/cleanup/scheduler.js +120 -0
  41. package/dist/core/cleanup/scheduler.js.map +1 -0
  42. package/dist/core/cleanup/worker.d.ts +63 -0
  43. package/dist/core/cleanup/worker.js +191 -0
  44. package/dist/core/cleanup/worker.js.map +1 -0
  45. package/dist/core/daemon.d.ts +1 -0
  46. package/dist/core/daemon.js +18 -0
  47. package/dist/core/daemon.js.map +1 -1
  48. package/dist/core/heartbeat.d.ts +6 -1
  49. package/dist/core/heartbeat.js +44 -39
  50. package/dist/core/heartbeat.js.map +1 -1
  51. package/dist/core/issue-cache.d.ts +44 -0
  52. package/dist/core/issue-cache.js +75 -0
  53. package/dist/core/issue-cache.js.map +1 -0
  54. package/dist/core/registry.d.ts +1 -0
  55. package/dist/core/registry.js +1 -0
  56. package/dist/core/registry.js.map +1 -1
  57. package/dist/core/token-lifecycle.d.ts +81 -0
  58. package/dist/core/token-lifecycle.js +210 -0
  59. package/dist/core/token-lifecycle.js.map +1 -0
  60. package/dist/core/token-lifecycle.test.d.ts +10 -0
  61. package/dist/core/token-lifecycle.test.js +309 -0
  62. package/dist/core/token-lifecycle.test.js.map +1 -0
  63. package/package.json +11 -12
@@ -0,0 +1,297 @@
1
+ /**
2
+ * Issue CLI Commands
3
+ * Integrated issue tracking for agents
4
+ */
5
+ import pc from "picocolors";
6
+ import { getAgentState, loadConfig } from "../config/loader.js";
7
+ import { loadCache, queueChange, updateCacheIssues } from "../core/issue-cache.js";
8
+ async function getHubUrl() {
9
+ const config = loadConfig();
10
+ return config?.hubUrl || process.env.AGENTMESH_HUB_URL || "https://agentmeshhq.dev";
11
+ }
12
+ async function getToken() {
13
+ // Try agent state first
14
+ const state = getAgentState(process.env.AGENT_NAME || "");
15
+ if (state?.token)
16
+ return state.token;
17
+ // Try environment
18
+ if (process.env.AGENT_TOKEN)
19
+ return process.env.AGENT_TOKEN;
20
+ return null;
21
+ }
22
+ async function getWorkspace() {
23
+ const config = loadConfig();
24
+ return config?.workspace || process.env.AGENTMESH_WORKSPACE || "agentmesh";
25
+ }
26
+ async function apiRequest(method, path, body) {
27
+ const hubUrl = await getHubUrl();
28
+ const token = await getToken();
29
+ try {
30
+ const response = await fetch(`${hubUrl}${path}`, {
31
+ method,
32
+ headers: {
33
+ "Content-Type": "application/json",
34
+ ...(token && { Authorization: `Bearer ${token}` }),
35
+ },
36
+ body: body ? JSON.stringify(body) : undefined,
37
+ });
38
+ if (!response.ok) {
39
+ const error = await response.json().catch(() => ({ error: response.statusText }));
40
+ return { error: error.error || response.statusText };
41
+ }
42
+ if (response.status === 204) {
43
+ return { data: undefined };
44
+ }
45
+ const data = await response.json();
46
+ return { data: data };
47
+ }
48
+ catch (err) {
49
+ return { error: err.message };
50
+ }
51
+ }
52
+ export async function createIssue(options) {
53
+ const workspace = await getWorkspace();
54
+ console.log(pc.cyan("Creating issue..."));
55
+ const result = await apiRequest("POST", `/api/v1/workspaces/${workspace}/issues`, {
56
+ title: options.title,
57
+ description: options.description,
58
+ type: options.type || "task",
59
+ priority: options.priority || "P2",
60
+ project_id: options.project,
61
+ parent_issue_id: options.parent,
62
+ labels: options.labels,
63
+ });
64
+ if (result.error) {
65
+ // Queue for offline sync
66
+ if (result.error.includes("fetch") || result.error.includes("network")) {
67
+ console.log(pc.yellow("Offline - queuing change for later sync"));
68
+ queueChange(workspace, {
69
+ action: "create",
70
+ data: {
71
+ title: options.title,
72
+ description: options.description || null,
73
+ type: options.type || "task",
74
+ priority: options.priority || "P2",
75
+ project_id: options.project || null,
76
+ parent_issue_id: options.parent || null,
77
+ labels: options.labels || [],
78
+ },
79
+ queuedAt: new Date().toISOString(),
80
+ });
81
+ return;
82
+ }
83
+ console.error(pc.red(`Error: ${result.error}`));
84
+ process.exit(1);
85
+ }
86
+ console.log(pc.green(`Created issue: ${result.data?.issue_id}`));
87
+ }
88
+ export async function listIssues(options = {}) {
89
+ const workspace = await getWorkspace();
90
+ const params = new URLSearchParams();
91
+ if (options.status)
92
+ params.set("status", options.status);
93
+ if (options.type)
94
+ params.set("type", options.type);
95
+ if (options.priority)
96
+ params.set("priority", options.priority);
97
+ if (options.assignee === "me") {
98
+ const state = getAgentState(process.env.AGENT_NAME || "");
99
+ if (state?.agentId)
100
+ params.set("assignee_agent_id", state.agentId);
101
+ }
102
+ else if (options.assignee) {
103
+ params.set("assignee_agent_id", options.assignee);
104
+ }
105
+ if (options.project)
106
+ params.set("project_id", options.project);
107
+ if (options.limit)
108
+ params.set("limit", String(options.limit));
109
+ const result = await apiRequest("GET", `/api/v1/workspaces/${workspace}/issues?${params}`);
110
+ if (result.error) {
111
+ // Try cache
112
+ if (result.error.includes("fetch") || result.error.includes("network")) {
113
+ console.log(pc.yellow("Offline - showing cached issues"));
114
+ const cache = loadCache(workspace);
115
+ displayIssueList(cache.issues.filter((i) => {
116
+ if (options.status && i.status !== options.status)
117
+ return false;
118
+ if (options.type && i.type !== options.type)
119
+ return false;
120
+ if (options.priority && i.priority !== options.priority)
121
+ return false;
122
+ return true;
123
+ }));
124
+ return;
125
+ }
126
+ console.error(pc.red(`Error: ${result.error}`));
127
+ process.exit(1);
128
+ }
129
+ const issues = result.data?.issues || [];
130
+ // Update cache
131
+ updateCacheIssues(workspace, issues);
132
+ displayIssueList(issues);
133
+ }
134
+ function displayIssueList(issues) {
135
+ if (issues.length === 0) {
136
+ console.log(pc.dim("No issues found"));
137
+ return;
138
+ }
139
+ console.log();
140
+ console.log(pc.bold(`${issues.length} issue(s)`));
141
+ console.log();
142
+ for (const issue of issues) {
143
+ const statusColor = getStatusColor(issue.status);
144
+ const priorityColor = getPriorityColor(issue.priority);
145
+ console.log(`${pc.cyan(issue.issue_id)} ${statusColor(issue.status.padEnd(12))} ${priorityColor(issue.priority.padEnd(3))} ${issue.title}`);
146
+ }
147
+ }
148
+ function getStatusColor(status) {
149
+ switch (status) {
150
+ case "open":
151
+ return pc.yellow;
152
+ case "in_progress":
153
+ return pc.blue;
154
+ case "review":
155
+ return pc.magenta;
156
+ case "closed":
157
+ return pc.green;
158
+ default:
159
+ return pc.dim;
160
+ }
161
+ }
162
+ function getPriorityColor(priority) {
163
+ switch (priority) {
164
+ case "P0":
165
+ return pc.red;
166
+ case "P1":
167
+ return (s) => pc.yellow(pc.bold(s));
168
+ case "P2":
169
+ return pc.yellow;
170
+ case "P3":
171
+ return pc.dim;
172
+ case "P4":
173
+ return pc.dim;
174
+ default:
175
+ return pc.dim;
176
+ }
177
+ }
178
+ export async function showIssue(issueId) {
179
+ const workspace = await getWorkspace();
180
+ const result = await apiRequest("GET", `/api/v1/workspaces/${workspace}/issues/${issueId}`);
181
+ if (result.error) {
182
+ // Try cache
183
+ if (result.error.includes("fetch") || result.error.includes("network")) {
184
+ console.log(pc.yellow("Offline - showing cached issue"));
185
+ const cache = loadCache(workspace);
186
+ const issue = cache.issues.find((i) => i.issue_id === issueId);
187
+ if (!issue) {
188
+ console.error(pc.red(`Issue ${issueId} not found in cache`));
189
+ process.exit(1);
190
+ }
191
+ displayIssue(issue);
192
+ return;
193
+ }
194
+ console.error(pc.red(`Error: ${result.error}`));
195
+ process.exit(1);
196
+ }
197
+ displayIssue(result.data);
198
+ }
199
+ function displayIssue(issue) {
200
+ console.log();
201
+ console.log(`${pc.bold(pc.cyan(issue.issue_id))} ${issue.title}`);
202
+ console.log();
203
+ console.log(`Status: ${getStatusColor(issue.status)(issue.status)}`);
204
+ console.log(`Type: ${issue.type}`);
205
+ console.log(`Priority: ${getPriorityColor(issue.priority)(issue.priority)}`);
206
+ if (issue.assignee_agent_id) {
207
+ console.log(`Assignee: ${issue.assignee_agent_id}`);
208
+ }
209
+ if (issue.project_id) {
210
+ console.log(`Project: ${issue.project_id}`);
211
+ }
212
+ if (issue.labels && issue.labels.length > 0) {
213
+ console.log(`Labels: ${issue.labels.join(", ")}`);
214
+ }
215
+ if (issue.external_ref) {
216
+ console.log(`External: ${issue.external_provider}:${issue.external_ref}`);
217
+ if (issue.external_url) {
218
+ console.log(`URL: ${issue.external_url}`);
219
+ }
220
+ }
221
+ console.log();
222
+ console.log(`Created: ${issue.created_at}`);
223
+ console.log(`Updated: ${issue.updated_at}`);
224
+ if (issue.description) {
225
+ console.log();
226
+ console.log(pc.dim("Description:"));
227
+ console.log(issue.description);
228
+ }
229
+ }
230
+ export async function updateIssue(issueId, options) {
231
+ const workspace = await getWorkspace();
232
+ console.log(pc.cyan(`Updating issue ${issueId}...`));
233
+ const body = {};
234
+ if (options.title)
235
+ body.title = options.title;
236
+ if (options.description)
237
+ body.description = options.description;
238
+ if (options.type)
239
+ body.type = options.type;
240
+ if (options.priority)
241
+ body.priority = options.priority;
242
+ if (options.status)
243
+ body.status = options.status;
244
+ if (options.project)
245
+ body.project_id = options.project;
246
+ if (options.assignee)
247
+ body.assignee_agent_id = options.assignee;
248
+ if (options.labels)
249
+ body.labels = options.labels;
250
+ const result = await apiRequest("PATCH", `/api/v1/workspaces/${workspace}/issues/${issueId}`, body);
251
+ if (result.error) {
252
+ if (result.error.includes("fetch") || result.error.includes("network")) {
253
+ console.log(pc.yellow("Offline - queuing change for later sync"));
254
+ queueChange(workspace, {
255
+ action: "update",
256
+ issueId,
257
+ data: body,
258
+ queuedAt: new Date().toISOString(),
259
+ });
260
+ return;
261
+ }
262
+ console.error(pc.red(`Error: ${result.error}`));
263
+ process.exit(1);
264
+ }
265
+ console.log(pc.green(`Updated issue ${issueId}`));
266
+ }
267
+ export async function closeIssue(issueId) {
268
+ await updateIssue(issueId, { status: "closed" });
269
+ }
270
+ // ============================================================================
271
+ // Workflow Commands
272
+ // ============================================================================
273
+ export async function claimIssue(issueId) {
274
+ const workspace = await getWorkspace();
275
+ console.log(pc.cyan(`Claiming issue ${issueId}...`));
276
+ const result = await apiRequest("POST", `/api/v1/workspaces/${workspace}/issues/${issueId}/claim`);
277
+ if (result.error) {
278
+ console.error(pc.red(`Error: ${result.error}`));
279
+ process.exit(1);
280
+ }
281
+ console.log(pc.green(`Claimed issue ${issueId} - now assigned to you and in_progress`));
282
+ }
283
+ export async function handoffIssue(issueId, options) {
284
+ const workspace = await getWorkspace();
285
+ console.log(pc.cyan(`Creating handoff for issue ${issueId}...`));
286
+ const result = await apiRequest("POST", `/api/v1/workspaces/${workspace}/issues/${issueId}/handoff`, {
287
+ to_agent_id: options.to,
288
+ reason: options.reason,
289
+ });
290
+ if (result.error) {
291
+ console.error(pc.red(`Error: ${result.error}`));
292
+ process.exit(1);
293
+ }
294
+ console.log(pc.green(`Created handoff ${result.data?.handoff_id}`));
295
+ console.log(pc.dim("Note: Issue assignment unchanged. Target agent will see this in their inbox."));
296
+ }
297
+ //# sourceMappingURL=issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue.js","sourceRoot":"","sources":["../../src/cli/issue.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,30 @@
1
- export declare function localUp(options?: {
1
+ export interface LocalOptions {
2
+ /** Compose file path or target name (e.g. docker-compose.local.yml or full path) */
3
+ target?: string;
4
+ /** Slot number for deterministic port mapping (0-based) */
5
+ slot?: number;
6
+ /** Project name for compose namespace isolation */
7
+ project?: string;
2
8
  detach?: boolean;
3
- }): Promise<void>;
4
- export declare function localDown(): Promise<void>;
5
- export declare function localStatus(): Promise<void>;
6
- export declare function localLogs(options?: {
7
9
  follow?: boolean;
8
10
  service?: string;
9
- }): Promise<void>;
11
+ }
12
+ /**
13
+ * Compute the host port for a given internal service port when using slots.
14
+ * Slot 0 preserves default ports; slot N shifts by N * SLOT_PORT_BLOCK_SIZE.
15
+ */
16
+ export declare function slotPort(internalPort: number, slot: number): number;
17
+ /** Check if a TCP port is free on 127.0.0.1 */
18
+ export declare function isPortFree(port: number): Promise<boolean>;
19
+ export interface PreflightResult {
20
+ ok: boolean;
21
+ errors: string[];
22
+ warnings: string[];
23
+ }
24
+ export declare function runPreflight(options?: LocalOptions): Promise<PreflightResult>;
25
+ export declare function localUp(options?: LocalOptions): Promise<void>;
26
+ export declare function localDown(options?: LocalOptions): Promise<void>;
27
+ export declare function localStatus(options?: LocalOptions): Promise<void>;
28
+ export declare function localLogs(options?: LocalOptions): Promise<void>;
29
+ export declare function localDoctor(options?: LocalOptions): Promise<void>;
30
+ export declare function localSmoke(options?: LocalOptions): Promise<void>;