@jobshimo/browser-link 0.41.0 → 0.43.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 (85) hide show
  1. package/README.md +28 -4
  2. package/dist/activity/db.js +18 -0
  3. package/dist/activity/db.js.map +1 -1
  4. package/dist/activity/extract.d.ts +18 -2
  5. package/dist/activity/extract.js +122 -1
  6. package/dist/activity/extract.js.map +1 -1
  7. package/dist/activity/queries.d.ts +1 -1
  8. package/dist/activity/queries.js +20 -4
  9. package/dist/activity/queries.js.map +1 -1
  10. package/dist/activity/summary.d.ts +54 -0
  11. package/dist/activity/summary.js +95 -0
  12. package/dist/activity/summary.js.map +1 -0
  13. package/dist/activity/types.d.ts +30 -0
  14. package/dist/activity/types.js +31 -1
  15. package/dist/activity/types.js.map +1 -1
  16. package/dist/admin/actions.d.ts +57 -0
  17. package/dist/admin/actions.js +163 -0
  18. package/dist/admin/actions.js.map +1 -0
  19. package/dist/admin/descriptor.d.ts +65 -0
  20. package/dist/admin/descriptor.js +205 -0
  21. package/dist/admin/descriptor.js.map +1 -0
  22. package/dist/admin/i18n.d.ts +90 -0
  23. package/dist/admin/i18n.js +203 -0
  24. package/dist/admin/i18n.js.map +1 -0
  25. package/dist/admin/primary.d.ts +21 -0
  26. package/dist/admin/primary.js +56 -0
  27. package/dist/admin/primary.js.map +1 -0
  28. package/dist/admin/sources.d.ts +22 -0
  29. package/dist/admin/sources.js +82 -0
  30. package/dist/admin/sources.js.map +1 -0
  31. package/dist/bridge/ws-bridge.d.ts +38 -1
  32. package/dist/bridge/ws-bridge.js +114 -0
  33. package/dist/bridge/ws-bridge.js.map +1 -1
  34. package/dist/cli.js +18 -2
  35. package/dist/cli.js.map +1 -1
  36. package/dist/commands/activity.d.ts +5 -0
  37. package/dist/commands/activity.js +92 -1
  38. package/dist/commands/activity.js.map +1 -1
  39. package/dist/commands/config.d.ts +14 -0
  40. package/dist/commands/config.js +48 -4
  41. package/dist/commands/config.js.map +1 -1
  42. package/dist/config.d.ts +10 -0
  43. package/dist/config.js.map +1 -1
  44. package/dist/extension/admin-view.d.ts +95 -0
  45. package/dist/extension/admin-view.js +164 -0
  46. package/dist/extension/admin-view.js.map +1 -0
  47. package/dist/extension/background.js +76 -0
  48. package/dist/extension/background.js.map +1 -1
  49. package/dist/extension/manifest.json +1 -1
  50. package/dist/extension/popup.html +113 -0
  51. package/dist/extension/popup.js +206 -0
  52. package/dist/extension/popup.js.map +1 -1
  53. package/dist/manual/topics.js +2 -2
  54. package/dist/manual/topics.js.map +1 -1
  55. package/dist/map/db.js +26 -0
  56. package/dist/map/db.js.map +1 -1
  57. package/dist/map/learning.d.ts +81 -0
  58. package/dist/map/learning.js +244 -0
  59. package/dist/map/learning.js.map +1 -0
  60. package/dist/map/queries.d.ts +45 -0
  61. package/dist/map/queries.js +108 -5
  62. package/dist/map/queries.js.map +1 -1
  63. package/dist/map/tools.js +2 -1
  64. package/dist/map/tools.js.map +1 -1
  65. package/dist/messages.d.ts +86 -2
  66. package/dist/server.js +23 -0
  67. package/dist/server.js.map +1 -1
  68. package/dist/tools/browser-definitions.js +15 -1
  69. package/dist/tools/browser-definitions.js.map +1 -1
  70. package/dist/tools/browser-dispatch.d.ts +10 -0
  71. package/dist/tools/browser-dispatch.js +88 -18
  72. package/dist/tools/browser-dispatch.js.map +1 -1
  73. package/dist/ui/app.d.ts +4 -1
  74. package/dist/ui/app.js +55 -42
  75. package/dist/ui/app.js.map +1 -1
  76. package/dist/ui/screens/index.d.ts +1 -0
  77. package/dist/ui/screens/index.js +1 -0
  78. package/dist/ui/screens/index.js.map +1 -1
  79. package/dist/ui/screens/menu.d.ts +11 -1
  80. package/dist/ui/screens/menu.js +12 -4
  81. package/dist/ui/screens/menu.js.map +1 -1
  82. package/dist/ui/screens/status.d.ts +19 -0
  83. package/dist/ui/screens/status.js +67 -0
  84. package/dist/ui/screens/status.js.map +1 -0
  85. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/activity/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/activity/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAYH;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,YAAY;IACZ,WAAW;IACX,eAAe;IACf,SAAS;IACT,WAAW;IACX,WAAW;IACX,kBAAkB;IAClB,cAAc;IACd,kBAAkB;IAClB,WAAW;IACX,cAAc;CACN,CAAC;AAIX,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,cAAoC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5F,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { type BrowserLinkConfig } from '../config.js';
2
+ import { disableTools, enableTools } from '../commands/tools.js';
3
+ import { disableAutoReelect, disableMultiAgent, enableAutoReelect, enableMultiAgent } from '../commands/multi-agent.js';
4
+ import { setCdpDirectEnabled, setCdpDirectGrantTtl } from '../commands/config.js';
5
+ import type { ClientId } from '../installers/index.js';
6
+ import type { AdminActionResult } from '../messages.js';
7
+ import { type AdminInput } from './descriptor.js';
8
+ /**
9
+ * Admin actions (S2). The only way the popup changes server state, and a
10
+ * closed allowlist: an action id must name an actionable item of the state
11
+ * the server builds right now (so a tool outside the catalogue, a client
12
+ * that is not detected, or a readout can never be written), its value is
13
+ * checked against the item's kind and options, a disk write needs an
14
+ * explicit `confirm: true`, and the write itself goes through the SAME
15
+ * helper the CLI uses, never a new write path.
16
+ */
17
+ export interface AdminActionRequest {
18
+ id: string;
19
+ value?: string | number | boolean;
20
+ confirm?: boolean;
21
+ }
22
+ /** The existing write helpers, injectable so tests can spy on each one. */
23
+ export interface AdminHelpers {
24
+ saveConfig: (patch: Partial<BrowserLinkConfig>) => unknown;
25
+ enableTools: typeof enableTools;
26
+ disableTools: typeof disableTools;
27
+ enableMultiAgent: typeof enableMultiAgent;
28
+ disableMultiAgent: typeof disableMultiAgent;
29
+ enableAutoReelect: typeof enableAutoReelect;
30
+ disableAutoReelect: typeof disableAutoReelect;
31
+ setCdpDirectEnabled: typeof setCdpDirectEnabled;
32
+ setCdpDirectGrantTtl: typeof setCdpDirectGrantTtl;
33
+ installInstructionsFor: (client: ClientId) => {
34
+ ok: boolean;
35
+ message?: string;
36
+ };
37
+ uninstallInstructionsFor: (client: ClientId) => {
38
+ ok: boolean;
39
+ message?: string;
40
+ };
41
+ installFor: (client: ClientId) => {
42
+ installedClient: boolean;
43
+ message: string;
44
+ };
45
+ }
46
+ export declare const DEFAULT_ADMIN_HELPERS: AdminHelpers;
47
+ export interface AdminActionDeps {
48
+ /** Fresh facts for the state; called before and after the action. */
49
+ input: () => Promise<AdminInput>;
50
+ /** `runDoctor` + `formatDoctor`, split into lines. Slow: runs only on the button. */
51
+ doctor: () => Promise<string[]>;
52
+ /** A forced update check, formatted into lines (network). */
53
+ checkUpdates: () => Promise<string[]>;
54
+ helpers?: Partial<AdminHelpers>;
55
+ }
56
+ /** Validate, confirm, apply. Never throws: every failure is `ok: false`. */
57
+ export declare function applyAdminAction(req: AdminActionRequest, deps: AdminActionDeps): Promise<AdminActionResult>;
@@ -0,0 +1,163 @@
1
+ import { saveConfig } from '../config.js';
2
+ import { disableTools, enableTools } from '../commands/tools.js';
3
+ import { disableAutoReelect, disableMultiAgent, enableAutoReelect, enableMultiAgent, } from '../commands/multi-agent.js';
4
+ import { setCdpDirectEnabled, setCdpDirectGrantTtl } from '../commands/config.js';
5
+ import { installInstructionsFor, uninstallInstructionsFor } from '../commands/instructions.js';
6
+ import { installFor } from '../commands/install.js';
7
+ import { adminItems, adminLanguage, buildAdminState } from './descriptor.js';
8
+ import { ADMIN_I18N } from './i18n.js';
9
+ export const DEFAULT_ADMIN_HELPERS = {
10
+ saveConfig,
11
+ enableTools,
12
+ disableTools,
13
+ enableMultiAgent,
14
+ disableMultiAgent,
15
+ enableAutoReelect,
16
+ disableAutoReelect,
17
+ setCdpDirectEnabled,
18
+ setCdpDirectGrantTtl,
19
+ installInstructionsFor,
20
+ uninstallInstructionsFor,
21
+ installFor: (client) => installFor(client),
22
+ };
23
+ /** Toggles whose value is one config key written with `saveConfig`, exactly
24
+ * as the console does for the keys without a dedicated CLI helper. */
25
+ const PLAIN_TOGGLES = [
26
+ 'instructionsAutoRefresh',
27
+ 'activityEnabled',
28
+ 'activityRecordPayloads',
29
+ ];
30
+ function isPlainToggle(id) {
31
+ return PLAIN_TOGGLES.includes(id);
32
+ }
33
+ class AdminRefusal extends Error {
34
+ }
35
+ function suffix(id, prefix) {
36
+ return id.startsWith(prefix) ? id.slice(prefix.length) : null;
37
+ }
38
+ function lines(text) {
39
+ return text === undefined || text.length === 0 ? [] : text.split('\n');
40
+ }
41
+ function checkValue(item, value) {
42
+ if (item.kind === 'toggle')
43
+ return typeof value === 'boolean';
44
+ if (item.kind === 'select') {
45
+ if (typeof value !== 'string' && typeof value !== 'number')
46
+ return false;
47
+ return (item.options ?? []).some((o) => o.value === String(value));
48
+ }
49
+ return true;
50
+ }
51
+ function preview(item, value, input) {
52
+ const t = ADMIN_I18N[adminLanguage(input.config)];
53
+ const tool = suffix(item.id, 'tools.');
54
+ if (tool !== null)
55
+ return value === true ? t.previewToolOn(tool) : t.previewToolOff(tool);
56
+ if (item.kind === 'toggle')
57
+ return t.previewToggle(item.label, value === true);
58
+ if (item.kind === 'select') {
59
+ const option = item.options?.find((o) => o.value === String(value));
60
+ return t.previewSelect(item.label, option?.label ?? String(value));
61
+ }
62
+ const displayName = (id) => input.instructions.find((s) => s.id === id)?.displayName ??
63
+ input.clients.find((c) => c.id === id)?.displayName ??
64
+ String(id);
65
+ const install = suffix(item.id, 'instructions.install.');
66
+ if (install !== null)
67
+ return t.previewInstall(displayName(install));
68
+ const uninstall = suffix(item.id, 'instructions.uninstall.');
69
+ if (uninstall !== null)
70
+ return t.previewUninstall(displayName(uninstall));
71
+ return t.previewRegister(displayName(suffix(item.id, 'client.register.')));
72
+ }
73
+ /** Runs the write for one validated, confirmed item. Returns output lines;
74
+ * throws an `AdminRefusal` (or the helper's own error) when it refused. */
75
+ async function apply(item, value, input, deps, h) {
76
+ const language = adminLanguage(input.config);
77
+ const on = value === true;
78
+ const { id } = item;
79
+ if (id === 'doctor')
80
+ return deps.doctor();
81
+ if (id === 'updates.check')
82
+ return deps.checkUpdates();
83
+ if (id === 'language') {
84
+ h.saveConfig({ language: value === 'es' ? 'es' : 'en' });
85
+ return [];
86
+ }
87
+ const tool = suffix(id, 'tools.');
88
+ if (tool !== null) {
89
+ return lines(on ? h.enableTools([tool], language) : h.disableTools([tool], language));
90
+ }
91
+ if (id === 'multiAgent') {
92
+ return lines(on ? h.enableMultiAgent(language) : h.disableMultiAgent(language));
93
+ }
94
+ if (id === 'autoReelect') {
95
+ return lines(on ? h.enableAutoReelect(language) : h.disableAutoReelect(language));
96
+ }
97
+ if (isPlainToggle(id)) {
98
+ h.saveConfig({ [id]: on });
99
+ return [];
100
+ }
101
+ if (id === 'cdpDirectEnabled')
102
+ return lines(h.setCdpDirectEnabled(String(on), language));
103
+ if (id === 'cdpDirectGrantTtlMinutes') {
104
+ return lines(h.setCdpDirectGrantTtl(String(value), language));
105
+ }
106
+ const install = suffix(id, 'instructions.install.');
107
+ const uninstall = suffix(id, 'instructions.uninstall.');
108
+ if (install !== null || uninstall !== null) {
109
+ const report = install !== null
110
+ ? h.installInstructionsFor(install)
111
+ : h.uninstallInstructionsFor(uninstall);
112
+ if (!report.ok)
113
+ throw new AdminRefusal(report.message ?? id);
114
+ return lines(report.message);
115
+ }
116
+ const register = suffix(id, 'client.register.');
117
+ if (register !== null) {
118
+ const report = h.installFor(register);
119
+ if (!report.installedClient)
120
+ throw new AdminRefusal(report.message);
121
+ return lines(report.message);
122
+ }
123
+ // Reaching here means the descriptor offers an actionable item this
124
+ // module does not know: refuse rather than guess.
125
+ throw new AdminRefusal(ADMIN_I18N[language].unknownAction(id));
126
+ }
127
+ /** Validate, confirm, apply. Never throws: every failure is `ok: false`. */
128
+ export async function applyAdminAction(req, deps) {
129
+ try {
130
+ const input = await deps.input();
131
+ const t = ADMIN_I18N[adminLanguage(input.config)];
132
+ const item = adminItems(buildAdminState(input)).find((i) => i.id === req.id);
133
+ if (!item)
134
+ return { ok: false, error: t.unknownAction(req.id) };
135
+ if (item.kind === 'readout' || item.kind === 'link') {
136
+ return { ok: false, error: t.notAnAction(item.id) };
137
+ }
138
+ if (!checkValue(item, req.value))
139
+ return { ok: false, error: t.invalidValue(item.id) };
140
+ if (item.writesDisk && req.confirm !== true) {
141
+ return {
142
+ ok: true,
143
+ applied: false,
144
+ needsConfirm: true,
145
+ preview: preview(item, req.value, input),
146
+ };
147
+ }
148
+ const helpers = { ...DEFAULT_ADMIN_HELPERS, ...deps.helpers };
149
+ const output = await apply(item, req.value, input, deps, helpers);
150
+ const state = buildAdminState(await deps.input());
151
+ return {
152
+ ok: true,
153
+ applied: true,
154
+ ...(item.requiresRestart ? { requiresRestart: true } : {}),
155
+ state,
156
+ ...(output.length > 0 ? { output } : {}),
157
+ };
158
+ }
159
+ catch (error) {
160
+ return { ok: false, error: error instanceof Error ? error.message : String(error) };
161
+ }
162
+ }
163
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/admin/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { type BrowserLinkConfig } from '../config.js';
2
+ import type { ClientInstructionsStatus } from '../manual/status.js';
3
+ import type { ClientId } from '../installers/index.js';
4
+ import type { DoctorServerStatus } from '../commands/doctor.js';
5
+ import type { Language } from '../commands/welcome.js';
6
+ import type { AdminItem, AdminState } from '../messages.js';
7
+ /**
8
+ * The admin descriptor (S1): one source of truth for what the console's
9
+ * status view and the popup's Admin section show. `buildAdminState` is pure:
10
+ * every fact arrives in `AdminInput`, gathered by `admin/sources.ts` in the
11
+ * primary (in process) or in the console (out of process, through the
12
+ * primary's `/version`). Every string is localised here.
13
+ *
14
+ * Process-ending operations (`stop`/free-port, self-update) are never
15
+ * actions: they would end the very primary that answers the popup, so they
16
+ * are readouts carrying the console command instead.
17
+ */
18
+ export declare const REPO_URL = "https://github.com/jobshimo/browser-link";
19
+ export declare const STOP_COMMAND = "browser-link stop";
20
+ export declare const SELF_UPDATE_COMMAND = "npm install -g @jobshimo/browser-link@latest";
21
+ export interface AdminClient {
22
+ id: ClientId;
23
+ displayName: string;
24
+ /** The client's config exists on this machine. */
25
+ installed: boolean;
26
+ /** browser-link is already registered in it. */
27
+ registered: boolean;
28
+ }
29
+ export interface AdminInput {
30
+ config: BrowserLinkConfig;
31
+ /** Epoch ms used for `generatedAt` and the uptime. */
32
+ now: number;
33
+ /** The version of the process building the state. */
34
+ version: string;
35
+ /** Running primary (from `/version` or in process) against the version on disk. */
36
+ server: DoctorServerStatus;
37
+ /** `null` when unknown: the console runs out of process. */
38
+ tabsConnected: number | null;
39
+ ports: {
40
+ ws: number;
41
+ ipc: number;
42
+ };
43
+ extension: {
44
+ path: string | null;
45
+ connectedVersion: string | null;
46
+ };
47
+ instructions: readonly ClientInstructionsStatus[];
48
+ clients: readonly AdminClient[];
49
+ cdpGrant: {
50
+ live: boolean;
51
+ remainingMs: number | null;
52
+ };
53
+ /** Cached update check; `null` when none ran yet. */
54
+ update: {
55
+ latest: string | null;
56
+ isNewer: boolean;
57
+ } | null;
58
+ toolNames: readonly string[];
59
+ downloadsDir: string;
60
+ }
61
+ export declare function adminLanguage(config: BrowserLinkConfig): Language;
62
+ export declare function formatUptime(ms: number): string;
63
+ export declare function buildAdminState(input: AdminInput): AdminState;
64
+ /** Every item of a state, in display order. */
65
+ export declare function adminItems(state: AdminState): AdminItem[];
@@ -0,0 +1,205 @@
1
+ import { DEFAULT_CDP_DIRECT_PORT, DEFAULT_GRANT_TTL_MINUTES, } from '../config.js';
2
+ import { ADMIN_I18N } from './i18n.js';
3
+ /**
4
+ * The admin descriptor (S1): one source of truth for what the console's
5
+ * status view and the popup's Admin section show. `buildAdminState` is pure:
6
+ * every fact arrives in `AdminInput`, gathered by `admin/sources.ts` in the
7
+ * primary (in process) or in the console (out of process, through the
8
+ * primary's `/version`). Every string is localised here.
9
+ *
10
+ * Process-ending operations (`stop`/free-port, self-update) are never
11
+ * actions: they would end the very primary that answers the popup, so they
12
+ * are readouts carrying the console command instead.
13
+ */
14
+ export const REPO_URL = 'https://github.com/jobshimo/browser-link';
15
+ export const STOP_COMMAND = 'browser-link stop';
16
+ export const SELF_UPDATE_COMMAND = 'npm install -g @jobshimo/browser-link@latest';
17
+ /** Common lifetimes for the cdp-direct grant select; `0` = never expires. */
18
+ const GRANT_TTL_CHOICES = [15, 30, 60, 240, 1440, 0];
19
+ export function adminLanguage(config) {
20
+ return config.language === 'es' ? 'es' : 'en';
21
+ }
22
+ function readout(id, label, value, extra = {}) {
23
+ return { id, kind: 'readout', label, value, writesDisk: false, ...extra };
24
+ }
25
+ function toggle(id, label, value, requiresRestart = false) {
26
+ return {
27
+ id,
28
+ kind: 'toggle',
29
+ label,
30
+ value,
31
+ writesDisk: true,
32
+ ...(requiresRestart ? { requiresRestart: true } : {}),
33
+ };
34
+ }
35
+ export function formatUptime(ms) {
36
+ const totalMinutes = Math.max(0, Math.floor(ms / 60_000));
37
+ const days = Math.floor(totalMinutes / 1440);
38
+ const hours = Math.floor((totalMinutes % 1440) / 60);
39
+ const minutes = totalMinutes % 60;
40
+ if (days > 0)
41
+ return `${days}d ${hours}h ${minutes}m`;
42
+ if (hours > 0)
43
+ return `${hours}h ${minutes}m`;
44
+ return `${minutes}m`;
45
+ }
46
+ function statusSection(input, t) {
47
+ const { server, config } = input;
48
+ const running = server.running;
49
+ const startedAt = running ? Date.parse(running.startedAt) : NaN;
50
+ const items = [
51
+ readout('status.server', t.server, running ? t.serverRunning(running.version) : t.serverNotRunning, running ? {} : { hint: t.serverNotRunningHint }),
52
+ readout('status.installed', t.installed, server.installed === null
53
+ ? t.unknown
54
+ : server.outdated
55
+ ? t.installedOutdated(server.installed)
56
+ : server.installed, server.outdated ? { hint: STOP_COMMAND } : {}),
57
+ readout('status.pid', t.pid, running ? running.pid : null),
58
+ readout('status.uptime', t.uptime, running && Number.isFinite(startedAt) ? formatUptime(input.now - startedAt) : null),
59
+ readout('status.tabs', t.tabs, input.tabsConnected, input.tabsConnected === null ? { hint: t.tabsUnknownHint } : {}),
60
+ readout('status.ports', t.ports, `WS ${input.ports.ws} · IPC ${input.ports.ipc}`),
61
+ readout('status.multiAgent', t.multiAgentStatus, config.multiAgent === false ? t.off : t.on),
62
+ readout('status.extension', t.extension,
63
+ // Out of process the console cannot see the tabs, so it cannot know.
64
+ input.tabsConnected === null
65
+ ? t.unknown
66
+ : input.extension.connectedVersion === null
67
+ ? t.extensionNotConnected
68
+ : input.extension.connectedVersion === input.version
69
+ ? t.extensionAligned(input.extension.connectedVersion)
70
+ : t.extensionMismatch(input.extension.connectedVersion, input.version)),
71
+ ...input.instructions.map((s) => readout(`status.instructions.${s.id}`, t.instructionsFor(s.displayName), t.instructionsState(s.state))),
72
+ readout('status.cdpDirect', t.cdpDirect, config.cdpDirectEnabled !== true
73
+ ? t.off
74
+ : input.cdpGrant.live
75
+ ? t.cdpDirectGranted(input.cdpGrant.remainingMs === null
76
+ ? null
77
+ : Math.ceil(input.cdpGrant.remainingMs / 60_000))
78
+ : t.cdpDirectNoGrant),
79
+ readout('status.update', t.update, input.update === null || input.update.latest === null
80
+ ? t.unknown
81
+ : input.update.isNewer
82
+ ? t.updateAvailable(input.update.latest)
83
+ : t.upToDate, input.update?.isNewer === true ? { hint: SELF_UPDATE_COMMAND } : {}),
84
+ readout('status.activity', t.activity, config.activityEnabled === false ? t.off : t.on),
85
+ ];
86
+ return { id: 'status', title: t.sections.status, items };
87
+ }
88
+ function grantTtlOptions(current, t) {
89
+ const values = [...GRANT_TTL_CHOICES];
90
+ if (!values.includes(current))
91
+ values.unshift(current);
92
+ return values.map((n) => ({ value: String(n), label: n === 0 ? t.never : t.minutes(n) }));
93
+ }
94
+ function setupSection(input, t) {
95
+ const { config } = input;
96
+ const disabled = new Set(config.disabledTools ?? []);
97
+ const grantTtl = config.cdpDirectGrantTtlMinutes ?? DEFAULT_GRANT_TTL_MINUTES;
98
+ const items = [
99
+ {
100
+ id: 'language',
101
+ kind: 'select',
102
+ label: t.language,
103
+ value: adminLanguage(config),
104
+ options: [
105
+ { value: 'en', label: 'English' },
106
+ { value: 'es', label: 'Español' },
107
+ ],
108
+ writesDisk: true,
109
+ },
110
+ ...input.toolNames.map((name) => toggle(`tools.${name}`, t.tool(name), !disabled.has(name))),
111
+ toggle('multiAgent', t.multiAgent, config.multiAgent !== false, true),
112
+ toggle('autoReelect', t.autoReelect, config.autoReelect === true, true),
113
+ toggle('instructionsAutoRefresh', t.instructionsAutoRefresh, config.instructionsAutoRefresh !== false, true),
114
+ toggle('cdpDirectEnabled', t.cdpDirectEnabled, config.cdpDirectEnabled === true),
115
+ readout('cdpDirectPort', t.cdpDirectPort, config.cdpDirectPort ?? DEFAULT_CDP_DIRECT_PORT, {
116
+ hint: 'browser-link config set cdp-direct.port <port>',
117
+ }),
118
+ {
119
+ id: 'cdpDirectGrantTtlMinutes',
120
+ kind: 'select',
121
+ label: t.cdpDirectGrantTtl,
122
+ value: String(grantTtl),
123
+ options: grantTtlOptions(grantTtl, t),
124
+ writesDisk: true,
125
+ },
126
+ // Read once when the primary wires the trail, so a change needs a restart.
127
+ toggle('activityEnabled', t.activityEnabled, config.activityEnabled !== false, true),
128
+ toggle('activityRecordPayloads', t.activityRecordPayloads, config.activityRecordPayloads !== false, true),
129
+ readout('downloadsDir', t.downloadsDir, input.downloadsDir, {
130
+ hint: 'browser-link config set downloads.dir <absolute-path|default>',
131
+ }),
132
+ // These two keep their timestamped `settings.update` path (popup and
133
+ // `config set`), so the admin panel only shows them.
134
+ readout('idleTtl', t.idleTtl, config.idleTtlMinutes === undefined
135
+ ? t.popupDefault
136
+ : config.idleTtlMinutes === 0
137
+ ? t.never
138
+ : t.minutes(config.idleTtlMinutes), { hint: t.idleTtlHint }),
139
+ readout('flowRecording', t.flowRecording, config.flowRecordingEnabled === undefined
140
+ ? t.popupDefault
141
+ : config.flowRecordingEnabled
142
+ ? t.on
143
+ : t.off, { hint: t.flowRecordingHint }),
144
+ ];
145
+ return { id: 'setup', title: t.sections.setup, items };
146
+ }
147
+ function button(id, label, writesDisk, description) {
148
+ return { id, kind: 'button', label, writesDisk, ...(description ? { description } : {}) };
149
+ }
150
+ function diagnoseSection(input, t) {
151
+ const items = [
152
+ button('doctor', t.doctor, false),
153
+ button('updates.check', t.updatesCheck, false),
154
+ ];
155
+ for (const s of input.instructions) {
156
+ // A corrupt file is the CLI's business: the installers refuse to touch it.
157
+ if (s.state.kind === 'corrupt')
158
+ continue;
159
+ items.push(button(`instructions.install.${s.id}`, t.instructionsInstall(s.displayName), true));
160
+ if (s.state.kind === 'installed' || s.state.kind === 'installed-outdated') {
161
+ items.push(button(`instructions.uninstall.${s.id}`, t.instructionsUninstall(s.displayName), true));
162
+ }
163
+ }
164
+ for (const c of input.clients) {
165
+ if (!c.installed)
166
+ continue;
167
+ items.push(button(`client.register.${c.id}`, t.register(c.displayName), true, c.registered ? t.registered : t.notRegistered));
168
+ }
169
+ items.push(readout('stop', t.stop, STOP_COMMAND, { description: t.stopDescription }));
170
+ items.push(readout('selfUpdate', t.selfUpdate, SELF_UPDATE_COMMAND, {
171
+ description: t.selfUpdateDescription,
172
+ }));
173
+ return { id: 'diagnose', title: t.sections.diagnose, items };
174
+ }
175
+ function referenceSection(input, t) {
176
+ return {
177
+ id: 'reference',
178
+ title: t.sections.reference,
179
+ items: [
180
+ readout('about', t.about, t.aboutText),
181
+ { id: 'repo', kind: 'link', label: t.repo, value: REPO_URL, writesDisk: false },
182
+ readout('extension.path', t.extensionPath, input.extension.path ?? t.extensionNotFound),
183
+ ],
184
+ };
185
+ }
186
+ export function buildAdminState(input) {
187
+ const language = adminLanguage(input.config);
188
+ const t = ADMIN_I18N[language];
189
+ return {
190
+ version: 1,
191
+ generatedAt: new Date(input.now).toISOString(),
192
+ sections: [
193
+ statusSection(input, t),
194
+ setupSection(input, t),
195
+ diagnoseSection(input, t),
196
+ referenceSection(input, t),
197
+ ],
198
+ ui: { language, ...t.ui },
199
+ };
200
+ }
201
+ /** Every item of a state, in display order. */
202
+ export function adminItems(state) {
203
+ return state.sections.flatMap((s) => s.items);
204
+ }
205
+ //# sourceMappingURL=descriptor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"descriptor.js","sourceRoot":"","sources":["../../src/admin/descriptor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ import type { Language } from '../commands/welcome.js';
2
+ import type { InstructionsState } from '../agent-instructions/index.js';
3
+ import type { AdminUiStrings } from '../messages.js';
4
+ /**
5
+ * Every string the admin descriptor and actions send, for `en` and `es`.
6
+ * The server localises here so the popup renders the state dumbly; the
7
+ * console keeps its own per-screen tables for everything else.
8
+ */
9
+ export interface AdminI18n {
10
+ ui: Omit<AdminUiStrings, 'language'>;
11
+ sections: {
12
+ status: string;
13
+ setup: string;
14
+ diagnose: string;
15
+ reference: string;
16
+ };
17
+ on: string;
18
+ off: string;
19
+ unknown: string;
20
+ server: string;
21
+ serverRunning: (version: string) => string;
22
+ serverNotRunning: string;
23
+ serverNotRunningHint: string;
24
+ installed: string;
25
+ installedOutdated: (installed: string) => string;
26
+ pid: string;
27
+ uptime: string;
28
+ tabs: string;
29
+ tabsUnknownHint: string;
30
+ ports: string;
31
+ multiAgentStatus: string;
32
+ extension: string;
33
+ extensionAligned: (version: string) => string;
34
+ extensionMismatch: (ext: string, server: string) => string;
35
+ extensionNotConnected: string;
36
+ instructionsFor: (client: string) => string;
37
+ instructionsState: (state: InstructionsState) => string;
38
+ cdpDirect: string;
39
+ cdpDirectGranted: (minutes: number | null) => string;
40
+ cdpDirectNoGrant: string;
41
+ update: string;
42
+ updateAvailable: (latest: string) => string;
43
+ upToDate: string;
44
+ activity: string;
45
+ language: string;
46
+ tool: (name: string) => string;
47
+ multiAgent: string;
48
+ autoReelect: string;
49
+ instructionsAutoRefresh: string;
50
+ cdpDirectEnabled: string;
51
+ cdpDirectPort: string;
52
+ cdpDirectGrantTtl: string;
53
+ minutes: (n: number) => string;
54
+ never: string;
55
+ activityEnabled: string;
56
+ activityRecordPayloads: string;
57
+ downloadsDir: string;
58
+ idleTtl: string;
59
+ idleTtlHint: string;
60
+ flowRecording: string;
61
+ flowRecordingHint: string;
62
+ popupDefault: string;
63
+ doctor: string;
64
+ updatesCheck: string;
65
+ instructionsInstall: (client: string) => string;
66
+ instructionsUninstall: (client: string) => string;
67
+ register: (client: string) => string;
68
+ registered: string;
69
+ notRegistered: string;
70
+ stop: string;
71
+ stopDescription: string;
72
+ selfUpdate: string;
73
+ selfUpdateDescription: string;
74
+ about: string;
75
+ aboutText: string;
76
+ repo: string;
77
+ extensionPath: string;
78
+ extensionNotFound: string;
79
+ unknownAction: (id: string) => string;
80
+ notAnAction: (id: string) => string;
81
+ invalidValue: (id: string) => string;
82
+ previewToolOn: (name: string) => string;
83
+ previewToolOff: (name: string) => string;
84
+ previewToggle: (label: string, on: boolean) => string;
85
+ previewSelect: (label: string, option: string) => string;
86
+ previewInstall: (client: string) => string;
87
+ previewUninstall: (client: string) => string;
88
+ previewRegister: (client: string) => string;
89
+ }
90
+ export declare const ADMIN_I18N: Record<Language, AdminI18n>;