@openagt/dashboard 0.40.0 → 0.41.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 (129) hide show
  1. package/dist/built-in.d.ts +5 -0
  2. package/dist/built-in.d.ts.map +1 -1
  3. package/dist/built-in.js +7 -0
  4. package/dist/built-in.js.map +1 -1
  5. package/dist/clone-project.d.ts +11 -0
  6. package/dist/clone-project.d.ts.map +1 -1
  7. package/dist/clone-project.js +38 -12
  8. package/dist/clone-project.js.map +1 -1
  9. package/dist/daemon-runtime.d.ts.map +1 -1
  10. package/dist/daemon-runtime.js +216 -63
  11. package/dist/daemon-runtime.js.map +1 -1
  12. package/dist/daemon.js +2 -2
  13. package/dist/daemon.js.map +1 -1
  14. package/dist/dashboard/activity.d.ts +2 -2
  15. package/dist/dashboard/activity.d.ts.map +1 -1
  16. package/dist/dashboard/activity.js +2 -2
  17. package/dist/dashboard/activity.js.map +1 -1
  18. package/dist/dashboard/elsewhere.d.ts +92 -0
  19. package/dist/dashboard/elsewhere.d.ts.map +1 -0
  20. package/dist/dashboard/elsewhere.js +155 -0
  21. package/dist/dashboard/elsewhere.js.map +1 -0
  22. package/dist/dashboard/interventions.d.ts +6 -0
  23. package/dist/dashboard/interventions.d.ts.map +1 -1
  24. package/dist/dashboard/interventions.js.map +1 -1
  25. package/dist/dashboard/machine-interventions.d.ts +52 -0
  26. package/dist/dashboard/machine-interventions.d.ts.map +1 -0
  27. package/dist/dashboard/machine-interventions.js +117 -0
  28. package/dist/dashboard/machine-interventions.js.map +1 -0
  29. package/dist/dashboard/module-serve.d.ts +6 -0
  30. package/dist/dashboard/module-serve.d.ts.map +1 -1
  31. package/dist/dashboard/module-serve.js +11 -1
  32. package/dist/dashboard/module-serve.js.map +1 -1
  33. package/dist/dashboard/overview.d.ts +20 -5
  34. package/dist/dashboard/overview.d.ts.map +1 -1
  35. package/dist/dashboard/overview.js +28 -8
  36. package/dist/dashboard/overview.js.map +1 -1
  37. package/dist/dashboard/projects.d.ts +11 -2
  38. package/dist/dashboard/projects.d.ts.map +1 -1
  39. package/dist/dashboard/projects.js +3 -2
  40. package/dist/dashboard/projects.js.map +1 -1
  41. package/dist/dashboard/relay-endpoints.d.ts +2 -0
  42. package/dist/dashboard/relay-endpoints.d.ts.map +1 -1
  43. package/dist/dashboard/relay-endpoints.js +4 -2
  44. package/dist/dashboard/relay-endpoints.js.map +1 -1
  45. package/dist/dashboard/rpc-serve.d.ts +21 -1
  46. package/dist/dashboard/rpc-serve.d.ts.map +1 -1
  47. package/dist/dashboard/rpc-serve.js +9 -3
  48. package/dist/dashboard/rpc-serve.js.map +1 -1
  49. package/dist/dashboard/server.d.ts +2 -0
  50. package/dist/dashboard/server.d.ts.map +1 -1
  51. package/dist/dashboard/server.js +6 -4
  52. package/dist/dashboard/server.js.map +1 -1
  53. package/dist/dashboard/types.d.ts +3 -1
  54. package/dist/dashboard/types.d.ts.map +1 -1
  55. package/dist/dashboard-bundle/assets/host/module-BcFzlJhp.js +1 -0
  56. package/dist/dashboard-bundle/assets/main-Ca6eaXat.css +2 -0
  57. package/dist/dashboard-bundle/assets/main-rpNhGecV.js +148 -0
  58. package/dist/dashboard-bundle/assets/{module-C8GDq0nb.js → module-Bhd9t16k.js} +5 -5
  59. package/dist/dashboard-bundle/index.html +4 -4
  60. package/dist/dashboard-rpc/context.js +1 -1
  61. package/dist/dashboard-rpc/context.js.map +1 -1
  62. package/dist/dashboard-rpc/index.d.ts +1 -1
  63. package/dist/dashboard-rpc/index.d.ts.map +1 -1
  64. package/dist/dashboard-rpc/index.js +1 -1
  65. package/dist/dashboard-rpc/index.js.map +1 -1
  66. package/dist/dashboard-rpc/machines.d.ts +18 -3
  67. package/dist/dashboard-rpc/machines.d.ts.map +1 -1
  68. package/dist/dashboard-rpc/machines.js +78 -21
  69. package/dist/dashboard-rpc/machines.js.map +1 -1
  70. package/dist/dashboard-rpc/modules.d.ts.map +1 -1
  71. package/dist/dashboard-rpc/modules.js +19 -3
  72. package/dist/dashboard-rpc/modules.js.map +1 -1
  73. package/dist/dashboard-rpc/projects.d.ts +14 -0
  74. package/dist/dashboard-rpc/projects.d.ts.map +1 -1
  75. package/dist/dashboard-rpc/projects.js +48 -5
  76. package/dist/dashboard-rpc/projects.js.map +1 -1
  77. package/dist/dashboard-rpc/reads.d.ts +6 -0
  78. package/dist/dashboard-rpc/reads.d.ts.map +1 -1
  79. package/dist/dashboard-rpc/reads.js +48 -14
  80. package/dist/dashboard-rpc/reads.js.map +1 -1
  81. package/dist/dashboard-rpc/relay-dispatch.d.ts +12 -0
  82. package/dist/dashboard-rpc/relay-dispatch.d.ts.map +1 -1
  83. package/dist/dashboard-rpc/relay-dispatch.js +42 -7
  84. package/dist/dashboard-rpc/relay-dispatch.js.map +1 -1
  85. package/dist/dashboard-rpc/runs-changed.d.ts.map +1 -1
  86. package/dist/dashboard-rpc/runs-changed.js +14 -6
  87. package/dist/dashboard-rpc/runs-changed.js.map +1 -1
  88. package/dist/dashboard-rpc/test-context.d.ts +3 -1
  89. package/dist/dashboard-rpc/test-context.d.ts.map +1 -1
  90. package/dist/dashboard-rpc/test-context.js +13 -1
  91. package/dist/dashboard-rpc/test-context.js.map +1 -1
  92. package/dist/module-types/dashboard/components/MachineMark.d.ts +14 -0
  93. package/dist/module-types/dashboard/lib/models.d.ts +6 -0
  94. package/dist/module-types/dashboard/rpc/machines.d.ts +35 -0
  95. package/dist/module-types/src/built-in.d.ts +5 -0
  96. package/dist/module-types/src/clone-project.d.ts +11 -0
  97. package/dist/module-types/src/dashboard/activity.d.ts +2 -2
  98. package/dist/module-types/src/dashboard/elsewhere.d.ts +91 -0
  99. package/dist/module-types/src/dashboard/interventions.d.ts +6 -0
  100. package/dist/module-types/src/dashboard/machine-interventions.d.ts +51 -0
  101. package/dist/module-types/src/dashboard/module-serve.d.ts +6 -0
  102. package/dist/module-types/src/dashboard/overview.d.ts +20 -5
  103. package/dist/module-types/src/dashboard/projects.d.ts +11 -2
  104. package/dist/module-types/src/dashboard/rpc-serve.d.ts +21 -1
  105. package/dist/module-types/src/dashboard/types.d.ts +3 -1
  106. package/dist/module-types/src/dashboard-rpc/index.d.ts +1 -1
  107. package/dist/module-types/src/dashboard-rpc/machines.d.ts +18 -3
  108. package/dist/module-types/src/dashboard-rpc/projects.d.ts +14 -0
  109. package/dist/module-types/src/dashboard-rpc/reads.d.ts +6 -0
  110. package/dist/module-types/src/dashboard-rpc/relay-dispatch.d.ts +28 -0
  111. package/dist/module-types/src/project-modules.d.ts +19 -0
  112. package/dist/module-types/src/registry.d.ts +8 -0
  113. package/dist/module-types/src/repository-address.d.ts +6 -0
  114. package/dist/project-modules.d.ts +19 -0
  115. package/dist/project-modules.d.ts.map +1 -1
  116. package/dist/project-modules.js +42 -2
  117. package/dist/project-modules.js.map +1 -1
  118. package/dist/registry.d.ts +8 -0
  119. package/dist/registry.d.ts.map +1 -1
  120. package/dist/registry.js +13 -2
  121. package/dist/registry.js.map +1 -1
  122. package/dist/repository-address.d.ts +6 -0
  123. package/dist/repository-address.d.ts.map +1 -1
  124. package/dist/repository-address.js +9 -0
  125. package/dist/repository-address.js.map +1 -1
  126. package/package.json +15 -15
  127. package/dist/dashboard-bundle/assets/host/module-JRfd42hf.js +0 -1
  128. package/dist/dashboard-bundle/assets/main-BhC5aJ1h.css +0 -2
  129. package/dist/dashboard-bundle/assets/main-Bo8Pao9A.js +0 -148
@@ -0,0 +1,52 @@
1
+ import type { Intervention } from './interventions.js';
2
+ import type { ProjectionRead } from './projects.js';
3
+ /**
4
+ * The Human Queue of the person's other computers, beside this one's own: what needs the person in
5
+ * a run there (its question, the work it left unpublished, the PR it opened) and the PRs of a
6
+ * project only another computer has. Each computer says the items of its own projects only, never
7
+ * the ones it lists of other computers', so two computers never ask each other in a circle. Here
8
+ * each item is named by the project as it is listed here: this computer's own of the same
9
+ * repository, else the other computer's under its id here; and an item of a run there is marked
10
+ * with that computer.
11
+ */
12
+ /** What the person's other computers said of their Human Queues, each as named here, and the projects here that one which did not answer has. */
13
+ export interface MachinesQueue {
14
+ said: ProjectionRead<Intervention>[];
15
+ /** Projects here whose items on a computer that did not answer are not known: none of them is read whole. */
16
+ unread: string[];
17
+ }
18
+ /** What a computer answered as its Human Queue, the items that read as items, each in the fields an item has: anything else is dropped. */
19
+ export declare function interventionsOf(said: unknown): ProjectionRead<Intervention>;
20
+ /**
21
+ * A computer's Human Queue as named here: each item by `idHere` of its project's id there, and one
22
+ * about a run marked with the computer it runs on. An item of a project not listed here is dropped.
23
+ */
24
+ export declare function namedHere(said: ProjectionRead<Intervention>, idHere: (theirs: string) => string | undefined, computer: NonNullable<Intervention['computer']>): ProjectionRead<Intervention>;
25
+ /**
26
+ * This computer's Human Queue with what the other computers said: each item named as its project is
27
+ * here (`names`, by id: one not listed is dropped), once, newest first. Of a PR both list, the one
28
+ * a run opened is kept: its row opens the run. A project is read whole when every computer that has
29
+ * it answered.
30
+ */
31
+ export declare function withMachinesQueue(own: ProjectionRead<Intervention>, machines: MachinesQueue, names: ReadonlyMap<string, string>): ProjectionRead<Intervention>;
32
+ /** How long a computer's Human Queue is taken before it is asked again: a page asks every few seconds. */
33
+ export declare const QUEUE_KEPT_MS = 10000;
34
+ /** How long a Human Queue waits for a computer never answered before: what it says after comes at the next read. */
35
+ export declare const QUEUE_FIRST_WAIT_MS = 3000;
36
+ /**
37
+ * Each machine asked at most every {@link QUEUE_KEPT_MS}, and what it said last kept: a read is
38
+ * answered at once with that while the machine is asked again behind it. One never answered yet is
39
+ * waited for a little; one whose last ask failed has nothing kept, so its items are not taken as
40
+ * still there.
41
+ */
42
+ export declare class AnswersKept<M extends {
43
+ id: string;
44
+ }, T> {
45
+ private readonly ask;
46
+ private readonly now;
47
+ private readonly kept;
48
+ constructor(ask: (machine: M) => Promise<T>, now?: () => number);
49
+ /** What each machine said last, by its id: one that never answered, or whose last ask failed, has none. */
50
+ of(machines: readonly M[]): Promise<Map<string, T>>;
51
+ }
52
+ //# sourceMappingURL=machine-interventions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-interventions.d.ts","sourceRoot":"","sources":["../../src/dashboard/machine-interventions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAEnD;;;;;;;;GAQG;AAEH,iJAAiJ;AACjJ,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,EAAE,CAAA;IACpC,6GAA6G;IAC7G,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAOD,2IAA2I;AAC3I,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CA6B3E;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAO3L;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,cAAc,CAAC,YAAY,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC,YAAY,CAAC,CAY9J;AAED,0GAA0G;AAC1G,eAAO,MAAM,aAAa,QAAS,CAAA;AACnC,oHAAoH;AACpH,eAAO,MAAM,mBAAmB,OAAQ,CAAA;AAExC;;;;;GAKG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC;IAIhD,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG;IAJtB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAkF;IAEvG,YACmB,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAC/B,GAAG,GAAE,MAAM,MAAiB,EAC3C;IAEJ,2GAA2G;IACrG,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAuBxD;CACF"}
@@ -0,0 +1,117 @@
1
+ import { interventionKey } from './keys.js';
2
+ /** The longest list a computer is taken at its word for, and the longest strings in it. */
3
+ const MAX_ITEMS = 500;
4
+ const MAX_WORD = 2_048;
5
+ const KINDS = new Set(['pr', 'awaiting', 'uncommitted', 'unpushed']);
6
+ /** What a computer answered as its Human Queue, the items that read as items, each in the fields an item has: anything else is dropped. */
7
+ export function interventionsOf(said) {
8
+ if (!said || typeof said !== 'object')
9
+ return { items: [], whole: [] };
10
+ const { items, whole } = said;
11
+ const word = (value) => typeof value === 'string' && value.length > 0 && value.length <= MAX_WORD;
12
+ const count = (value) => typeof value === 'number' && Number.isInteger(value) && value >= 0;
13
+ const read = [];
14
+ for (const raw of Array.isArray(items) ? items.slice(0, MAX_ITEMS) : []) {
15
+ if (!raw || typeof raw !== 'object')
16
+ continue;
17
+ const item = raw;
18
+ if (!word(item.projectId) || !word(item.projectName) || !word(item.kind) || !KINDS.has(item.kind) || !word(item.title))
19
+ continue;
20
+ read.push({
21
+ projectId: item.projectId,
22
+ projectName: item.projectName,
23
+ kind: item.kind,
24
+ title: item.title,
25
+ ...(word(item.question) ? { question: item.question } : {}),
26
+ // Only a page on the web: the row opens it.
27
+ ...(word(item.url) && /^https?:\/\//.test(item.url) ? { url: item.url } : {}),
28
+ ...(count(item.number) ? { number: item.number } : {}),
29
+ ...(word(item.awaitId) ? { awaitId: item.awaitId } : {}),
30
+ ...(word(item.agentId) ? { agentId: item.agentId } : {}),
31
+ ...(word(item.branch) ? { branch: item.branch } : {}),
32
+ ...(count(item.commits) ? { commits: item.commits } : {}),
33
+ ...(typeof item.gitHost === 'boolean' ? { gitHost: item.gitHost } : {}),
34
+ ...(count(item.files) ? { files: item.files } : {}),
35
+ ...(word(item.createdAt) && !Number.isNaN(Date.parse(item.createdAt)) ? { createdAt: item.createdAt } : {}),
36
+ });
37
+ }
38
+ return { items: read, whole: Array.isArray(whole) ? whole.filter(word) : [] };
39
+ }
40
+ /**
41
+ * A computer's Human Queue as named here: each item by `idHere` of its project's id there, and one
42
+ * about a run marked with the computer it runs on. An item of a project not listed here is dropped.
43
+ */
44
+ export function namedHere(said, idHere, computer) {
45
+ const items = said.items.flatMap(item => {
46
+ const projectId = idHere(item.projectId);
47
+ return projectId === undefined ? [] : [{ ...item, projectId, ...(item.agentId !== undefined ? { computer } : {}) }];
48
+ });
49
+ const whole = said.whole.flatMap(id => idHere(id) ?? []);
50
+ return { items, whole };
51
+ }
52
+ /**
53
+ * This computer's Human Queue with what the other computers said: each item named as its project is
54
+ * here (`names`, by id: one not listed is dropped), once, newest first. Of a PR both list, the one
55
+ * a run opened is kept: its row opens the run. A project is read whole when every computer that has
56
+ * it answered.
57
+ */
58
+ export function withMachinesQueue(own, machines, names) {
59
+ const theirs = machines.said.flatMap(said => said.items.flatMap(item => (names.has(item.projectId) ? [{ ...item, projectName: names.get(item.projectId) }] : [])));
60
+ const kept = new Map();
61
+ for (const item of [...own.items, ...theirs]) {
62
+ const key = interventionKey(item);
63
+ const was = kept.get(key);
64
+ if (!was || (was.agentId === undefined && item.agentId !== undefined))
65
+ kept.set(key, item);
66
+ }
67
+ const items = [...kept.values()].sort((a, b) => (b.createdAt ?? '').localeCompare(a.createdAt ?? ''));
68
+ const unread = new Set(machines.unread);
69
+ const whole = [...new Set([...own.whole, ...machines.said.flatMap(said => said.whole)])].filter(id => !unread.has(id) && names.has(id));
70
+ return { items, whole };
71
+ }
72
+ /** How long a computer's Human Queue is taken before it is asked again: a page asks every few seconds. */
73
+ export const QUEUE_KEPT_MS = 10_000;
74
+ /** How long a Human Queue waits for a computer never answered before: what it says after comes at the next read. */
75
+ export const QUEUE_FIRST_WAIT_MS = 3_000;
76
+ /**
77
+ * Each machine asked at most every {@link QUEUE_KEPT_MS}, and what it said last kept: a read is
78
+ * answered at once with that while the machine is asked again behind it. One never answered yet is
79
+ * waited for a little; one whose last ask failed has nothing kept, so its items are not taken as
80
+ * still there.
81
+ */
82
+ export class AnswersKept {
83
+ ask;
84
+ now;
85
+ kept = new Map();
86
+ constructor(ask, now = Date.now) {
87
+ this.ask = ask;
88
+ this.now = now;
89
+ }
90
+ /** What each machine said last, by its id: one that never answered, or whose last ask failed, has none. */
91
+ async of(machines) {
92
+ const waits = [];
93
+ for (const machine of machines) {
94
+ const entry = this.kept.get(machine.id);
95
+ if (entry?.asking || (entry && this.now() - entry.at < QUEUE_KEPT_MS)) {
96
+ if (entry.asking && !('said' in entry))
97
+ waits.push(entry.asking);
98
+ continue;
99
+ }
100
+ const one = { at: this.now(), ...(entry && 'said' in entry ? { said: entry.said } : {}) };
101
+ one.asking = this.ask(machine).then(said => void (one.said = said), () => void delete one.said).finally(() => (one.asking = undefined));
102
+ this.kept.set(machine.id, one);
103
+ if (!('said' in one))
104
+ waits.push(one.asking);
105
+ }
106
+ if (waits.length > 0)
107
+ await Promise.race([Promise.all(waits), new Promise(done => setTimeout(done, QUEUE_FIRST_WAIT_MS).unref())]);
108
+ const said = new Map();
109
+ for (const machine of machines) {
110
+ const entry = this.kept.get(machine.id);
111
+ if (entry && 'said' in entry)
112
+ said.set(machine.id, entry.said);
113
+ }
114
+ return said;
115
+ }
116
+ }
117
+ //# sourceMappingURL=machine-interventions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"machine-interventions.js","sourceRoot":"","sources":["../../src/dashboard/machine-interventions.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,14 @@ import { type ProjectModule } from '../project-modules.js';
5
5
  export declare const MODULES_PREFIX = "/_modules";
6
6
  /** Where the files of the computer's modules are served, which are no project's: `/_computer-modules/<package>/<file>`. */
7
7
  export declare const COMPUTER_MODULES_PREFIX = "/_computer-modules";
8
+ /** Where the files of the modules OpenAgent brings to projects are served from its own copy: `/_brought-modules/<package>/<file>`. */
9
+ export declare const BROUGHT_MODULES_PREFIX = "/_brought-modules";
8
10
  /** The URL a module's browser part is served at from one project. */
9
11
  export declare function moduleUrl(projectId: string, module: Pick<ProjectModule, 'package' | 'entry'>): string;
10
12
  /** The URL the browser part of one of the computer's modules is served at. */
11
13
  export declare function computerModuleUrl(module: Pick<ProjectModule, 'package' | 'entry'>): string;
14
+ /** The URL the browser part of a module OpenAgent brings to projects is served at from its own copy. */
15
+ export declare function broughtModuleUrl(module: Pick<ProjectModule, 'package' | 'entry'>): string;
12
16
  /**
13
17
  * A module's URL with its entry file's version (`?v=`): a browser keeps that file for good, and
14
18
  * the next version of the module is another URL. Without the file there to read, the URL as it is.
@@ -27,4 +31,6 @@ export declare function versionedModuleUrl(url: string, module: Pick<ProjectModu
27
31
  export declare function serveModuleFile(req: IncomingMessage, res: ServerResponse, pathname: string, projects?: ProjectsProvider): Promise<void>;
28
32
  /** Serve one file of a module that is the computer's: as {@link serveModuleFile}, with no project to be registered. */
29
33
  export declare function serveComputerModuleFile(req: IncomingMessage, res: ServerResponse, pathname: string): Promise<void>;
34
+ /** Serve one file of a module OpenAgent brings to projects, from its own copy: as {@link serveComputerModuleFile}. */
35
+ export declare function serveBroughtModuleFile(req: IncomingMessage, res: ServerResponse, pathname: string): Promise<void>;
30
36
  //# sourceMappingURL=module-serve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module-serve.d.ts","sourceRoot":"","sources":["../../src/dashboard/module-serve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIhE,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAqD,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE7G,sGAAsG;AACtG,eAAO,MAAM,cAAc,cAAc,CAAA;AAEzC,2HAA2H;AAC3H,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAI3D,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAErG;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAE1F;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnH;AAUD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,gBAA4C,GACrD,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,uHAAuH;AACvH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExH"}
1
+ {"version":3,"file":"module-serve.d.ts","sourceRoot":"","sources":["../../src/dashboard/module-serve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAIhE,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAwE,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEhI,sGAAsG;AACtG,eAAO,MAAM,cAAc,cAAc,CAAA;AAEzC,2HAA2H;AAC3H,eAAO,MAAM,uBAAuB,uBAAuB,CAAA;AAE3D,sIAAsI;AACtI,eAAO,MAAM,sBAAsB,sBAAsB,CAAA;AAIzD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAErG;AAED,8EAA8E;AAC9E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAE1F;AAED,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,OAAO,CAAC,GAAG,MAAM,CAEzF;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnH;AAUD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,gBAA4C,GACrD,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,uHAAuH;AACvH,wBAAsB,uBAAuB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAExH;AAED,sHAAsH;AACtH,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvH"}
@@ -3,11 +3,13 @@ import { join } from 'node:path';
3
3
  import { fileTag, fileVersion, sendBody } from './compress.js';
4
4
  import { contentTypeFor } from './content-type.js';
5
5
  import { defaultProjectsProvider } from './projects.js';
6
- import { findComputerModule, findProjectModule, moduleFile } from '../project-modules.js';
6
+ import { findBroughtModule, findComputerModule, findProjectModule, moduleFile } from '../project-modules.js';
7
7
  /** Where module files are served: `/_modules/<project id>/<package>/<file>`, each segment encoded. */
8
8
  export const MODULES_PREFIX = '/_modules';
9
9
  /** Where the files of the computer's modules are served, which are no project's: `/_computer-modules/<package>/<file>`. */
10
10
  export const COMPUTER_MODULES_PREFIX = '/_computer-modules';
11
+ /** Where the files of the modules OpenAgent brings to projects are served from its own copy: `/_brought-modules/<package>/<file>`. */
12
+ export const BROUGHT_MODULES_PREFIX = '/_brought-modules';
11
13
  const encoded = (path) => path.split('/').map(encodeURIComponent).join('/');
12
14
  /** The URL a module's browser part is served at from one project. */
13
15
  export function moduleUrl(projectId, module) {
@@ -17,6 +19,10 @@ export function moduleUrl(projectId, module) {
17
19
  export function computerModuleUrl(module) {
18
20
  return `${COMPUTER_MODULES_PREFIX}/${encodeURIComponent(module.package)}/${encoded(module.entry)}`;
19
21
  }
22
+ /** The URL the browser part of a module OpenAgent brings to projects is served at from its own copy. */
23
+ export function broughtModuleUrl(module) {
24
+ return `${BROUGHT_MODULES_PREFIX}/${encodeURIComponent(module.package)}/${encoded(module.entry)}`;
25
+ }
20
26
  /**
21
27
  * A module's URL with its entry file's version (`?v=`): a browser keeps that file for good, and
22
28
  * the next version of the module is another URL. Without the file there to read, the URL as it is.
@@ -55,6 +61,10 @@ export async function serveModuleFile(req, res, pathname, projects = defaultProj
55
61
  export async function serveComputerModuleFile(req, res, pathname) {
56
62
  return serveFileOf(req, res, pathname.slice(COMPUTER_MODULES_PREFIX.length + 1).split('/'), findComputerModule);
57
63
  }
64
+ /** Serve one file of a module OpenAgent brings to projects, from its own copy: as {@link serveComputerModuleFile}. */
65
+ export async function serveBroughtModuleFile(req, res, pathname) {
66
+ return serveFileOf(req, res, pathname.slice(BROUGHT_MODULES_PREFIX.length + 1).split('/'), findBroughtModule);
67
+ }
58
68
  /** Answer the file `<package>/<file>` names, of the module `find` knows the package as. */
59
69
  async function serveFileOf(req, res, [packageSegment, ...rest], find) {
60
70
  const notFound = () => void res.writeHead(404, { 'content-type': 'text/plain' }).end('no such module file');
@@ -1 +1 @@
1
- {"version":3,"file":"module-serve.js","sourceRoot":"","sources":["../../src/dashboard/module-serve.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module-serve.js","sourceRoot":"","sources":["../../src/dashboard/module-serve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,EAAE,uBAAuB,EAAyB,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,UAAU,EAAsB,MAAM,uBAAuB,CAAA;AAEhI,sGAAsG;AACtG,MAAM,CAAC,MAAM,cAAc,GAAG,WAAW,CAAA;AAEzC,2HAA2H;AAC3H,MAAM,CAAC,MAAM,uBAAuB,GAAG,oBAAoB,CAAA;AAE3D,sIAAsI;AACtI,MAAM,CAAC,MAAM,sBAAsB,GAAG,mBAAmB,CAAA;AAEzD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AAE3F,qEAAqE;AACrE,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,MAAgD;IAC3F,OAAO,GAAG,cAAc,IAAI,kBAAkB,CAAC,SAAS,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AAC5H,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,iBAAiB,CAAC,MAAgD;IAChF,OAAO,GAAG,uBAAuB,IAAI,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACpG,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,gBAAgB,CAAC,MAAgD;IAC/E,OAAO,GAAG,sBAAsB,IAAI,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;AACnG,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAW,EAAE,MAA4C;IAChG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC/E,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AACvD,CAAC;AAED,SAAS,MAAM,CAAC,OAAe;IAC7B,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAA;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAoB,EACpB,GAAmB,EACnB,QAAgB,EAChB,QAAQ,GAAqB,uBAAuB,EAAE;IAEtD,MAAM,CAAC,cAAc,EAAE,GAAG,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACtF,MAAM,SAAS,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACnF,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAC,GAAG,EAAC,EAAE;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC1E,OAAO,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxD,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,uHAAuH;AACvH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAoB,EAAE,GAAmB,EAAE,QAAgB;IACvG,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,uBAAuB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,kBAAkB,CAAC,CAAA;AACjH,CAAC;AAED,sHAAsH;AACtH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,GAAoB,EAAE,GAAmB,EAAE,QAAgB;IACtG,OAAO,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,sBAAsB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,iBAAiB,CAAC,CAAA;AAC/G,CAAC;AAED,2FAA2F;AAC3F,KAAK,UAAU,WAAW,CAAC,GAAoB,EAAE,GAAmB,EAAE,CAAC,cAAc,EAAE,GAAG,IAAI,CAAW,EAAE,IAAyD;IAClK,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAC3G,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,GAAG,EAAE,CAAA;IAC/G,MAAM,GAAG,GAAG,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC;QAAE,OAAO,QAAQ,EAAE,CAAA;IACvF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IACrD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACzE,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACxE,MAAM,IAAI,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACpF,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,QAAQ,EAAE,CAAA;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,UAAU,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACvE,MAAM,YAAY,GAAG,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,UAAU,CAAA;IACtG,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,cAAc,CAAC,IAAI,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAA;IAC7G,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM;QAAE,OAAO,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,GAAG,EAAE,CAAA;IACxE,MAAM,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAA;AACxF,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { type LiveAgent, type AgentMeta, type AgentStatus } from '../store/index.js';
2
2
  import type { ProjectSummary } from './projects.js';
3
3
  import { type ProjectQueue } from './queue.js';
4
+ import type { MachineKind } from '../reached-by-line.js';
4
5
  /** One project's in-flight run, surfaced in the Overview's "working now" list. */
5
6
  export interface ActiveAgent {
6
7
  projectId: string;
@@ -21,8 +22,14 @@ export interface ActiveAgent {
21
22
  * cloud side is the agent, and "no agents working" over a waiting cloud session was a lie.
22
23
  */
23
24
  cloud?: 'in-cloud' | 'waiting';
24
- /** The machine whose daemon started it (#1648), only when that is not this one. */
25
- host?: string;
25
+ /**
26
+ * The computer it runs on, only when that is not this one: the saved machine's name and kind for
27
+ * a run of one of the person's other computers, else the computer its record names (#1648).
28
+ */
29
+ computer?: {
30
+ name: string;
31
+ kind?: MachineKind;
32
+ };
26
33
  }
27
34
  /** One recently active project, most-recent first. */
28
35
  export interface RecentProject {
@@ -47,7 +54,8 @@ export interface RecentAgent {
47
54
  }
48
55
  /** Injectable reader so {@link buildRecentAgents} is unit-testable off disk. */
49
56
  export interface RecentAgentsDeps {
50
- agents?: (cwd: string) => Promise<AgentMeta[]>;
57
+ /** A project's runs: off its folder for one of this computer's, as its computer says them for another's. */
58
+ agents?: (project: ProjectSummary) => Promise<AgentMeta[]>;
51
59
  }
52
60
  /**
53
61
  * Every project's sessions pooled and sorted newest-first (capped), so the shared sidebar (#shared-
@@ -65,13 +73,20 @@ export interface OverviewDeps {
65
73
  /** Whether the bridge holds a question for that cloud session (default: the daemon's bridge store). */
66
74
  waiting?: (sessionId: string) => boolean;
67
75
  now?: () => number;
76
+ /**
77
+ * The runs the person's other computers say they run of a project, each marked with the saved
78
+ * machine it is (`remoteLabel`): of a project this computer has too, and of one only they have.
79
+ */
80
+ machineRuns?: (project: ProjectSummary) => Promise<AgentMeta[]>;
68
81
  /** This machine's hostname; `node:os` in production. */
69
82
  host?: string;
70
83
  }
71
84
  /**
72
85
  * Build the cross-project Overview: the running agents (every live agent of each project, one per
73
- * worktree since #736), the total of open queue entries (from {@link collectQueue}), and the most
74
- * recently active projects (by {@link ProjectSummary.lastActivityAt}). Forgiving — a project
86
+ * worktree since #736, and every run the person's other computers say is running), the total of
87
+ * open queue entries (from {@link collectQueue}), and the most recently active projects (by
88
+ * {@link ProjectSummary.lastActivityAt}). A project of another computer's ({@link ProjectSummary.machine})
89
+ * has no folder here: only what its computer says of its runs is read. Forgiving — a project
75
90
  * with no live run, or none running, simply contributes nothing to `active`.
76
91
  */
77
92
  export declare function buildOverview(projects: ProjectSummary[], deps?: OverviewDeps): Promise<Overview>;
@@ -1 +1 @@
1
- {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAW5D,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,WAAW,CAAA;IACnB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC9B,mFAAmF;IACnF,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAQD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;CAC/C;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYvH;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC/D,yGAAyG;IACzG,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC9C,uGAAuG;IACvG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoD1G"}
1
+ {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAClH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAI5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAQxD,kFAAkF;AAClF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,WAAW,CAAA;IACnB,gEAAgE;IAChE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAA;IAC9B;;;OAGG;IACH,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,WAAW,CAAA;KAAE,CAAA;CAChD;AAED,sDAAsD;AACtD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB;AAED,0CAA0C;AAC1C,MAAM,WAAW,QAAQ;IACvB,kEAAkE;IAClE,MAAM,EAAE,WAAW,EAAE,CAAA;IACrB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAA;IACjB,kDAAkD;IAClD,MAAM,EAAE,aAAa,EAAE,CAAA;CACxB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,SAAS,CAAA;CACjB;AAQD,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,4GAA4G;IAC5G,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;CAC3D;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAYvH;AAED,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IAC/D,yGAAyG;IACzG,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC9C,uGAAuG;IACvG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAA;IACxC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;IAClB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IAC/D,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAoE1G"}
@@ -14,11 +14,11 @@ const RECENT_RUNS_LIMIT = 30;
14
14
  * whose agents cannot be read simply contributes nothing.
15
15
  */
16
16
  export async function buildRecentAgents(projects, deps = {}) {
17
- const readAgents = deps.agents ?? readAllAgents;
17
+ const readAgents = deps.agents ?? (project => readAllAgents(project.path));
18
18
  // Every project at once: each one's read is a git read of its branches too (the rows' marks), and
19
19
  // one after the other the list waited for all of them in turn. Kept in the projects' order, so
20
20
  // the first project to list a run still keeps it below.
21
- const read = await Promise.all(projects.map(project => readAgents(project.path).catch(() => [])));
21
+ const read = await Promise.all(projects.map(project => readAgents(project).catch(() => [])));
22
22
  const all = projects.flatMap((project, at) => (read[at] ?? []).map(agent => ({ projectId: project.id, projectName: project.name, agent })));
23
23
  all.sort((a, b) => (b.agent.startedAt ?? '').localeCompare(a.agent.startedAt ?? ''));
24
24
  // One row per run (#1648): two checkouts of one repository share their archive, so every run
@@ -28,8 +28,10 @@ export async function buildRecentAgents(projects, deps = {}) {
28
28
  }
29
29
  /**
30
30
  * Build the cross-project Overview: the running agents (every live agent of each project, one per
31
- * worktree since #736), the total of open queue entries (from {@link collectQueue}), and the most
32
- * recently active projects (by {@link ProjectSummary.lastActivityAt}). Forgiving — a project
31
+ * worktree since #736, and every run the person's other computers say is running), the total of
32
+ * open queue entries (from {@link collectQueue}), and the most recently active projects (by
33
+ * {@link ProjectSummary.lastActivityAt}). A project of another computer's ({@link ProjectSummary.machine})
34
+ * has no folder here: only what its computer says of its runs is read. Forgiving — a project
33
35
  * with no live run, or none running, simply contributes nothing to `active`.
34
36
  */
35
37
  export async function buildOverview(projects, deps = {}) {
@@ -37,6 +39,7 @@ export async function buildOverview(projects, deps = {}) {
37
39
  const queue = deps.queue ?? (p => collectQueue(p));
38
40
  const agents = deps.agents ?? readAllAgents;
39
41
  const waiting = deps.waiting ?? (sessionId => bridgeQuestions().waiting(sessionId));
42
+ const machineRuns = deps.machineRuns ?? (async () => []);
40
43
  const now = (deps.now ?? Date.now)();
41
44
  const thisHost = deps.host ?? hostname();
42
45
  const active = [];
@@ -51,10 +54,18 @@ export async function buildOverview(projects, deps = {}) {
51
54
  status: meta.status,
52
55
  ...(meta.intent ? { intent: meta.intent } : {}),
53
56
  ...(meta.updatedAt ? { updatedAt: meta.updatedAt } : {}),
54
- // Another machine's daemon started it (#1648): the shared data branch shows its runs here too.
55
- ...(meta.host !== undefined && meta.host !== thisHost ? { host: meta.host } : {}),
57
+ // A saved machine's run by the machine's name; another computer's daemon started it otherwise
58
+ // (#1648): the shared data branch shows its runs here too.
59
+ ...(meta.remoteLabel !== undefined
60
+ ? { computer: { name: meta.remoteLabel, ...(meta.remoteKind !== undefined ? { kind: meta.remoteKind } : {}) } }
61
+ : meta.host !== undefined && meta.host !== thisHost
62
+ ? { computer: { name: meta.host } }
63
+ : {}),
56
64
  });
57
- for (const project of projects) {
65
+ const own = projects.filter(project => project.machine === undefined);
66
+ // What the person's other computers run, once each: a run listed here as this computer's is not listed again.
67
+ const theirs = await Promise.all(projects.map(project => machineRuns(project).catch(() => [])));
68
+ for (const project of own) {
58
69
  // Every live agent of the project (#738), not just the one that used to sit at its path.
59
70
  for (const meta of await liveAgents(project.path).catch(() => [])) {
60
71
  if (meta.status !== 'running')
@@ -73,8 +84,17 @@ export async function buildOverview(projects, deps = {}) {
73
84
  active.push({ ...entry(project, meta, project.path), cloud: state });
74
85
  }
75
86
  }
87
+ const listed = new Set(active.map(agent => agent.agentId));
88
+ projects.forEach((project, at) => {
89
+ for (const meta of theirs[at] ?? []) {
90
+ if (meta.status !== 'running' || listed.has(meta.id))
91
+ continue;
92
+ listed.add(meta.id);
93
+ active.push(entry(project, meta, project.path));
94
+ }
95
+ });
76
96
  active.sort((a, b) => (b.updatedAt ?? '').localeCompare(a.updatedAt ?? ''));
77
- const queues = await queue(projects);
97
+ const queues = await queue(own);
78
98
  const queueOpen = queues.reduce((sum, q) => sum + q.entries.length, 0);
79
99
  const recent = projects
80
100
  .filter(p => p.lastActivityAt)
@@ -1 +1 @@
1
- {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"overview.js","sourceRoot":"","sources":["../../src/dashboard/overview.ts"],"names":[],"mappings":"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"}
@@ -12,8 +12,15 @@ import { type GitHostFor } from '../store/git-host.js';
12
12
  export interface ProjectSummary {
13
13
  /** Registry id (stable, URL-safe). */
14
14
  id: string;
15
- /** Absolute repo path. */
15
+ /** Absolute repo path: on the computer the project is on. */
16
16
  path: string;
17
+ /**
18
+ * The saved machine the project is on, when it is not on this computer (elsewhere.ts): what the
19
+ * page asks of it is asked there, and a run of it starts there unless another computer is picked.
20
+ */
21
+ machine?: string;
22
+ /** The packages that bring a module's pages to a project of another computer's, as that computer said them. */
23
+ modules?: string[];
17
24
  /** Display name (the path's basename). */
18
25
  name: string;
19
26
  /** True when the repo still has its `.openagent/` marker. */
@@ -56,10 +63,12 @@ export interface SummarizeDeps {
56
63
  readAgents?: (path: string) => Promise<AgentMeta[]>;
57
64
  /** The project's git host. Defaults to {@link projectGitHost}. */
58
65
  gitHost?: GitHostFor;
66
+ /** The project's name. Defaults to {@link projectNameOf}: its repository's. */
67
+ name?: (path: string) => Promise<string>;
59
68
  }
60
69
  /** A project's runs, live prepended to the archived history. Forgiving: a failed read is `[]`. */
61
70
  /**
62
- * Derive a {@link ProjectSummary} from a registry record: its display name, whether
71
+ * Derive a {@link ProjectSummary} from a registry record: its name (its repository's), whether
63
72
  * it is still activated, and its last activity. Forgiving: a failed read reads as an
64
73
  * inactive project with no activity, never a throw.
65
74
  *
@@ -1 +1 @@
1
- {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/dashboard/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGjE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAEtE;;;;;GAKG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAA;IAClB,kHAAkH;IAClH,OAAO,EAAE,OAAO,CAAA;IAChB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,qFAAqF;IACrF,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,iGAAiG;IACjG,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,6FAA6F;IAC7F,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACnD,kEAAkE;IAClE,OAAO,CAAC,EAAE,UAAU,CAAA;CACrB;AAED,kGAAkG;AAClG;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB/G;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IACjC,wEAAwE;IACxE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CACrD;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IAC5C,8EAA8E;IAC9E,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,4CAA4C;IAC5C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CAC/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,YAAiB,GAAG,gBAAgB,CAiBjF"}
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/dashboard/projects.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAGjE,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpE,OAAO,EAAkB,KAAK,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAGtE;;;;;GAKG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,cAAc;IAC7B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAA;IACV,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+GAA+G;IAC/G,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAA;IACZ,6DAA6D;IAC7D,SAAS,EAAE,OAAO,CAAA;IAClB,kHAAkH;IAClH,OAAO,EAAE,OAAO,CAAA;IAChB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAE,UAAU,CAAA;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,qFAAqF;IACrF,KAAK,EAAE,CAAC,EAAE,CAAA;IACV,iGAAiG;IACjG,KAAK,EAAE,MAAM,EAAE,CAAA;CAChB;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,6FAA6F;IAC7F,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAA;IACnD,kEAAkE;IAClE,OAAO,CAAC,EAAE,UAAU,CAAA;IACpB,+EAA+E;IAC/E,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACzC;AAED,kGAAkG;AAClG;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAiB/G;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mEAAmE;IACnE,IAAI,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC,CAAA;IACjC,wEAAwE;IACxE,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;CACrD;AAED,sGAAsG;AACtG,MAAM,WAAW,YAAY;IAC3B,2EAA2E;IAC3E,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAA;IAC5C,8EAA8E;IAC9E,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAChD,4CAA4C;IAC5C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,OAAO,CAAC,cAAc,CAAC,CAAA;CAC/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,GAAE,YAAiB,GAAG,gBAAgB,CAiBjF"}
@@ -4,9 +4,10 @@ import { nodeFs } from '../node-fs.js';
4
4
  import { isActivated } from '../project.js';
5
5
  import { readAllAgents } from '../store/index.js';
6
6
  import { projectGitHost } from '../store/git-host.js';
7
+ import { projectNameOf } from '../repository-address.js';
7
8
  /** A project's runs, live prepended to the archived history. Forgiving: a failed read is `[]`. */
8
9
  /**
9
- * Derive a {@link ProjectSummary} from a registry record: its display name, whether
10
+ * Derive a {@link ProjectSummary} from a registry record: its name (its repository's), whether
10
11
  * it is still activated, and its last activity. Forgiving: a failed read reads as an
11
12
  * inactive project with no activity, never a throw.
12
13
  *
@@ -25,7 +26,7 @@ export async function summarizeProject(record, deps = {}) {
25
26
  const summary = {
26
27
  id: record.id,
27
28
  path: record.path,
28
- name: basename(record.path),
29
+ name: await (deps.name ?? projectNameOf)(record.path).catch(() => basename(record.path)),
29
30
  activated,
30
31
  gitHost: (await (deps.gitHost ?? projectGitHost)(record.path).catch(() => undefined)) !== undefined,
31
32
  };
@@ -1 +1 @@
1
- {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/dashboard/projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAkB,MAAM,mBAAmB,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAmB,MAAM,sBAAsB,CAAA;AA6DtE,kGAAkG;AAClG;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,MAAqB,EAAE,IAAI,GAAkB,EAAE;IACpF,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAA;IACtD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,aAAa,CAAA;IACnD,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAA;IACtE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAiB,CAAC,CAAA;IAC3E,uCAAuC;IACvC,MAAM,aAAa,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACjF,MAAM,cAAc,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;IAClF,MAAM,OAAO,GAAmB;QAC9B,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC;QAC3B,SAAS;QACT,OAAO,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,cAAc,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,KAAK,SAAS;KACpG,CAAA;IACD,IAAI,cAAc;QAAE,OAAO,CAAC,cAAc,GAAG,cAAc,CAAA;IAC3D,OAAO,OAAO,CAAA;AAChB,CAAC;AAwBD;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAI,GAAiB,EAAE;IAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,MAAM,EAAE,CAAC,WAAW,CAAA;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAA;IACxE,MAAM,OAAO,GAAG,KAAK,IAA8B,EAAE;QACnD,MAAM,OAAO,GAAG,MAAM,WAAW,EAAE,CAAA;QACnC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAC,MAAM,EAAC,EAAE,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACvI,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAA2B,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAA;IAC/E,CAAC,CAAA;IACD,OAAO;QACL,KAAK,CAAC,IAAI;YACR,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAA;QACtD,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,EAAE;YAClB,OAAO,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAA;QACjE,CAAC;KACF,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/dashboard/projects.ts"],"names":[],"mappings":"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"}
@@ -57,6 +57,8 @@ export interface RelayHandlers {
57
57
  /** Run one whitelisted read/steer/handoff RPC against THIS machine's own checkout, for the daemon
58
58
  * relaying an agent here (#1067 slice 2); the caller wraps the result as {result}. */
59
59
  rpc?: (projectId: string, fn: string, args: unknown[]) => Promise<unknown>;
60
+ /** Whether one relayed call only reads here, which a call that may only watch is answered for: by its name, when unsaid. */
61
+ reads?: (projectId: string, fn: string, args: readonly unknown[]) => Promise<boolean>;
60
62
  /** Run one whitelisted machine-wide RPC here, for the person's own computer; the caller wraps the result as {result}. */
61
63
  machine?: (fn: string, args: unknown[]) => Promise<unknown>;
62
64
  /** Where the live screen of a run here answers; nothing when the run has none. */
@@ -1 +1 @@
1
- {"version":3,"file":"relay-endpoints.d.ts","sourceRoot":"","sources":["../../src/dashboard/relay-endpoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,YAAY,EAAyB,MAAM,iBAAiB,CAAA;AAEvH,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAOrG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAA;AAE/C,yJAAyJ;AACzJ,eAAO,MAAM,UAAU,4HAA0H,CAAA;AAEjJ,kGAAkG;AAClG,MAAM,WAAW,aAAa;IAC5B,kGAAkG;IAClG,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACzD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACtH,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IACxG;2FACuF;IACvF,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1E,yHAAyH;IACzH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5E,uHAAuH;IACvH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IACxE,oHAAoH;IACpH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;QAClC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC1G,CAAA;CACF;AAgBD,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
1
+ {"version":3,"file":"relay-endpoints.d.ts","sourceRoot":"","sources":["../../src/dashboard/relay-endpoints.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;AAEhE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,YAAY,EAAyB,MAAM,iBAAiB,CAAA;AAEvH,OAAO,EAA6B,KAAK,WAAW,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAOrG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,YAAY,YAAY,CAAA;AAErC;;;;;;;;GAQG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAA;AAE/C,yJAAyJ;AACzJ,eAAO,MAAM,UAAU,4HAA0H,CAAA;AAEjJ,kGAAkG;AAClG,MAAM,WAAW,aAAa;IAC5B,kGAAkG;IAClG,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IACzD,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,KAAK,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACtH,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,cAAc,KAAK,IAAI,KAAK,MAAM,IAAI,CAAA;IACxG;2FACuF;IACvF,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC1E,4HAA4H;IAC5H,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACrF,yHAAyH;IACzH,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,kFAAkF;IAClF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAA;IAC5E,uHAAuH;IACvH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,YAAY,CAAC,CAAA;IACxE,oHAAoH;IACpH,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAA;QAClC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;YAAE,EAAE,EAAE,IAAI,CAAC;YAAC,MAAM,EAAE,aAAa,CAAA;SAAE,GAAG;YAAE,EAAE,EAAE,KAAK,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAC1G,CAAA;CACF;AAgBD,+FAA+F;AAC/F,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,aAAa,GAAG,SAAS,GAClC,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -246,6 +246,8 @@ async function handleLogins(req, res, handlers) {
246
246
  sendJson(res, given.logins);
247
247
  }
248
248
  const MAX_RPC_BODY = 256 * 1024;
249
+ /** A relayed call that reads by its name alone. */
250
+ const namedRead = async (_projectId, fn) => isRelayRead(fn);
249
251
  /** POST /_relay/rpc: run one whitelisted RPC on this machine and answer {result}. A call that may only `watch` runs a read and no other. */
250
252
  async function handleRpc(req, res, handlers, watch) {
251
253
  if (req.method !== 'POST')
@@ -263,12 +265,12 @@ async function handleRpc(req, res, handlers, watch) {
263
265
  const args = Array.isArray(body.args) ? body.args : [];
264
266
  if (!fn)
265
267
  return end(res, 400, 'missing rpc name');
266
- if (watch && !isRelayRead(fn))
267
- return end(res, 403, WATCH_ONLY);
268
268
  try {
269
269
  const projectId = await projectNamed(handlers, body.project);
270
270
  if (projectId === undefined)
271
271
  return end(res, 404, 'no such project on this machine');
272
+ if (watch && !(await (handlers.reads ?? namedRead)(projectId, fn, args)))
273
+ return end(res, 403, WATCH_ONLY);
272
274
  sendJson(res, { result: await handlers.rpc(projectId, fn, args) });
273
275
  }
274
276
  catch (err) {