@roxy-agent/agents 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 (49) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +306 -0
  3. package/dist/approvals.js +143 -0
  4. package/dist/approvals.js.map +1 -0
  5. package/dist/classifier.js +436 -0
  6. package/dist/classifier.js.map +1 -0
  7. package/dist/dashboard/client.js +2057 -0
  8. package/dist/dashboard/client.js.map +1 -0
  9. package/dist/dashboard/html.js +57 -0
  10. package/dist/dashboard/html.js.map +1 -0
  11. package/dist/dashboard/icons.js +18 -0
  12. package/dist/dashboard/icons.js.map +1 -0
  13. package/dist/dashboard/server.js +423 -0
  14. package/dist/dashboard/server.js.map +1 -0
  15. package/dist/dashboard/styles.js +1685 -0
  16. package/dist/dashboard/styles.js.map +1 -0
  17. package/dist/dashboard.js +2 -0
  18. package/dist/dashboard.js.map +1 -0
  19. package/dist/db.js +526 -0
  20. package/dist/db.js.map +1 -0
  21. package/dist/index.js +94 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/license.js +257 -0
  24. package/dist/license.js.map +1 -0
  25. package/dist/logger.js +44 -0
  26. package/dist/logger.js.map +1 -0
  27. package/dist/ml/bash-classifier.js +121 -0
  28. package/dist/ml/bash-classifier.js.map +1 -0
  29. package/dist/ml/embedder.js +79 -0
  30. package/dist/ml/embedder.js.map +1 -0
  31. package/dist/ml/prototypes.js +707 -0
  32. package/dist/ml/prototypes.js.map +1 -0
  33. package/dist/policies.js +289 -0
  34. package/dist/policies.js.map +1 -0
  35. package/dist/slack.js +149 -0
  36. package/dist/slack.js.map +1 -0
  37. package/dist/tools/bash.js +134 -0
  38. package/dist/tools/bash.js.map +1 -0
  39. package/dist/tools/conversation.js +36 -0
  40. package/dist/tools/conversation.js.map +1 -0
  41. package/dist/tools/filesystem.js +243 -0
  42. package/dist/tools/filesystem.js.map +1 -0
  43. package/dist/tools/introspect.js +187 -0
  44. package/dist/tools/introspect.js.map +1 -0
  45. package/dist/tools/network.js +152 -0
  46. package/dist/tools/network.js.map +1 -0
  47. package/dist/tools/policies.js +107 -0
  48. package/dist/tools/policies.js.map +1 -0
  49. package/package.json +61 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/dashboard/client.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsgErC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { DASHBOARD_CSS } from './styles.js';
2
+ import { DASHBOARD_JS } from './client.js';
3
+ import { svgIcon } from "./icons.js";
4
+ export const DASHBOARD_HTML = `<!DOCTYPE html>
5
+ <html lang="en">
6
+ <head>
7
+ <meta charset="utf-8" />
8
+ <meta name="viewport" content="width=device-width,initial-scale=1" />
9
+ <title>agent · proxy</title>
10
+ <meta name="theme-color" content="#fbfbfa" />
11
+ <style>${DASHBOARD_CSS}</style>
12
+ </head>
13
+ <body>
14
+
15
+ <div class="appbar">
16
+ <a class="brand" href="#/overview" data-tab="overview">
17
+ <span class="logo">${svgIcon("brand", "svg-icon")}</span>
18
+ <span class="name">agent<span class="dim">/</span>proxy</span>
19
+ </a>
20
+ <nav class="tabs" role="tablist">
21
+ <a href="#/overview" data-tab="overview">${svgIcon("overview", "svg-icon nav-icon")}<span>Overview</span></a>
22
+ <a href="#/activity" data-tab="activity">${svgIcon("activity", "svg-icon nav-icon")}<span>Actions</span></a>
23
+ <a href="#/policies" data-tab="policies">${svgIcon("policies", "svg-icon nav-icon")}<span>Policies</span></a>
24
+ <a href="#/approvals" data-tab="approvals">${svgIcon("approvals", "svg-icon nav-icon")}<span>Approvals</span><span class="nav-badge" id="nav-approvals-badge" hidden></span></a>
25
+ <a href="#/insights" data-tab="insights">${svgIcon("insights", "svg-icon nav-icon")}<span>Insights</span></a>
26
+ <a href="#/docs" data-tab="docs">${svgIcon("docs", "svg-icon nav-icon")}<span>Setup</span></a>
27
+ </nav>
28
+ <a href="#/settings" data-tab="settings" class="sidebar-usage" id="sidebar-usage" hidden></a>
29
+ <nav class="tabs sidebar-foot" role="tablist">
30
+ <a href="#/settings" data-tab="settings">${svgIcon("settings", "svg-icon nav-icon")}<span>Settings</span></a>
31
+ </nav>
32
+ </div>
33
+
34
+ <main class="page" id="page"></main>
35
+
36
+ <div class="scrim" id="scrim"></div>
37
+ <div class="drawer" id="drawer">
38
+ <div class="drawer-head">
39
+ <div class="title" id="drawer-title">Event</div>
40
+ <button class="drawer-close" onclick="closeDrawer()">esc</button>
41
+ </div>
42
+ <div class="drawer-body" id="drawer-body"></div>
43
+ </div>
44
+
45
+ <div class="palette-scrim" id="palette-scrim">
46
+ <div class="palette">
47
+ <input id="palette-input" placeholder="Jump to a tab…" autocomplete="off" />
48
+ <ul id="palette-list"></ul>
49
+ </div>
50
+ </div>
51
+
52
+ <script src="/static/vendor/echarts/echarts.min.js"></script>
53
+ <script>${DASHBOARD_JS}</script>
54
+
55
+ </body>
56
+ </html>`;
57
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/dashboard/html.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;SAOrB,aAAa;;;;;;yBAMG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;;;;gDAIL,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC;gDACxC,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC;gDACxC,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC;iDACvC,OAAO,CAAC,WAAW,EAAE,mBAAmB,CAAC;gDAC1C,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC;4CAC5C,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC;;;;gDAIhC,OAAO,CAAC,UAAU,EAAE,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;UAuB9E,YAAY;;;QAGd,CAAC"}
@@ -0,0 +1,18 @@
1
+ const PATHS = {
2
+ activity: '<path d="M5 4.5v15l13-7.5-13-7.5Z" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linejoin="round"/>',
3
+ approvals: '<path d="M12 3.5 19 6v5.2c0 4.1-2.7 7.8-7 9.3-4.3-1.5-7-5.2-7-9.3V6l7-2.5Z" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/><circle cx="12" cy="11" r="0.9" fill="currentColor"/><path d="M12 13.2V15" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/>',
4
+ "arrow-right": '<path d="M5 12h13" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/><path d="m13 6 6 6-6 6" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>',
5
+ brand: '<path d="M4 5.5h11.5L20 10v8.5H8.5L4 14V5.5Z" fill="currentColor" opacity=".18"/><path d="M4 5.5h11.5L20 10v8.5H8.5L4 14V5.5Z" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/><path d="M8.5 18.5V10H20" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linejoin="round"/>',
6
+ docs: '<path d="M7 4.5h7l3 3v12H7v-15Z" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/><path d="M14 4.5v3h3" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/><path d="M9.5 11h5M9.5 14h5M9.5 17h3" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>',
7
+ guardrails: '<path d="M12 3.5 19 6v5.2c0 4.1-2.7 7.8-7 9.3-4.3-1.5-7-5.2-7-9.3V6l7-2.5Z" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/><path d="M8.5 12.2 11 14.7l4.8-5.2" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>',
8
+ health: '<path d="M4 12h3l2-5 4 10 2-5h5" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/>',
9
+ insights: '<path d="M5 18.5V9" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><path d="M12 18.5v-13" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><path d="M19 18.5V12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><path d="M4 19.5h16" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/>',
10
+ overview: '<path d="M4.5 11.5 12 5l7.5 6.5" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/><path d="M6.5 10.5v8h4v-5h3v5h4v-8" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>',
11
+ policies: '<path d="M6 5h12M6 12h12M6 19h12" fill="none" stroke="currentColor" stroke-width="1.6" stroke-linecap="round"/><path d="M4 5h.01M4 12h.01M4 19h.01" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round"/>',
12
+ settings: '<path d="M12 8.5a3.5 3.5 0 1 1 0 7 3.5 3.5 0 0 1 0-7Z" fill="none" stroke="currentColor" stroke-width="1.6"/><path d="M18.1 13.7c.1-.5.1-.9 0-1.4l2-1.5-2-3.5-2.4 1a7.3 7.3 0 0 0-1.2-.7L14.2 5h-4.4l-.3 2.6c-.4.2-.8.4-1.2.7l-2.4-1-2 3.5 2 1.5a6 6 0 0 0 0 1.4l-2 1.5 2 3.5 2.4-1c.4.3.8.5 1.2.7l.3 2.6h4.4l.3-2.6c.4-.2.8-.4 1.2-.7l2.4 1 2-3.5-2-1.5Z" fill="none" stroke="currentColor" stroke-width="1.2" stroke-linejoin="round"/>',
13
+ usage: '<path d="M5 19V9" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><path d="M12 19V5" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><path d="M19 19v-7" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/><path d="M4 19h16" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round"/>',
14
+ };
15
+ export function svgIcon(name, className = "svg-icon", ariaHidden = true) {
16
+ return `<svg class="${className}" viewBox="0 0 24 24" fill="none" aria-hidden="${ariaHidden}">${PATHS[name]}</svg>`;
17
+ }
18
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/dashboard/icons.ts"],"names":[],"mappings":"AAcA,MAAM,KAAK,GAA6B;IACtC,QAAQ,EACN,mHAAmH;IACrH,SAAS,EACP,oTAAoT;IACtT,aAAa,EACX,+NAA+N;IACjO,KAAK,EACH,uTAAuT;IACzT,IAAI,EACF,wUAAwU;IAC1U,UAAU,EACR,qSAAqS;IACvS,MAAM,EACJ,wIAAwI;IAC1I,QAAQ,EACN,4YAA4Y;IAC9Y,QAAQ,EACN,iRAAiR;IACnR,QAAQ,EACN,mOAAmO;IACrO,QAAQ,EACN,2aAA2a;IAC7a,KAAK,EACH,kYAAkY;CACrY,CAAC;AAEF,MAAM,UAAU,OAAO,CACrB,IAAc,EACd,SAAS,GAAG,UAAU,EACtB,UAAU,GAAG,IAAI;IAEjB,OAAO,eAAe,SAAS,kDAAkD,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtH,CAAC"}
@@ -0,0 +1,423 @@
1
+ import express from "express";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { createRequire } from "node:module";
6
+ import { getRecentEvents, getEventsSince, getEvent, getSessionEvents, getStats, getDbPath, getActivityAggregate, getTopActions, getRecentSessions, getToolBreakdown, getTodayStats, getRangedStats, } from "../db.js";
7
+ import { listPolicies, createPolicy, updatePolicy, deletePolicy, scoreAllPolicies, } from "../policies.js";
8
+ import { isEmbedderReady, embedderLoadError } from "../ml/embedder.js";
9
+ import { BASH_PROTOTYPES } from "../ml/prototypes.js";
10
+ import { DASHBOARD_HTML } from "./html.js";
11
+ import { loadLicense, patchLicense, signOut as signOutLicense, getQuotaStatus, startCloudAuth, pollCloudAuth, syncWithCloud, upgradeUrl, licensePath, } from "../license.js";
12
+ import { getRecentUsage, setBuiltinRuleOverride, getBuiltinRuleOverrides, listApprovals, countPendingApprovals, getApproval, setAppSetting, getAllAppSettings, } from "../db.js";
13
+ import { decideApproval } from "../approvals.js";
14
+ import { sendSlackTestMessage, isSlackConfigured } from "../slack.js";
15
+ import { DENY_PATTERNS, HIGH_RISK_PATTERNS, MEDIUM_RISK_PATTERNS, refreshBuiltinRuleOverrides, } from "../classifier.js";
16
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
17
+ const requireFromHere = createRequire(import.meta.url);
18
+ // Serve Geist font files and ECharts directly from the installed npm packages.
19
+ // Works regardless of npm hoisting (flat, nested, pnpm) and regardless of
20
+ // whether agent-proxy was installed globally, run via `npx`, or cloned from
21
+ // source. Some packages (e.g. `geist`) hide their package.json behind the
22
+ // `exports` field, so we resolve a known entry then walk up to find the
23
+ // package root.
24
+ function resolvePackageDir(spec, knownEntry) {
25
+ let entry;
26
+ try {
27
+ entry = requireFromHere.resolve(`${spec}/${knownEntry}`);
28
+ }
29
+ catch {
30
+ entry = requireFromHere.resolve(spec);
31
+ }
32
+ let dir = path.dirname(entry);
33
+ while (dir !== path.dirname(dir)) {
34
+ const pkgJson = path.join(dir, "package.json");
35
+ if (fs.existsSync(pkgJson)) {
36
+ try {
37
+ const meta = JSON.parse(fs.readFileSync(pkgJson, "utf8"));
38
+ if (meta.name === spec)
39
+ return dir;
40
+ }
41
+ catch {
42
+ // ignore malformed package.json and keep walking
43
+ }
44
+ }
45
+ dir = path.dirname(dir);
46
+ }
47
+ throw new Error(`Could not resolve package directory for ${spec}`);
48
+ }
49
+ const GEIST_FONT_DIR = path.join(resolvePackageDir("geist", "font/sans"), "dist", "fonts");
50
+ const ECHARTS_DIST_DIR = path.join(resolvePackageDir("echarts", "core"), "dist");
51
+ function maskUrl(url) {
52
+ if (!url)
53
+ return "";
54
+ try {
55
+ const u = new URL(url);
56
+ const path = u.pathname.split("/").filter(Boolean);
57
+ const tail = path.slice(-1)[0] ?? "";
58
+ const masked = tail.length > 6 ? "•".repeat(tail.length - 4) + tail.slice(-4) : "•".repeat(tail.length);
59
+ const newPath = [...path.slice(0, -1), masked].join("/");
60
+ return `${u.origin}/${newPath}`;
61
+ }
62
+ catch {
63
+ return url.slice(0, 20) + "•".repeat(Math.max(0, url.length - 24)) + url.slice(-4);
64
+ }
65
+ }
66
+ export function startDashboard(port = 4242) {
67
+ const app = express();
68
+ app.use(express.json());
69
+ app.use("/static/fonts", express.static(GEIST_FONT_DIR, {
70
+ maxAge: "30d",
71
+ immutable: true,
72
+ fallthrough: false,
73
+ }));
74
+ app.use("/static/vendor/echarts", express.static(ECHARTS_DIST_DIR, {
75
+ maxAge: "30d",
76
+ immutable: true,
77
+ fallthrough: false,
78
+ }));
79
+ // ── Events ────────────────────────────────────────────────────────────
80
+ app.get("/api/events", (req, res) => {
81
+ const limit = Math.min(Number(req.query.limit) || 200, 1000);
82
+ const since = req.query.since ? Number(req.query.since) : undefined;
83
+ if (since !== undefined && Number.isFinite(since)) {
84
+ res.json(getEventsSince(since, limit));
85
+ return;
86
+ }
87
+ res.json(getRecentEvents(limit));
88
+ });
89
+ app.get("/api/events/:id", (req, res) => {
90
+ const id = Number(req.params.id);
91
+ if (!Number.isFinite(id)) {
92
+ res.status(400).json({ error: "invalid id" });
93
+ return;
94
+ }
95
+ const event = getEvent(id);
96
+ if (!event) {
97
+ res.status(404).json({ error: "not found" });
98
+ return;
99
+ }
100
+ res.json(event);
101
+ });
102
+ app.get("/api/events/session/:id", (req, res) => {
103
+ res.json(getSessionEvents(req.params.id));
104
+ });
105
+ // Resolve `?range=` (or `?hours=`) into a numeric hours window + a chart
106
+ // granularity. `range=all` means no upper bound.
107
+ function resolveRange(req) {
108
+ const range = String(req.query.range ?? "").toLowerCase();
109
+ const fallback = (h, g, label) => ({
110
+ hours: h,
111
+ granularity: g,
112
+ label,
113
+ });
114
+ switch (range) {
115
+ case "all": return { hours: null, granularity: "day", label: "all" };
116
+ case "30d": return fallback(720, "day", "30d");
117
+ case "7d": return fallback(168, "hour", "7d");
118
+ case "3d": return fallback(72, "hour", "3d");
119
+ case "1d":
120
+ case "24h": return fallback(24, "hour", "1d");
121
+ case "12h": return fallback(12, "hour", "12h");
122
+ case "1h": return fallback(1, "minute", "1h");
123
+ }
124
+ // Legacy `hours=N` param.
125
+ if (req.query.hours !== undefined) {
126
+ const h = Math.min(Math.max(Number(req.query.hours) || 24, 1), 24 * 365);
127
+ return { hours: h, granularity: h > 168 ? "day" : "hour", label: `${h}h` };
128
+ }
129
+ return fallback(24, "hour", "1d");
130
+ }
131
+ app.get("/api/stats", (req, res) => {
132
+ const { hours, label } = resolveRange(req);
133
+ res.json({
134
+ all_time: getStats(),
135
+ today: getTodayStats(),
136
+ ranged: getRangedStats(hours),
137
+ range_label: label,
138
+ });
139
+ });
140
+ // ── Insights (powers Overview sparkline + Insights tab) ───────────────
141
+ app.get("/api/insights", (req, res) => {
142
+ const { hours, granularity, label } = resolveRange(req);
143
+ const proto_counts = {
144
+ high_flag: BASH_PROTOTYPES.high_flag.length,
145
+ medium: BASH_PROTOTYPES.medium.length,
146
+ low: BASH_PROTOTYPES.low.length,
147
+ };
148
+ res.json({
149
+ hourly: getActivityAggregate(hours, granularity),
150
+ granularity,
151
+ range: label,
152
+ tools: getToolBreakdown(hours),
153
+ top_denied: getTopActions("denied", 8, hours),
154
+ top_flagged: getTopActions("flagged", 8, hours),
155
+ sessions: getRecentSessions(10),
156
+ ml: {
157
+ ready: isEmbedderReady(),
158
+ error: embedderLoadError(),
159
+ prototypes: proto_counts,
160
+ prototype_total: proto_counts.high_flag + proto_counts.medium + proto_counts.low,
161
+ },
162
+ });
163
+ });
164
+ app.get("/api/health", (_req, res) => {
165
+ res.json({
166
+ ok: true,
167
+ db: getDbPath(),
168
+ uptime_s: Math.round(process.uptime()),
169
+ ml_ready: isEmbedderReady(),
170
+ ml_error: embedderLoadError(),
171
+ });
172
+ });
173
+ // ── Policies ──────────────────────────────────────────────────────────
174
+ app.get("/api/policies", (_req, res) => {
175
+ res.json(listPolicies());
176
+ });
177
+ app.post("/api/policies", async (req, res) => {
178
+ try {
179
+ const policy = await createPolicy(req.body);
180
+ res.status(201).json(policy);
181
+ }
182
+ catch (err) {
183
+ res.status(400).json({ error: err.message });
184
+ }
185
+ });
186
+ app.patch("/api/policies/:id", async (req, res) => {
187
+ const id = Number(req.params.id);
188
+ if (!Number.isFinite(id)) {
189
+ res.status(400).json({ error: "invalid id" });
190
+ return;
191
+ }
192
+ try {
193
+ const policy = await updatePolicy(id, req.body);
194
+ if (!policy) {
195
+ res.status(404).json({ error: "not found" });
196
+ return;
197
+ }
198
+ res.json(policy);
199
+ }
200
+ catch (err) {
201
+ res.status(400).json({ error: err.message });
202
+ }
203
+ });
204
+ app.delete("/api/policies/:id", (req, res) => {
205
+ const id = Number(req.params.id);
206
+ if (!Number.isFinite(id)) {
207
+ res.status(400).json({ error: "invalid id" });
208
+ return;
209
+ }
210
+ if (deletePolicy(id))
211
+ res.json({ ok: true });
212
+ else
213
+ res.status(404).json({ error: "not found" });
214
+ });
215
+ // ── Approvals ─────────────────────────────────────────────────────────
216
+ app.get("/api/approvals", (req, res) => {
217
+ const status = req.query.status
218
+ ? String(req.query.status)
219
+ : undefined;
220
+ const limit = Math.min(Math.max(Number(req.query.limit) || 100, 1), 500);
221
+ const all = status === "all" || !status
222
+ ? listApprovals({ limit })
223
+ : listApprovals({
224
+ status: status,
225
+ limit,
226
+ });
227
+ res.json({
228
+ pending_count: countPendingApprovals(),
229
+ slack_configured: isSlackConfigured(),
230
+ approvals: all,
231
+ });
232
+ });
233
+ app.post("/api/approvals/:id/decide", (req, res) => {
234
+ const id = Number(req.params.id);
235
+ if (!Number.isFinite(id)) {
236
+ res.status(400).json({ error: "invalid id" });
237
+ return;
238
+ }
239
+ const decision = req.body?.decision;
240
+ if (decision !== "approved" && decision !== "denied") {
241
+ res.status(400).json({ error: "decision must be 'approved' or 'denied'" });
242
+ return;
243
+ }
244
+ const by = (req.body?.by && String(req.body.by)) || "dashboard";
245
+ const row = decideApproval(id, decision, by);
246
+ if (!row) {
247
+ res.status(404).json({ error: "approval not found" });
248
+ return;
249
+ }
250
+ res.json(row);
251
+ });
252
+ app.get("/api/approvals/:id", (req, res) => {
253
+ const id = Number(req.params.id);
254
+ if (!Number.isFinite(id)) {
255
+ res.status(400).json({ error: "invalid id" });
256
+ return;
257
+ }
258
+ const row = getApproval(id);
259
+ if (!row) {
260
+ res.status(404).json({ error: "not found" });
261
+ return;
262
+ }
263
+ res.json(row);
264
+ });
265
+ // ── App settings (Slack webhook, HITL toggles, etc.) ─────────────────
266
+ app.get("/api/settings", (_req, res) => {
267
+ const all = getAllAppSettings();
268
+ res.json({
269
+ slack_webhook_url: all.slack_webhook_url ? maskUrl(all.slack_webhook_url) : null,
270
+ slack_configured: isSlackConfigured(),
271
+ require_approval_high_risk: all.require_approval_high_risk === "0" ? false : true,
272
+ dashboard_public_url: all.dashboard_public_url ?? null,
273
+ });
274
+ });
275
+ app.patch("/api/settings", (req, res) => {
276
+ const body = req.body ?? {};
277
+ if (typeof body.slack_webhook_url === "string") {
278
+ setAppSetting("slack_webhook_url", body.slack_webhook_url.trim());
279
+ }
280
+ if (typeof body.dashboard_public_url === "string") {
281
+ setAppSetting("dashboard_public_url", body.dashboard_public_url.trim());
282
+ }
283
+ if (body.require_approval_high_risk !== undefined) {
284
+ setAppSetting("require_approval_high_risk", body.require_approval_high_risk ? "1" : "0");
285
+ }
286
+ const all = getAllAppSettings();
287
+ res.json({
288
+ slack_webhook_url: all.slack_webhook_url
289
+ ? maskUrl(all.slack_webhook_url)
290
+ : null,
291
+ slack_configured: isSlackConfigured(),
292
+ require_approval_high_risk: all.require_approval_high_risk === "0" ? false : true,
293
+ dashboard_public_url: all.dashboard_public_url ?? null,
294
+ });
295
+ });
296
+ app.post("/api/settings/slack/test", async (_req, res) => {
297
+ const r = await sendSlackTestMessage();
298
+ res.status(r.ok ? 200 : 400).json(r);
299
+ });
300
+ app.post("/api/policies/test", async (req, res) => {
301
+ const text = String(req.body?.text ?? "").trim();
302
+ const tool = (req.body?.tool ?? "bash");
303
+ if (!text) {
304
+ res.status(400).json({ error: "text is required" });
305
+ return;
306
+ }
307
+ if (!isEmbedderReady()) {
308
+ res.status(503).json({ error: "ML model not ready yet" });
309
+ return;
310
+ }
311
+ const scores = await scoreAllPolicies(text, tool);
312
+ res.json({ text, tool, scores });
313
+ });
314
+ // ── License / Usage ───────────────────────────────────────────────────
315
+ app.get("/api/license", (_req, res) => {
316
+ const lic = loadLicense();
317
+ const status = getQuotaStatus();
318
+ res.json({
319
+ ...status,
320
+ api_url: lic.api_url,
321
+ device_id: lic.device_id,
322
+ license_path: licensePath(),
323
+ upgrade_url: upgradeUrl(),
324
+ history: getRecentUsage(6),
325
+ });
326
+ });
327
+ app.post("/api/license/sign-in/start", async (_req, res) => {
328
+ const data = await startCloudAuth();
329
+ if (!data) {
330
+ res.status(503).json({
331
+ error: "Could not reach the license API. Set AGENT_PROXY_API_URL or run the worker locally.",
332
+ });
333
+ return;
334
+ }
335
+ res.json(data);
336
+ });
337
+ app.post("/api/license/sign-in/poll", async (req, res) => {
338
+ const code = String(req.body?.code ?? "").trim();
339
+ if (!code) {
340
+ res.status(400).json({ error: "code is required" });
341
+ return;
342
+ }
343
+ const data = await pollCloudAuth(code);
344
+ if (!data) {
345
+ res.status(503).json({ error: "auth API unreachable" });
346
+ return;
347
+ }
348
+ res.json(data);
349
+ });
350
+ app.post("/api/license/sync", async (_req, res) => {
351
+ const lic = loadLicense();
352
+ if (!lic.jwt) {
353
+ res.status(400).json({ error: "not signed in" });
354
+ return;
355
+ }
356
+ const data = await syncWithCloud();
357
+ if (!data) {
358
+ res.status(503).json({ error: "sync failed" });
359
+ return;
360
+ }
361
+ res.json({ ...data, status: getQuotaStatus() });
362
+ });
363
+ app.post("/api/license/sign-out", (_req, res) => {
364
+ signOutLicense();
365
+ res.json({ ok: true, status: getQuotaStatus() });
366
+ });
367
+ // ── Built-in rules ────────────────────────────────────────────────────
368
+ app.get("/api/builtin-rules", (_req, res) => {
369
+ const overrides = getBuiltinRuleOverrides();
370
+ const decorate = (rules, kind) => rules.map((r) => ({
371
+ id: r.id,
372
+ kind,
373
+ reason: r.reason,
374
+ pattern: r.pattern.toString(),
375
+ enabled: overrides.has(r.id) ? !!overrides.get(r.id) : true,
376
+ }));
377
+ res.json({
378
+ hard_deny: decorate(DENY_PATTERNS, "deny"),
379
+ high_risk: decorate(HIGH_RISK_PATTERNS, "high"),
380
+ medium_risk: decorate(MEDIUM_RISK_PATTERNS, "medium"),
381
+ });
382
+ });
383
+ app.patch("/api/builtin-rules/:id", (req, res) => {
384
+ const id = String(req.params.id || "");
385
+ const all = [...DENY_PATTERNS, ...HIGH_RISK_PATTERNS, ...MEDIUM_RISK_PATTERNS];
386
+ if (!all.some((r) => r.id === id)) {
387
+ res.status(404).json({ error: "unknown rule id" });
388
+ return;
389
+ }
390
+ const enabled = !!req.body?.enabled;
391
+ setBuiltinRuleOverride(id, enabled);
392
+ refreshBuiltinRuleOverrides();
393
+ res.json({ id, enabled });
394
+ });
395
+ app.patch("/api/license", (req, res) => {
396
+ const allowed = ["api_url", "email"];
397
+ const patch = {};
398
+ for (const k of allowed) {
399
+ if (req.body && req.body[k] !== undefined)
400
+ patch[k] = req.body[k];
401
+ }
402
+ patchLicense(patch);
403
+ res.json({ status: getQuotaStatus(), license: loadLicense() });
404
+ });
405
+ app.get("/", (_req, res) => {
406
+ res.type("html").send(DASHBOARD_HTML);
407
+ });
408
+ const server = app.listen(port, () => {
409
+ process.stderr.write(`[agent-proxy] dashboard at http://localhost:${port}
410
+ `);
411
+ });
412
+ server.on("error", (err) => {
413
+ if (err.code === "EADDRINUSE") {
414
+ process.stderr.write(`[agent-proxy] WARN dashboard port ${port} already in use; another instance may be running.
415
+ `);
416
+ }
417
+ else {
418
+ process.stderr.write(`[agent-proxy] dashboard error: ${err.message}
419
+ `);
420
+ }
421
+ });
422
+ }
423
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/dashboard/server.ts"],"names":[],"mappings":"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"}