@jait/gateway 0.1.67 → 0.1.70

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 (60) hide show
  1. package/dist/db/migrations.d.ts.map +1 -1
  2. package/dist/db/migrations.js +22 -0
  3. package/dist/db/migrations.js.map +1 -1
  4. package/dist/db/schema.d.ts +178 -0
  5. package/dist/db/schema.d.ts.map +1 -1
  6. package/dist/db/schema.js +15 -0
  7. package/dist/db/schema.js.map +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +33 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/routes/maintenance.d.ts +19 -0
  12. package/dist/routes/maintenance.d.ts.map +1 -0
  13. package/dist/routes/maintenance.js +90 -0
  14. package/dist/routes/maintenance.js.map +1 -0
  15. package/dist/routes/network.d.ts +1 -1
  16. package/dist/routes/network.d.ts.map +1 -1
  17. package/dist/routes/network.js +47 -5
  18. package/dist/routes/network.js.map +1 -1
  19. package/dist/scheduler/service.d.ts.map +1 -1
  20. package/dist/scheduler/service.js +26 -12
  21. package/dist/scheduler/service.js.map +1 -1
  22. package/dist/server.d.ts +2 -0
  23. package/dist/server.d.ts.map +1 -1
  24. package/dist/server.js +10 -1
  25. package/dist/server.js.map +1 -1
  26. package/dist/services/maintenance.d.ts +83 -0
  27. package/dist/services/maintenance.d.ts.map +1 -0
  28. package/dist/services/maintenance.js +203 -0
  29. package/dist/services/maintenance.js.map +1 -0
  30. package/dist/services/notifications.d.ts +45 -0
  31. package/dist/services/notifications.d.ts.map +1 -0
  32. package/dist/services/notifications.js +50 -0
  33. package/dist/services/notifications.js.map +1 -0
  34. package/dist/tools/index.d.ts +3 -0
  35. package/dist/tools/index.d.ts.map +1 -1
  36. package/dist/tools/index.js +6 -0
  37. package/dist/tools/index.js.map +1 -1
  38. package/dist/tools/maintenance-tools.d.ts +14 -0
  39. package/dist/tools/maintenance-tools.d.ts.map +1 -0
  40. package/dist/tools/maintenance-tools.js +96 -0
  41. package/dist/tools/maintenance-tools.js.map +1 -0
  42. package/dist/tools/network-tools.d.ts.map +1 -1
  43. package/dist/tools/network-tools.js +36 -2
  44. package/dist/tools/network-tools.js.map +1 -1
  45. package/dist/ws.d.ts +2 -0
  46. package/dist/ws.d.ts.map +1 -1
  47. package/dist/ws.js +25 -0
  48. package/dist/ws.js.map +1 -1
  49. package/package.json +3 -1
  50. package/web-dist/assets/{index-DbQ9kk74.js → index-Bv4pc6dO.js} +201 -201
  51. package/web-dist/dist/apple-touch-icon.png +0 -0
  52. package/web-dist/dist/assets/index-Bv4pc6dO.js +804 -0
  53. package/web-dist/dist/assets/index-CCOWLHCG.css +32 -0
  54. package/web-dist/dist/favicon-16x16.png +0 -0
  55. package/web-dist/dist/favicon-32x32.png +0 -0
  56. package/web-dist/dist/icon.svg +17 -0
  57. package/web-dist/dist/index.html +17 -0
  58. package/web-dist/index.html +1 -1
  59. package/web-dist/assets/index-B87MjRBO.js +0 -2
  60. package/web-dist/assets/web-BDAa97kk.js +0 -1
@@ -0,0 +1,203 @@
1
+ /**
2
+ * MaintenanceService — supervised self-test and self-fix pipeline.
3
+ *
4
+ * Flow:
5
+ * 1. Cron triggers a maintenance run for a repo
6
+ * 2. Runs configured checks (typecheck, test, lint) via shell
7
+ * 3. Parses failures from output
8
+ * 4. If failures found → creates a Plan with proposed fix tasks
9
+ * 5. Broadcasts results via WS so the user can supervise
10
+ * 6. Tasks stay "proposed" until the user approves & starts them
11
+ *
12
+ * The user stays in the loop: they see every run, every failure, and
13
+ * every proposed fix before any agent thread touches code.
14
+ */
15
+ import { eq, desc } from "drizzle-orm";
16
+ import { execSync } from "node:child_process";
17
+ import { existsSync } from "node:fs";
18
+ import { scheduledJobRuns } from "../db/schema.js";
19
+ import { uuidv7 } from "../db/uuidv7.js";
20
+ import { newTaskId } from "./plans.js";
21
+ const DEFAULT_CHECKS = [
22
+ { name: "Typecheck", command: "bun run typecheck" },
23
+ { name: "Tests", command: "bun run test" },
24
+ { name: "Lint", command: "bun run lint" },
25
+ ];
26
+ const DEFAULT_TIMEOUT_MS = 120_000;
27
+ // ── Service ──────────────────────────────────────────────────────────
28
+ export class MaintenanceService {
29
+ db;
30
+ planService;
31
+ repoService;
32
+ constructor(db, planService, repoService) {
33
+ this.db = db;
34
+ this.planService = planService;
35
+ this.repoService = repoService;
36
+ }
37
+ /**
38
+ * Run maintenance checks for ALL accessible repositories.
39
+ * Skips repos whose paths don't exist locally.
40
+ */
41
+ async runAll(jobId, config) {
42
+ const repos = this.repoService.list();
43
+ const results = [];
44
+ for (const repo of repos) {
45
+ if (!existsSync(repo.localPath))
46
+ continue;
47
+ try {
48
+ const result = await this.runForRepo(repo.id, jobId, config);
49
+ results.push(result);
50
+ }
51
+ catch (err) {
52
+ console.error(`Maintenance failed for ${repo.name}:`, err);
53
+ }
54
+ }
55
+ return results;
56
+ }
57
+ /**
58
+ * Run maintenance checks for a specific repository.
59
+ * Returns structured results; creates a fix plan if anything failed.
60
+ */
61
+ async runForRepo(repoId, jobId, config) {
62
+ const repo = this.repoService.getById(repoId);
63
+ if (!repo)
64
+ throw new Error(`Repository not found: ${repoId}`);
65
+ if (!existsSync(repo.localPath)) {
66
+ throw new Error(`Repository path not accessible: ${repo.localPath}`);
67
+ }
68
+ const checks = config?.checks ?? DEFAULT_CHECKS;
69
+ const timeoutMs = config?.timeoutMs ?? DEFAULT_TIMEOUT_MS;
70
+ const runId = uuidv7();
71
+ const startedAt = new Date().toISOString();
72
+ // Persist run as "running"
73
+ this.db.insert(scheduledJobRuns).values({
74
+ id: runId,
75
+ jobId,
76
+ status: "running",
77
+ triggeredBy: "maintenance",
78
+ startedAt,
79
+ }).run();
80
+ const results = [];
81
+ for (const check of checks) {
82
+ const checkStart = Date.now();
83
+ let output = "";
84
+ let passed = false;
85
+ try {
86
+ output = execSync(check.command, {
87
+ cwd: repo.localPath,
88
+ timeout: timeoutMs,
89
+ encoding: "utf-8",
90
+ stdio: ["pipe", "pipe", "pipe"],
91
+ maxBuffer: 1024 * 1024, // 1MB
92
+ env: { ...process.env, CI: "true", FORCE_COLOR: "0" },
93
+ });
94
+ passed = true;
95
+ }
96
+ catch (err) {
97
+ if (err && typeof err === "object" && "stdout" in err) {
98
+ const execErr = err;
99
+ output = [execErr.stdout ?? "", execErr.stderr ?? ""].filter(Boolean).join("\n");
100
+ }
101
+ else {
102
+ output = err instanceof Error ? err.message : String(err);
103
+ }
104
+ passed = false;
105
+ }
106
+ results.push({
107
+ name: check.name,
108
+ command: check.command,
109
+ passed,
110
+ output: output.slice(0, 50_000), // cap stored output
111
+ durationMs: Date.now() - checkStart,
112
+ });
113
+ }
114
+ const allPassed = results.every((r) => r.passed);
115
+ const completedAt = new Date().toISOString();
116
+ // Create fix plan if there were failures
117
+ let planId;
118
+ if (!allPassed) {
119
+ planId = this.createFixPlan(repo, results, config?.preferredProvider);
120
+ }
121
+ // Persist run result
122
+ const outputSummary = results
123
+ .map((r) => `${r.passed ? "✓" : "✗"} ${r.name} (${r.durationMs}ms)`)
124
+ .join("\n");
125
+ const errorSummary = results
126
+ .filter((r) => !r.passed)
127
+ .map((r) => `${r.name}: ${r.output.slice(0, 2000)}`)
128
+ .join("\n---\n");
129
+ this.db.update(scheduledJobRuns).set({
130
+ status: allPassed ? "completed" : "failed",
131
+ output: outputSummary,
132
+ error: allPassed ? null : errorSummary.slice(0, 50_000),
133
+ planId: planId ?? null,
134
+ completedAt,
135
+ }).where(eq(scheduledJobRuns.id, runId)).run();
136
+ return {
137
+ id: runId,
138
+ jobId,
139
+ repoId: repo.id,
140
+ repoName: repo.name,
141
+ checks: results,
142
+ allPassed,
143
+ planId,
144
+ startedAt,
145
+ completedAt,
146
+ };
147
+ }
148
+ /** Get recent runs, optionally filtered by jobId. */
149
+ listRuns(jobId, limit = 50) {
150
+ if (jobId) {
151
+ return this.db
152
+ .select()
153
+ .from(scheduledJobRuns)
154
+ .where(eq(scheduledJobRuns.jobId, jobId))
155
+ .orderBy(desc(scheduledJobRuns.startedAt))
156
+ .limit(limit)
157
+ .all();
158
+ }
159
+ return this.db
160
+ .select()
161
+ .from(scheduledJobRuns)
162
+ .orderBy(desc(scheduledJobRuns.startedAt))
163
+ .limit(limit)
164
+ .all();
165
+ }
166
+ /** Get a single run by ID. */
167
+ getRun(id) {
168
+ return this.db
169
+ .select()
170
+ .from(scheduledJobRuns)
171
+ .where(eq(scheduledJobRuns.id, id))
172
+ .get();
173
+ }
174
+ // ── Private ──────────────────────────────────────────────────────
175
+ /**
176
+ * Parse check failures and create a Plan with proposed fix tasks.
177
+ * Tasks are left as "proposed" — the user must approve before they run.
178
+ */
179
+ createFixPlan(repo, results, _preferredProvider) {
180
+ const failures = results.filter((r) => !r.passed);
181
+ const tasks = failures.map((failure) => ({
182
+ id: newTaskId(),
183
+ title: `Fix ${failure.name} failures`,
184
+ description: [
185
+ `The \`${failure.command}\` check failed. Fix the errors below.`,
186
+ "",
187
+ "```",
188
+ failure.output.slice(0, 8000),
189
+ "```",
190
+ "",
191
+ "Run the same command again after fixing to verify.",
192
+ ].join("\n"),
193
+ status: "proposed",
194
+ }));
195
+ const plan = this.planService.create({
196
+ repoId: repo.id,
197
+ title: `Maintenance: ${failures.length} check(s) failed — ${new Date().toLocaleDateString()}`,
198
+ tasks,
199
+ });
200
+ return plan.id;
201
+ }
202
+ }
203
+ //# sourceMappingURL=maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance.js","sourceRoot":"","sources":["../../src/services/maintenance.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * NotificationService — broadcasts notifications to all connected clients.
3
+ *
4
+ * Sends a WS "notification" event that each client handles according to
5
+ * its platform:
6
+ * - Electron desktop → native toast via desktop:notify IPC
7
+ * - Web browser → Notification API (with permission)
8
+ * - Android/Capacitor → local notification plugin
9
+ *
10
+ * Notifications are fire-and-forget; the gateway doesn't track delivery.
11
+ * All supervision happens in real-time via connected clients.
12
+ */
13
+ import type { WsControlPlane } from "../ws.js";
14
+ export type NotificationLevel = "info" | "success" | "warning" | "error";
15
+ export interface JaitNotification {
16
+ /** Unique ID for deduplication on the client */
17
+ id: string;
18
+ /** Notification title (short) */
19
+ title: string;
20
+ /** Notification body (detail) */
21
+ body: string;
22
+ /** Severity level */
23
+ level: NotificationLevel;
24
+ /** Optional deep-link path within the Jait UI (e.g. "/plans/abc123") */
25
+ link?: string;
26
+ /** ISO timestamp */
27
+ timestamp: string;
28
+ }
29
+ export declare class NotificationService {
30
+ private ws;
31
+ constructor(ws: WsControlPlane);
32
+ /**
33
+ * Send a notification to all connected clients.
34
+ */
35
+ send(notification: Omit<JaitNotification, "timestamp">): void;
36
+ /** Shorthand for info-level notifications */
37
+ info(title: string, body: string, link?: string): void;
38
+ /** Shorthand for success-level notifications */
39
+ success(title: string, body: string, link?: string): void;
40
+ /** Shorthand for warning-level notifications */
41
+ warning(title: string, body: string, link?: string): void;
42
+ /** Shorthand for error-level notifications */
43
+ error(title: string, body: string, link?: string): void;
44
+ }
45
+ //# sourceMappingURL=notifications.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/services/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG/C,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,KAAK,EAAE,iBAAiB,CAAC;IACzB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oBAAoB;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,mBAAmB;IAClB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,cAAc;IAEtC;;OAEG;IACH,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,GAAG,IAAI;IAc7D,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAItD,gDAAgD;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzD,gDAAgD;IAChD,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzD,8CAA8C;IAC9C,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;CAGxD"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * NotificationService — broadcasts notifications to all connected clients.
3
+ *
4
+ * Sends a WS "notification" event that each client handles according to
5
+ * its platform:
6
+ * - Electron desktop → native toast via desktop:notify IPC
7
+ * - Web browser → Notification API (with permission)
8
+ * - Android/Capacitor → local notification plugin
9
+ *
10
+ * Notifications are fire-and-forget; the gateway doesn't track delivery.
11
+ * All supervision happens in real-time via connected clients.
12
+ */
13
+ export class NotificationService {
14
+ ws;
15
+ constructor(ws) {
16
+ this.ws = ws;
17
+ }
18
+ /**
19
+ * Send a notification to all connected clients.
20
+ */
21
+ send(notification) {
22
+ const payload = {
23
+ ...notification,
24
+ timestamp: new Date().toISOString(),
25
+ };
26
+ this.ws.broadcastAll({
27
+ type: "notification",
28
+ sessionId: "",
29
+ timestamp: payload.timestamp,
30
+ payload,
31
+ });
32
+ }
33
+ /** Shorthand for info-level notifications */
34
+ info(title, body, link) {
35
+ this.send({ id: `notif-${Date.now()}`, title, body, level: "info", link });
36
+ }
37
+ /** Shorthand for success-level notifications */
38
+ success(title, body, link) {
39
+ this.send({ id: `notif-${Date.now()}`, title, body, level: "success", link });
40
+ }
41
+ /** Shorthand for warning-level notifications */
42
+ warning(title, body, link) {
43
+ this.send({ id: `notif-${Date.now()}`, title, body, level: "warning", link });
44
+ }
45
+ /** Shorthand for error-level notifications */
46
+ error(title, body, link) {
47
+ this.send({ id: `notif-${Date.now()}`, title, body, level: "error", link });
48
+ }
49
+ }
50
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/services/notifications.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAsBH,MAAM,OAAO,mBAAmB;IACV;IAApB,YAAoB,EAAkB;QAAlB,OAAE,GAAF,EAAE,CAAgB;IAAG,CAAC;IAE1C;;OAEG;IACH,IAAI,CAAC,YAAiD;QACpD,MAAM,OAAO,GAAqB;YAChC,GAAG,YAAY;YACf,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;QAEF,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;YACnB,IAAI,EAAE,cAA6B;YACnC,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,IAAI,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa;QAC7C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,gDAAgD;IAChD,OAAO,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,gDAAgD;IAChD,OAAO,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa;QAChD,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IAED,8CAA8C;IAC9C,KAAK,CAAC,KAAa,EAAE,IAAY,EAAE,IAAa;QAC9C,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,SAAS,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9E,CAAC;CACF"}
@@ -14,6 +14,7 @@ export { createAgentSpawnTool } from "./agent-tools.js";
14
14
  export { createThreadControlTool } from "./thread-tools.js";
15
15
  export { createNetworkScanTool, getLatestNetworkScan, setLatestNetworkScan } from "./network-tools.js";
16
16
  export { createRedeployTool } from "./redeploy-tools.js";
17
+ export { createMaintenanceRunTool } from "./maintenance-tools.js";
17
18
  export { createToolsListTool, createToolsSearchTool } from "./meta-tools.js";
18
19
  export { McpManager, wrapMcpTool, registerMcpTools, unregisterMcpTools, type McpServerConfig, type McpConnection } from "./mcp-bridge.js";
19
20
  export { ToolName, type ToolNameValue } from "./tool-names.js";
@@ -49,6 +50,8 @@ export interface ToolRegistryDeps {
49
50
  };
50
51
  threadService?: ThreadService;
51
52
  providerRegistry?: ProviderRegistry;
53
+ maintenanceService?: import("../services/maintenance.js").MaintenanceService;
54
+ notifications?: import("../services/notifications.js").NotificationService;
52
55
  /** Graceful shutdown callback — needed by the redeploy tool */
53
56
  shutdown?: () => Promise<void>;
54
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ export { createAgentSpawnTool } from "./agent-tools.js";
13
13
  export { createThreadControlTool } from "./thread-tools.js";
14
14
  export { createNetworkScanTool, getLatestNetworkScan, setLatestNetworkScan } from "./network-tools.js";
15
15
  export { createRedeployTool } from "./redeploy-tools.js";
16
+ export { createMaintenanceRunTool } from "./maintenance-tools.js";
16
17
  export { createToolsListTool, createToolsSearchTool } from "./meta-tools.js";
17
18
  export { McpManager, wrapMcpTool, registerMcpTools, unregisterMcpTools } from "./mcp-bridge.js";
18
19
  export { ToolName } from "./tool-names.js";
@@ -35,6 +36,7 @@ import { createAgentSpawnTool } from "./agent-tools.js";
35
36
  import { createThreadControlTool } from "./thread-tools.js";
36
37
  import { createNetworkScanTool } from "./network-tools.js";
37
38
  import { createRedeployTool } from "./redeploy-tools.js";
39
+ import { createMaintenanceRunTool } from "./maintenance-tools.js";
38
40
  import { createToolsListTool, createToolsSearchTool } from "./meta-tools.js";
39
41
  import { inferContextWindow } from "../config.js";
40
42
  // ── Core tools (simplified set of 8) ────────────────────────────────
@@ -144,6 +146,10 @@ export function createToolRegistry(surfaceRegistry, deps = {}) {
144
146
  tools.register(createBrowserSandboxStartTool());
145
147
  // Network tools
146
148
  tools.register(createNetworkScanTool());
149
+ // Maintenance tools
150
+ if (deps.maintenanceService) {
151
+ tools.register(createMaintenanceRunTool(deps.maintenanceService, deps.notifications));
152
+ }
147
153
  // Agent spawn (sub-agent) tool — needs config for LLM settings
148
154
  if (deps.config) {
149
155
  const agentDeps = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * maintenance.run tool — invoked by the scheduler to run self-test checks
3
+ * on a repository and create fix plans when failures are found.
4
+ *
5
+ * Input: { repoId: string }
6
+ * The tool runs all configured checks, persists results, and creates
7
+ * a Plan with proposed tasks if anything fails. The user supervises
8
+ * by reviewing and approving plan tasks before agent threads start.
9
+ */
10
+ import type { ToolDefinition } from "./contracts.js";
11
+ import type { MaintenanceService } from "../services/maintenance.js";
12
+ import type { NotificationService } from "../services/notifications.js";
13
+ export declare function createMaintenanceRunTool(maintenanceService: MaintenanceService, notifications?: NotificationService): ToolDefinition;
14
+ //# sourceMappingURL=maintenance-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance-tools.d.ts","sourceRoot":"","sources":["../../src/tools/maintenance-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAA2B,MAAM,gBAAgB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,wBAAgB,wBAAwB,CACtC,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,CAAC,EAAE,mBAAmB,GAClC,cAAc,CAmGhB"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * maintenance.run tool — invoked by the scheduler to run self-test checks
3
+ * on a repository and create fix plans when failures are found.
4
+ *
5
+ * Input: { repoId: string }
6
+ * The tool runs all configured checks, persists results, and creates
7
+ * a Plan with proposed tasks if anything fails. The user supervises
8
+ * by reviewing and approving plan tasks before agent threads start.
9
+ */
10
+ export function createMaintenanceRunTool(maintenanceService, notifications) {
11
+ return {
12
+ name: "maintenance.run",
13
+ description: "Run maintenance checks (typecheck, test, lint) on a repository. " +
14
+ "Creates a fix plan with proposed tasks if any check fails. " +
15
+ "If repoId is omitted, checks all accessible repositories.",
16
+ tier: "standard",
17
+ parameters: {
18
+ type: "object",
19
+ properties: {
20
+ repoId: {
21
+ type: "string",
22
+ description: "ID of the repository to check. Omit to check all repos.",
23
+ },
24
+ },
25
+ },
26
+ execute: async (input, context) => {
27
+ const { repoId } = input ?? {};
28
+ const jobId = context.actionId ?? `manual-${Date.now()}`;
29
+ try {
30
+ if (repoId) {
31
+ const result = await maintenanceService.runForRepo(repoId, jobId);
32
+ const summary = result.checks
33
+ .map((c) => `${c.passed ? "✓" : "✗"} ${c.name} (${c.durationMs}ms)`)
34
+ .join("\n");
35
+ const msg = result.allPassed
36
+ ? "All checks passed"
37
+ : `${result.checks.filter((c) => !c.passed).length} check(s) failed — fix plan created`;
38
+ if (notifications) {
39
+ if (result.allPassed) {
40
+ notifications.success("Maintenance passed", `All checks passed for ${result.repoName}`);
41
+ }
42
+ else {
43
+ notifications.warning("Maintenance: checks failed", `${result.checks.filter((c) => !c.passed).length} check(s) failed in ${result.repoName}`, result.planId ? `/plans/${result.planId}` : undefined);
44
+ }
45
+ }
46
+ return {
47
+ ok: true,
48
+ message: msg,
49
+ data: { runId: result.id, planId: result.planId, summary },
50
+ };
51
+ }
52
+ // Run all repos
53
+ const results = await maintenanceService.runAll(jobId);
54
+ if (results.length === 0) {
55
+ return { ok: true, message: "No accessible repositories found" };
56
+ }
57
+ const summary = results.map((r) => {
58
+ const checks = r.checks
59
+ .map((c) => ` ${c.passed ? "✓" : "✗"} ${c.name}`)
60
+ .join("\n");
61
+ return `${r.allPassed ? "✓" : "✗"} ${r.repoName}\n${checks}`;
62
+ }).join("\n\n");
63
+ const failed = results.filter((r) => !r.allPassed);
64
+ const msg = failed.length === 0
65
+ ? `All ${results.length} repo(s) passed`
66
+ : `${failed.length}/${results.length} repo(s) have failures — fix plans created`;
67
+ if (notifications) {
68
+ if (failed.length === 0) {
69
+ notifications.success("Maintenance passed", msg);
70
+ }
71
+ else {
72
+ notifications.warning("Maintenance: failures found", msg);
73
+ }
74
+ }
75
+ return {
76
+ ok: true,
77
+ message: msg,
78
+ data: {
79
+ repos: results.map((r) => ({
80
+ repoName: r.repoName,
81
+ allPassed: r.allPassed,
82
+ runId: r.id,
83
+ planId: r.planId,
84
+ })),
85
+ summary,
86
+ },
87
+ };
88
+ }
89
+ catch (err) {
90
+ const msg = err instanceof Error ? err.message : String(err);
91
+ return { ok: false, message: msg };
92
+ }
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=maintenance-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"maintenance-tools.js","sourceRoot":"","sources":["../../src/tools/maintenance-tools.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"network-tools.d.ts","sourceRoot":"","sources":["../../src/tools/network-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAgHjE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,sBAAsB,EAAE,cAAc,GAAG,IAAI,CAE5F;AAED,wBAAgB,oBAAoB,IAAI,eAAe,GAAG,IAAI,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAsChE;AAMD,wBAAgB,qBAAqB,IAAI,cAAc,CAmJtD"}
1
+ {"version":3,"file":"network-tools.d.ts","sourceRoot":"","sources":["../../src/tools/network-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,gBAAgB,CAAC;AAgHjE,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS,GAAG,aAAa,CAAC;IACvE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAQD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,sBAAsB,EAAE,cAAc,GAAG,IAAI,CAE5F;AAED,wBAAgB,oBAAoB,IAAI,eAAe,GAAG,IAAI,CAE7D;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAsChE;AAMD,wBAAgB,qBAAqB,IAAI,cAAc,CAsLtD"}
@@ -186,14 +186,23 @@ export function createNetworkScanTool() {
186
186
  try {
187
187
  for (const subnet of subnets) {
188
188
  if (platform() === "win32") {
189
- const pingCmd = Array.from({ length: 254 }, (_, i) => `start /b ping -n 1 -w 500 ${subnet}.${i + 1} > nul 2>&1`).join(" & ");
190
- await execAsync(pingCmd, { timeout: 30000 }).catch(() => { });
189
+ // Batched ping sweep 25 per batch, batches in parallel
190
+ const BATCH = 25;
191
+ const batches = [];
192
+ for (let i = 1; i <= 254; i += BATCH) {
193
+ const end = Math.min(i + BATCH - 1, 254);
194
+ const cmds = Array.from({ length: end - i + 1 }, (_, j) => `ping -n 1 -w 500 ${subnet}.${i + j} > nul 2>&1`).join(" & ");
195
+ batches.push(cmds);
196
+ }
197
+ await Promise.all(batches.map(cmd => execAsync(cmd, { timeout: 45000 }).catch(() => { })));
191
198
  }
192
199
  else {
193
200
  const pingCmd = `for i in $(seq 1 254); do ping -c 1 -W 1 ${subnet}.$i & done; wait`;
194
201
  await execAsync(pingCmd, { timeout: 30000, shell: "/bin/bash" }).catch(() => { });
195
202
  }
196
203
  }
204
+ // Brief pause for ARP cache to settle
205
+ await new Promise(r => setTimeout(r, 2500));
197
206
  // Re-read ARP table after all sweeps
198
207
  const { stdout } = await execAsync("arp -a", { timeout: 10000 });
199
208
  arpEntries = parseArpTable(stdout);
@@ -201,6 +210,31 @@ export function createNetworkScanTool() {
201
210
  catch {
202
211
  // use existing ARP entries
203
212
  }
213
+ // 2b. On Windows, supplement with Get-NetNeighbor
214
+ if (platform() === "win32") {
215
+ try {
216
+ const { stdout: pshOutput } = await execAsync('powershell -NoProfile -Command "Get-NetNeighbor -AddressFamily IPv4 | Where-Object { $_.State -ne \'Unreachable\' -and $_.LinkLayerAddress -ne \'\' -and $_.LinkLayerAddress -ne \'00-00-00-00-00-00\' } | Select-Object IPAddress,LinkLayerAddress | ConvertTo-Csv -NoTypeInformation"', { timeout: 15000 });
217
+ const existingIps = new Set(arpEntries.map(e => e.ip));
218
+ for (const line of pshOutput.split("\n")) {
219
+ const csvMatch = /"(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})"\s*,\s*"([0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2}-[0-9a-fA-F]{2})"/.exec(line);
220
+ if (!csvMatch)
221
+ continue;
222
+ const ip = csvMatch[1];
223
+ const mac = csvMatch[2].replace(/-/g, ":").toLowerCase();
224
+ if (existingIps.has(ip))
225
+ continue;
226
+ if (mac === "ff:ff:ff:ff:ff:ff" || mac === "00:00:00:00:00:00")
227
+ continue;
228
+ const firstOctet = parseInt(mac.slice(0, 2), 16);
229
+ if (firstOctet & 1)
230
+ continue;
231
+ if (subnets.some(s => ip.startsWith(s + "."))) {
232
+ arpEntries.push({ ip, mac });
233
+ }
234
+ }
235
+ }
236
+ catch { }
237
+ }
204
238
  // 3. Filter to subnet
205
239
  const subnetFiltered = arpEntries.filter((e) => subnets.some((s) => e.ip.startsWith(s + ".")));
206
240
  // 4. Probe ports in parallel