@openagt/dashboard 0.34.0 → 0.36.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.
- package/dist/built-in.d.ts.map +1 -1
- package/dist/built-in.js +1 -1
- package/dist/built-in.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +3 -0
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/copy-logins.js +5 -5
- package/dist/dashboard/copy-logins.js.map +1 -1
- package/dist/dashboard/git-hosts.d.ts +38 -0
- package/dist/dashboard/git-hosts.d.ts.map +1 -0
- package/dist/dashboard/git-hosts.js +53 -0
- package/dist/dashboard/git-hosts.js.map +1 -0
- package/dist/dashboard/machine-logins.d.ts +2 -2
- package/dist/dashboard/machine-logins.js +2 -2
- package/dist/dashboard/person.d.ts +10 -8
- package/dist/dashboard/person.d.ts.map +1 -1
- package/dist/dashboard/person.js +28 -13
- package/dist/dashboard/person.js.map +1 -1
- package/dist/dashboard/relay-endpoints.d.ts +4 -3
- package/dist/dashboard/relay-endpoints.d.ts.map +1 -1
- package/dist/dashboard/relay-endpoints.js +13 -5
- package/dist/dashboard/relay-endpoints.js.map +1 -1
- package/dist/dashboard/remote-run.d.ts +18 -4
- package/dist/dashboard/remote-run.d.ts.map +1 -1
- package/dist/dashboard/remote-run.js +47 -12
- package/dist/dashboard/remote-run.js.map +1 -1
- package/dist/dashboard-bundle/assets/main-COZtHuZ-.css +2 -0
- package/dist/dashboard-bundle/assets/main-DDfoDyfa.js +148 -0
- package/dist/dashboard-bundle/assets/module-BXxdqTpP.js +14 -0
- package/dist/dashboard-bundle/host/module.js +1 -1
- package/dist/dashboard-bundle/index.html +3 -3
- package/dist/dashboard-rpc/accounts.d.ts +82 -0
- package/dist/dashboard-rpc/accounts.d.ts.map +1 -0
- package/dist/dashboard-rpc/accounts.js +224 -0
- package/dist/dashboard-rpc/accounts.js.map +1 -0
- package/dist/dashboard-rpc/index.d.ts +3 -1
- package/dist/dashboard-rpc/index.d.ts.map +1 -1
- package/dist/dashboard-rpc/index.js +6 -2
- package/dist/dashboard-rpc/index.js.map +1 -1
- package/dist/dashboard-rpc/logins.d.ts +98 -0
- package/dist/dashboard-rpc/logins.d.ts.map +1 -0
- package/dist/dashboard-rpc/logins.js +203 -0
- package/dist/dashboard-rpc/logins.js.map +1 -0
- package/dist/dashboard-rpc/machines.d.ts +44 -2
- package/dist/dashboard-rpc/machines.d.ts.map +1 -1
- package/dist/dashboard-rpc/machines.js +55 -8
- package/dist/dashboard-rpc/machines.js.map +1 -1
- package/dist/dashboard-rpc/modules.d.ts.map +1 -1
- package/dist/dashboard-rpc/modules.js +4 -1
- package/dist/dashboard-rpc/modules.js.map +1 -1
- package/dist/dashboard-rpc/projects.js +1 -1
- package/dist/dashboard-rpc/projects.js.map +1 -1
- package/dist/local-bin.d.ts +8 -0
- package/dist/local-bin.d.ts.map +1 -0
- package/dist/local-bin.js +16 -0
- package/dist/local-bin.js.map +1 -0
- package/dist/module-types/dashboard/components/Waiting.d.ts +10 -0
- package/dist/module-types/dashboard/lib/route.d.ts +2 -0
- package/dist/module-types/dashboard/lib/settings-crumb.d.ts +15 -0
- package/dist/module-types/dashboard/lib/use-modules.d.ts +8 -0
- package/dist/module-types/dashboard/lib/use-narrow.d.ts +3 -0
- package/dist/module-types/dashboard/module/index.d.ts +50 -10
- package/dist/module-types/src/dashboard/git-hosts.d.ts +37 -0
- package/dist/module-types/src/dashboard/machine-logins.d.ts +2 -2
- package/dist/module-types/src/dashboard/person.d.ts +10 -8
- package/dist/module-types/src/dashboard/remote-run.d.ts +18 -4
- package/dist/module-types/src/dashboard-rpc/accounts.d.ts +81 -0
- package/dist/module-types/src/dashboard-rpc/index.d.ts +3 -1
- package/dist/module-types/src/dashboard-rpc/logins.d.ts +97 -0
- package/dist/module-types/src/dashboard-rpc/machines.d.ts +44 -2
- package/dist/module-types/src/project-hooks.d.ts +5 -0
- package/dist/module-types/src/registry.d.ts +19 -2
- package/dist/project-hooks.d.ts +5 -0
- package/dist/project-hooks.d.ts.map +1 -1
- package/dist/project-hooks.js +4 -1
- package/dist/project-hooks.js.map +1 -1
- package/dist/quota-boundary.d.ts.map +1 -1
- package/dist/quota-boundary.js +7 -3
- package/dist/quota-boundary.js.map +1 -1
- package/dist/registry.d.ts +19 -2
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +42 -4
- package/dist/registry.js.map +1 -1
- package/package.json +24 -25
- package/dist/dashboard-bundle/assets/main-Bmnmb8kW.js +0 -144
- package/dist/dashboard-bundle/assets/main-vGm5VAD9.css +0 -2
- package/dist/dashboard-bundle/assets/module-Bl9E9F3x.js +0 -14
- package/dist/module-types/dashboard/components/AddMachineDialog.d.ts +0 -4
- package/dist/module-types/dashboard/components/InviteDialog.d.ts +0 -53
- package/dist/module-types/dashboard/lib/machines.d.ts +0 -19
- package/dist/module-types/dashboard/lib/remote-target.d.ts +0 -6
- package/dist/module-types/dashboard/rpc/machines.d.ts +0 -17
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { homedir } from 'node:os';
|
|
2
|
+
import { delimiter, join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* The folder the installs a press runs put their programs in, with no admin: Claude Code's own
|
|
5
|
+
* installer and gh's build both go to `~/.local/bin`. A shell started from a terminal often has it
|
|
6
|
+
* on its PATH by the person's own setup; OpenAgent, started from anywhere, puts it there itself,
|
|
7
|
+
* last, so what is installed after it started is found by its checks and its runs alike.
|
|
8
|
+
*/
|
|
9
|
+
export function withLocalBin(env) {
|
|
10
|
+
const dir = join(env['HOME'] ?? homedir(), '.local', 'bin');
|
|
11
|
+
const path = env['PATH'] ?? '';
|
|
12
|
+
if (path.split(delimiter).includes(dir))
|
|
13
|
+
return;
|
|
14
|
+
env['PATH'] = path ? `${path}${delimiter}${dir}` : dir;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=local-bin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-bin.js","sourceRoot":"","sources":["../src/local-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAE3C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,GAAsB;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAA;IAC9B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAM;IAC/C,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAA;AACxD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* What a pane says while it waits on a read ("Reading the file…"), shown only once the read takes
|
|
4
|
+
* a moment: a read that answers at once goes from nothing straight to what it read, with no line
|
|
5
|
+
* flashing between. It keeps its room while unseen, so nothing moves when it shows.
|
|
6
|
+
*/
|
|
7
|
+
export declare function Waiting({ children, className }: {
|
|
8
|
+
children: ReactNode;
|
|
9
|
+
className?: string;
|
|
10
|
+
}): import("react").JSX.Element;
|
|
@@ -21,6 +21,8 @@ export interface Route {
|
|
|
21
21
|
*/
|
|
22
22
|
scope?: string;
|
|
23
23
|
}
|
|
24
|
+
/** The query parameter that carries {@link Route.settings}. */
|
|
25
|
+
export declare const SETTINGS_PARAM = "settings";
|
|
24
26
|
/**
|
|
25
27
|
* Read the route out of a URL's path and query, naming projects by `projects`. A first segment
|
|
26
28
|
* that names no project is a module's page when it can be one, and else a project nobody
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** The page inside an entry, as its header shows it. */
|
|
2
|
+
export interface SettingsCrumb {
|
|
3
|
+
/** What the page is about: "Studio Mac". */
|
|
4
|
+
title: string;
|
|
5
|
+
/** Back to the entry itself. */
|
|
6
|
+
back: () => void;
|
|
7
|
+
}
|
|
8
|
+
/** Set by the Settings dialog around an entry: how its page inside says it is open, and closed. */
|
|
9
|
+
export declare const SettingsCrumbContext: import("react").Context<((crumb: SettingsCrumb | undefined) => void) | null>;
|
|
10
|
+
/**
|
|
11
|
+
* Show a page inside a Settings entry: the header says its title after the entry's, and its back
|
|
12
|
+
* arrow calls `back`. Nothing while `crumb` is undefined. Answers whether a header shows it: outside
|
|
13
|
+
* the Settings dialog none does, and the page draws its own way back.
|
|
14
|
+
*/
|
|
15
|
+
export declare function useSettingsCrumb(crumb: SettingsCrumb | undefined): boolean;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type ComponentType } from 'react';
|
|
1
2
|
import type { LinkAction, ModuleCard, ModulePage, ModulePanel, ModuleRunSlots, ModuleSchedule, ModuleSettings, ModuleUsageLimit } from '../module/index.js';
|
|
2
3
|
/** A module page as the shell mounts it: the page, plus the package it came from and the projects that have it. */
|
|
3
4
|
export interface MountedPage extends ModulePage {
|
|
@@ -35,6 +36,11 @@ export interface MountedUsageLimit extends ModuleUsageLimit {
|
|
|
35
36
|
package: string;
|
|
36
37
|
projects: string[];
|
|
37
38
|
}
|
|
39
|
+
/** What a module of this computer's draws over every page, as the shell mounts it: the part, and the package it came from. */
|
|
40
|
+
export interface MountedEveryPage {
|
|
41
|
+
EveryPage: ComponentType;
|
|
42
|
+
package: string;
|
|
43
|
+
}
|
|
38
44
|
/** The commands a module starts by itself, as the shell mounts them: the read, plus the package it came from and the projects that have it. */
|
|
39
45
|
export interface MountedSchedule extends ModuleSchedule {
|
|
40
46
|
package: string;
|
|
@@ -52,6 +58,8 @@ export interface MountedModules {
|
|
|
52
58
|
runSlots: MountedRunSlots[];
|
|
53
59
|
/** The Settings entries, in the order they are listed: by `order`, then by package name. */
|
|
54
60
|
settings: MountedSettings[];
|
|
61
|
+
/** What the modules of this computer's draw over every page, in package order. */
|
|
62
|
+
everyPage: MountedEveryPage[];
|
|
55
63
|
/** The usage bar's stop line: the first module's that declares one, in package order; absent when none does. */
|
|
56
64
|
usageLimit?: MountedUsageLimit;
|
|
57
65
|
/** What starts by itself: the first module's that declares it, in package order; absent when none does. */
|
|
@@ -2,5 +2,8 @@
|
|
|
2
2
|
* Whether an element is narrower than `width` pixels, followed as it is resized: a pane beside the
|
|
3
3
|
* chat is as wide as the person drags it, not as the window is. Pass the element through a state
|
|
4
4
|
* setter used as its `ref`. Wide where the browser cannot measure.
|
|
5
|
+
*
|
|
6
|
+
* Measured before the page is drawn, so a pane opened narrow never shows for a frame as a wide one
|
|
7
|
+
* would (a file tree beside the file, then gone).
|
|
5
8
|
*/
|
|
6
9
|
export declare function useNarrow(element: HTMLElement | null, width: number): boolean;
|
|
@@ -212,11 +212,12 @@ export interface ModulePanelProps {
|
|
|
212
212
|
activity?: number;
|
|
213
213
|
/**
|
|
214
214
|
* On a pane that lists what a run changed (`changes`): the changed file a click in the chat
|
|
215
|
-
* asked to see, by its path in the run's checkout
|
|
216
|
-
*
|
|
215
|
+
* asked to see, by its path in the run's checkout; no path when the click asked for all of
|
|
216
|
+
* them, from the first. `at` tells one ask from the next for the same file. Absent until a
|
|
217
|
+
* file is asked for.
|
|
217
218
|
*/
|
|
218
219
|
reveal?: {
|
|
219
|
-
path
|
|
220
|
+
path?: string;
|
|
220
221
|
at: number;
|
|
221
222
|
};
|
|
222
223
|
context: ModuleContext;
|
|
@@ -230,10 +231,8 @@ export interface ModulePanelProps {
|
|
|
230
231
|
export interface ModulePanel {
|
|
231
232
|
/** Which pane this is among the module's own, for its key and for remembering that it is open. */
|
|
232
233
|
id: string;
|
|
233
|
-
/** The pane's name: on its card, and what its icon is called. */
|
|
234
|
+
/** The pane's name: on its card, and what its icon is called and its tooltip says. */
|
|
234
235
|
label: string;
|
|
235
|
-
/** The icon's tooltip: one sentence on what the pane shows. */
|
|
236
|
-
help: string;
|
|
237
236
|
/** The pane's icon in the top bar, drawn at the size its `className` gives. */
|
|
238
237
|
icon: ComponentType<{
|
|
239
238
|
className?: string;
|
|
@@ -280,6 +279,12 @@ export interface ModuleDefinition {
|
|
|
280
279
|
run?: ModuleRunSlots;
|
|
281
280
|
/** The entries the module adds to Settings. */
|
|
282
281
|
settings?: ModuleSettings[];
|
|
282
|
+
/**
|
|
283
|
+
* What the module draws over every page, for as long as the dashboard is open: nothing, until
|
|
284
|
+
* something it watches asks for the person, such as another computer asking to connect. Drawn
|
|
285
|
+
* once, with no project, and only for a module of this computer's.
|
|
286
|
+
*/
|
|
287
|
+
everyPage?: ComponentType;
|
|
283
288
|
/** The stop line the module puts on the usage bar. */
|
|
284
289
|
usageLimit?: ModuleUsageLimit;
|
|
285
290
|
/** The commands the module starts by itself, for the other pages to say. */
|
|
@@ -331,8 +336,10 @@ export interface ModuleHost {
|
|
|
331
336
|
* Run one of the module package's own commands in no project, for a package that is this
|
|
332
337
|
* computer's (the door to it, its servers): what such a package keeps is the computer's, so
|
|
333
338
|
* its page reads and changes it with no project added. Refused for any other package.
|
|
339
|
+
* `input` is what the command reads on standard input: a secret, which no other program on
|
|
340
|
+
* this computer sees there, as it would among the arguments.
|
|
334
341
|
*/
|
|
335
|
-
runComputerCommand(args: string[], command?: string): Promise<ModuleCommandResult>;
|
|
342
|
+
runComputerCommand(args: string[], command?: string, input?: string): Promise<ModuleCommandResult>;
|
|
336
343
|
/**
|
|
337
344
|
* The same, on a saved machine whose package of the same name is that computer's: what the
|
|
338
345
|
* package keeps over there, read and changed with this computer's key there, as that machine's
|
|
@@ -374,7 +381,7 @@ export interface ModuleHost {
|
|
|
374
381
|
machines(): Promise<ModuleMachines>;
|
|
375
382
|
/**
|
|
376
383
|
* Save the machine a link names: the link another OpenAgent gives for a new device, as a person
|
|
377
|
-
* pastes it under
|
|
384
|
+
* pastes it under Devices. This computer is let in there with it, once, and keeps its key.
|
|
378
385
|
*/
|
|
379
386
|
addMachine(link: string, label?: string): Promise<MachineAdded>;
|
|
380
387
|
/**
|
|
@@ -382,6 +389,19 @@ export interface ModuleHost {
|
|
|
382
389
|
* there stops working. Refused, with the reason, while a run is at work there.
|
|
383
390
|
*/
|
|
384
391
|
removeMachine(id: string): Promise<MachineRemoved>;
|
|
392
|
+
/** Give a saved machine the name the person picked. */
|
|
393
|
+
renameMachine(id: string, label: string): Promise<MachineAdded>;
|
|
394
|
+
/**
|
|
395
|
+
* Have a saved machine save this computer, with the link this computer's door gave for a new
|
|
396
|
+
* device: that machine then starts runs here too. Not for a computer reached through a server.
|
|
397
|
+
*/
|
|
398
|
+
letMachineIn(machineId: string, link: string): Promise<MachineAdded>;
|
|
399
|
+
/**
|
|
400
|
+
* A code one more device of the person's gets in with at a saved machine, a server: the link a
|
|
401
|
+
* camera opens, and what is typed on another computer instead, where and the code. Works once,
|
|
402
|
+
* until `expires`. Not for a computer reached through a server.
|
|
403
|
+
*/
|
|
404
|
+
machineCode(machineId: string): Promise<ModuleMachineCode>;
|
|
385
405
|
/**
|
|
386
406
|
* The computers that keep a line open to a saved server: computers at home a run can be sent to
|
|
387
407
|
* through the server, and whether each is saved here already. None for a machine that is no server.
|
|
@@ -418,11 +438,18 @@ export interface ModuleMachine {
|
|
|
418
438
|
device?: string;
|
|
419
439
|
/** Whose computer it is, by their GitHub account, when it is another person's shared with everyone on a server. */
|
|
420
440
|
owner?: string;
|
|
441
|
+
/**
|
|
442
|
+
* The ids the machine is listed under at the doors of the machines it saved, as it says: one of
|
|
443
|
+
* them among this computer's own door's devices is that machine, in there too.
|
|
444
|
+
*/
|
|
445
|
+
listed?: string[];
|
|
421
446
|
}
|
|
422
447
|
/** What {@link ModuleHost.machines} answers. */
|
|
423
448
|
export interface ModuleMachines {
|
|
424
449
|
/** This computer's own OpenAgent. */
|
|
425
450
|
version: string;
|
|
451
|
+
/** This computer's own name, as another machine lists it: "Suleimans-MacBook-Pro". */
|
|
452
|
+
name?: string;
|
|
426
453
|
machines: ModuleMachine[];
|
|
427
454
|
}
|
|
428
455
|
/** How saving a machine went: done, or stopped, with the reason. */
|
|
@@ -432,6 +459,19 @@ export type MachineAdded = {
|
|
|
432
459
|
ok: false;
|
|
433
460
|
error: string;
|
|
434
461
|
};
|
|
462
|
+
/** A code a device gets in with at a saved machine, as {@link ModuleHost.machineCode} answers it. */
|
|
463
|
+
export type ModuleMachineCode = {
|
|
464
|
+
ok: true;
|
|
465
|
+
value: {
|
|
466
|
+
url: string;
|
|
467
|
+
where: string;
|
|
468
|
+
code: string;
|
|
469
|
+
expires: string;
|
|
470
|
+
};
|
|
471
|
+
} | {
|
|
472
|
+
ok: false;
|
|
473
|
+
error: string;
|
|
474
|
+
};
|
|
435
475
|
/** A computer that keeps a line open to a saved server, as {@link ModuleHost.computersThrough} answers it. */
|
|
436
476
|
export interface ModuleComputerThrough {
|
|
437
477
|
/** The server's id for it. */
|
|
@@ -513,9 +553,8 @@ export { StartAgentButton } from '../components/StartAgentButton.js';
|
|
|
513
553
|
export { LinkActions, type ProjectLinks, type LinkTargets } from '../components/LinkActions.js';
|
|
514
554
|
export { cn } from '../lib/utils.js';
|
|
515
555
|
export { SettingsSection, SettingsRow, SettingsSelectRow, type SettingsOption } from '../components/SettingsRows.js';
|
|
556
|
+
export { useSettingsCrumb, type SettingsCrumb } from '../lib/settings-crumb.js';
|
|
516
557
|
export { QrCode } from '../components/QrCode.js';
|
|
517
|
-
export { AddMachineDialog } from '../components/AddMachineDialog.js';
|
|
518
|
-
export { InviteDialog, type InviteCode, type InviteAnswer, type InvitePersons } from '../components/InviteDialog.js';
|
|
519
558
|
export { Dialog } from '../components/ui/dialog.js';
|
|
520
559
|
export { reachedByLine } from '../../src/client.js';
|
|
521
560
|
export { useCodingAgents, type CodingAgent } from '../lib/models.js';
|
|
@@ -523,6 +562,7 @@ export { MAX_SPEND_OFFSET } from '../../src/preference-defaults.js';
|
|
|
523
562
|
export { formatRelative, formatDateTime, formatDuration, formatAge } from '../lib/format-date.js';
|
|
524
563
|
export { usePolled, useLoaded, forgetRemembered } from '../lib/use-async.js';
|
|
525
564
|
export { useNarrow } from '../lib/use-narrow.js';
|
|
565
|
+
export { Waiting } from '../components/Waiting.js';
|
|
526
566
|
export { useHighlighted, Pieces, type Piece } from '../lib/highlight.js';
|
|
527
567
|
export { useAction } from '../lib/use-action.js';
|
|
528
568
|
export { useSchedule, type Schedule } from '../lib/use-schedule.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** An account the git host's tool knows, as its package said it. */
|
|
2
|
+
export interface GitHostAccount {
|
|
3
|
+
login: string;
|
|
4
|
+
/** The terminal's: the one the tool uses when not told which. */
|
|
5
|
+
terminal: boolean;
|
|
6
|
+
/** The one OpenAgent's runs use. */
|
|
7
|
+
runs: boolean;
|
|
8
|
+
/** Whether the tool could use it when asked. */
|
|
9
|
+
ok: boolean;
|
|
10
|
+
}
|
|
11
|
+
/** What a git host's package answers of it. */
|
|
12
|
+
export interface GitHostProvider {
|
|
13
|
+
name: string;
|
|
14
|
+
/** The host's word for a pull request. */
|
|
15
|
+
requestWord: string;
|
|
16
|
+
/** Its logo, an SVG. */
|
|
17
|
+
logo?: string;
|
|
18
|
+
/** The tool it works through, by its command's name. */
|
|
19
|
+
tool: string;
|
|
20
|
+
installed: boolean;
|
|
21
|
+
/** The command a press installs the tool with, shown under the button. */
|
|
22
|
+
install: string;
|
|
23
|
+
accounts: GitHostAccount[];
|
|
24
|
+
/** A login waiting for the browser's yes: the code the person types, and where. */
|
|
25
|
+
loggingIn?: {
|
|
26
|
+
code: string;
|
|
27
|
+
url: string;
|
|
28
|
+
};
|
|
29
|
+
/** The install a press started is going on. */
|
|
30
|
+
installing?: boolean;
|
|
31
|
+
/** Why the last install failed, while the tool is still not here. */
|
|
32
|
+
installFailed?: string;
|
|
33
|
+
}
|
|
34
|
+
/** The host of a git remote's address: `git@host:path`, `ssh://user@host/path`, `https://host/path`. None for a local path. */
|
|
35
|
+
export declare function remoteHost(remote: string): string | undefined;
|
|
36
|
+
/** A package's `accounts` answer, read: none for an answer that is not one. */
|
|
37
|
+
export declare function readProvider(output: unknown): GitHostProvider | undefined;
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* What a computer says of a login there is only whose it is, where it came from and a mark of it:
|
|
9
9
|
* the start of its SHA-256, by which the copier tells whether the copy is still its own login.
|
|
10
|
-
* The login itself is never said. The marks are the
|
|
10
|
+
* The login itself is never said. The marks are the devices package's (`servers/own.ts`), made the same way.
|
|
11
11
|
*/
|
|
12
12
|
/** One login there, as that computer says it. */
|
|
13
13
|
export interface LoginThere {
|
|
@@ -40,7 +40,7 @@ export declare function markOf(login: string): string;
|
|
|
40
40
|
/** What another computer said of the logins there, as far as it reads as such: it is another computer's data. */
|
|
41
41
|
export declare function readLogins(value: unknown): MachineLogins;
|
|
42
42
|
/**
|
|
43
|
-
* The
|
|
43
|
+
* The devices package's `server own` answer of a person's own OpenAgent, as that computer says it: each
|
|
44
44
|
* login that is there, a copy when it names the server it came from.
|
|
45
45
|
*/
|
|
46
46
|
export declare function loginsOfOwn(said: unknown): MachineLogins;
|
|
@@ -14,17 +14,19 @@ export interface Person {
|
|
|
14
14
|
avatar?: string;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
|
-
* Who a call came from, when the door in front of OpenAgent says (
|
|
18
|
-
*
|
|
17
|
+
* Who a call came from, when the door in front of OpenAgent says (the devices package): the name
|
|
18
|
+
* of the person whose device made it, `%`-encoded, as a header carries only plain letters. Said
|
|
19
|
+
* only on a computer several persons use.
|
|
19
20
|
*/
|
|
20
21
|
export declare const PERSON_HEADER = "x-openagent-person";
|
|
21
|
-
/** Run `call` as one a person's device made, by their
|
|
22
|
+
/** Run `call` as one a person's device made, by their name, when the request said one. */
|
|
22
23
|
export declare function asCaller<T>(header: string | string[] | undefined, call: () => Promise<T>): Promise<T>;
|
|
23
|
-
/**
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
/** The person whose device made this call, by their name: only a person the owner invited is said. */
|
|
25
|
+
export declare function callerAtPage(): string | undefined;
|
|
26
|
+
/** How a command of this computer's is told who asks, when a person the owner invited does: their name, `%`-encoded. */
|
|
27
|
+
export declare const CALLER_ENV = "OPENAGENT_CALLER";
|
|
28
|
+
/** The person at the page: the one this computer knows, or, for a call another person's device made, that person by their name. */
|
|
29
|
+
export declare function personAtPage(own: Person, name?: string | undefined): Person;
|
|
28
30
|
/** `projects` are the listed projects' folders, in the list's order. */
|
|
29
31
|
export declare function readPerson(deps: {
|
|
30
32
|
projects: () => Promise<string[]>;
|
|
@@ -49,13 +49,14 @@ export type RelayStartResult = StartAgentResult | {
|
|
|
49
49
|
*/
|
|
50
50
|
export declare function pingRemote(target: MachineAccess): Promise<boolean>;
|
|
51
51
|
/**
|
|
52
|
-
* What a saved machine says of itself in its ping: the OpenAgent it runs,
|
|
53
|
-
* name, which the records of its runs carry
|
|
54
|
-
* does not say.
|
|
52
|
+
* What a saved machine says of itself in its ping: the OpenAgent it runs, the computer's own
|
|
53
|
+
* name, which the records of its runs carry, and the ids it is listed under at the doors of the
|
|
54
|
+
* machines it saved. Nothing for a machine that does not answer, or does not say.
|
|
55
55
|
*/
|
|
56
56
|
export declare function remoteFacts(target: MachineAccess): Promise<{
|
|
57
57
|
version?: string;
|
|
58
58
|
host?: string;
|
|
59
|
+
listed?: string[];
|
|
59
60
|
}>;
|
|
60
61
|
/** The OpenAgent a saved machine runs, as its ping tells it; nothing for a machine that does not answer, or does not say. */
|
|
61
62
|
export declare function remoteVersion(target: MachineAccess): Promise<string | undefined>;
|
|
@@ -93,7 +94,7 @@ export declare function leaveRemote(machine: MachineAccess & {
|
|
|
93
94
|
* computer at home that nothing on a network reaches is asked at this address, through the
|
|
94
95
|
* server, with this computer's key at the server. To this computer it is one more machine.
|
|
95
96
|
*/
|
|
96
|
-
export declare const THROUGH_PATH = "/
|
|
97
|
+
export declare const THROUGH_PATH = "/_devices/via/";
|
|
97
98
|
/** A computer that keeps a line open to a server, as the server's door lists it. */
|
|
98
99
|
export interface ComputerOnServer {
|
|
99
100
|
id: string;
|
|
@@ -246,6 +247,17 @@ export declare function remoteComputerCommand(machine: MachineAccess, pkg: strin
|
|
|
246
247
|
ok: false;
|
|
247
248
|
error: string;
|
|
248
249
|
}>;
|
|
250
|
+
/**
|
|
251
|
+
* Have a saved machine save this computer, by a link this computer's door gave for a new device:
|
|
252
|
+
* that machine then sends its runs here too. Asked of the machine's own OpenAgent, as its page
|
|
253
|
+
* would add a machine; what it answers is its own words.
|
|
254
|
+
*/
|
|
255
|
+
export declare function remoteAddMachine(machine: MachineAccess, link: string, label: string): Promise<{
|
|
256
|
+
ok: true;
|
|
257
|
+
} | {
|
|
258
|
+
ok: false;
|
|
259
|
+
error: string;
|
|
260
|
+
}>;
|
|
249
261
|
/** The logins this computer's person has on a machine of another person's, as that machine says (machine-logins.ts). */
|
|
250
262
|
export declare function remoteLogins(machine: MachineAccess): Promise<{
|
|
251
263
|
ok: true;
|
|
@@ -270,6 +282,8 @@ export type DoorAsk = {
|
|
|
270
282
|
id: string;
|
|
271
283
|
} | {
|
|
272
284
|
what: 'line';
|
|
285
|
+
} | {
|
|
286
|
+
what: 'code';
|
|
273
287
|
};
|
|
274
288
|
/**
|
|
275
289
|
* Ask a machine's door about the person this computer is in as there: the door answers it
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { type AgentAccount, type DriverRateWindow } from '@openagt/agent-driver';
|
|
2
|
+
import { type Mint } from '@openagt/agent-driver-claude';
|
|
3
|
+
import { type CodexLogin, type CodexLoginOptions, type CodexWho } from '@openagt/agent-driver-codex';
|
|
4
|
+
/** The agents with accounts: Claude Code's and Codex's. */
|
|
5
|
+
export type AccountsAgent = 'claude' | 'codex';
|
|
6
|
+
/** One of an account's usage windows, by how long it lasts. */
|
|
7
|
+
export interface AccountWindow {
|
|
8
|
+
/** `5 h`, `week`, `month`. */
|
|
9
|
+
label: string;
|
|
10
|
+
/** How much of it is gone, 0-100. */
|
|
11
|
+
percent: number;
|
|
12
|
+
}
|
|
13
|
+
/** One account as the page shows it. */
|
|
14
|
+
export interface AccountRow {
|
|
15
|
+
/** The account as the file names it: what the page sends back to act on it. */
|
|
16
|
+
id: string;
|
|
17
|
+
/** Its name as shown: the person's own goes by the agent's name for them until they give it one. */
|
|
18
|
+
name: string;
|
|
19
|
+
/** The person's own login, which the agent keeps: it is never removed. */
|
|
20
|
+
own: boolean;
|
|
21
|
+
/** When an added one was added, ISO 8601. */
|
|
22
|
+
added?: string;
|
|
23
|
+
/** How full it is, shortest window first; none when nothing said it yet. */
|
|
24
|
+
windows: AccountWindow[];
|
|
25
|
+
/** When those were said, epoch ms, when not now: an added Claude account is known from its last run. */
|
|
26
|
+
asOf?: number;
|
|
27
|
+
/** Until when a limit keeps it out, epoch ms. */
|
|
28
|
+
limitedUntil?: number;
|
|
29
|
+
/** `in-use`: the first one a run takes now; `next`: the one after it; `limited`: a limit keeps it out. */
|
|
30
|
+
state?: 'in-use' | 'next' | 'limited';
|
|
31
|
+
}
|
|
32
|
+
/** An account being added: the browser is open on the agent's page, or the login is being kept. */
|
|
33
|
+
export interface AccountAdding {
|
|
34
|
+
name: string;
|
|
35
|
+
/** The page to sign in at, when the agent gave one: what a person copies into a private window when the browser is signed in to another account. */
|
|
36
|
+
url?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface AccountsView {
|
|
39
|
+
accounts: AccountRow[];
|
|
40
|
+
adding?: AccountAdding;
|
|
41
|
+
/** Why the last add did not go through. */
|
|
42
|
+
failed?: string;
|
|
43
|
+
/** The daemon's clock, so "free in 2 h" is counted from the same now. */
|
|
44
|
+
now: number;
|
|
45
|
+
}
|
|
46
|
+
/** What the RPCs reach for, swapped in tests: the logins, where each agent keeps who the person is, how full a Codex account is. */
|
|
47
|
+
export declare const accountsWiring: {
|
|
48
|
+
mint: Mint;
|
|
49
|
+
claudeJson: () => string;
|
|
50
|
+
path: (agent: AccountsAgent) => string;
|
|
51
|
+
now: () => number;
|
|
52
|
+
loginCodex: (opts: CodexLoginOptions) => Promise<CodexLogin>;
|
|
53
|
+
codexDir: () => string;
|
|
54
|
+
codexOwnHome: () => string;
|
|
55
|
+
codexFolder: (account: AgentAccount) => string;
|
|
56
|
+
codexWho: (home: string) => Promise<CodexWho>;
|
|
57
|
+
codexUsage: (home: string) => Promise<DriverRateWindow[]>;
|
|
58
|
+
};
|
|
59
|
+
/** An agent's accounts in the order runs try them, each with how full it is and whether a limit keeps it out. */
|
|
60
|
+
export declare function onAgentAccounts(agent: AccountsAgent): Promise<AccountsView>;
|
|
61
|
+
export type AccountResult = {
|
|
62
|
+
ok: true;
|
|
63
|
+
} | {
|
|
64
|
+
ok: false;
|
|
65
|
+
error: string;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Add an account: this computer's browser opens on the agent's page, the person signs in there to
|
|
69
|
+
* the account being added, and its login is kept under `name`. Answers at once; the page follows it
|
|
70
|
+
* in {@link onAgentAccounts}.
|
|
71
|
+
*/
|
|
72
|
+
export declare function sendAddAgentAccount(agent: AccountsAgent, name: string): Promise<AccountResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Remove an added account. A Claude login is not ended: it is good until its year is over, or until
|
|
75
|
+
* it is taken back on claude.ai. A Codex account's folder, its login in it, goes with it.
|
|
76
|
+
*/
|
|
77
|
+
export declare function sendRemoveAgentAccount(agent: AccountsAgent, name: string): Promise<AccountResult>;
|
|
78
|
+
/** Runs try `name` first from now on. */
|
|
79
|
+
export declare function sendUseAgentAccountFirst(agent: AccountsAgent, name: string): Promise<AccountResult>;
|
|
80
|
+
/** The person's own login under the name they give it. */
|
|
81
|
+
export declare function sendNameOwnAgentAccount(agent: AccountsAgent, name: string): Promise<AccountResult>;
|
|
@@ -6,10 +6,12 @@ export { onPreferences, savePreferences, patchPreferences, onProjectPresets, sav
|
|
|
6
6
|
export { type EditorInfo } from '../dashboard/open-in-app.js';
|
|
7
7
|
export { onQuota } from './quota.js';
|
|
8
8
|
export { onModels } from './models.js';
|
|
9
|
-
export { onMachines, sendAddMachine, sendRemoveMachine, onMachinesReachable, onMachineVersions, sendProjectToMachine, onProjectOnMachine, onComputersThrough, sendAddComputerThrough, onMachinePerson, sendRemoveMachineDevice, sendMachineLineLink, sendMachineTold, onMachineLogins, sendMachineLogins, type Machine, type MachineLoginsResult, type AddMachineResult, type MachineVersions, type ProjectOnMachine, type ComputersThrough, type MachinePerson } from './machines.js';
|
|
9
|
+
export { onMachines, sendAddMachine, sendRemoveMachine, onMachinesReachable, onMachineVersions, sendProjectToMachine, onProjectOnMachine, onComputersThrough, sendAddComputerThrough, onMachinePerson, sendRemoveMachineDevice, sendRenameMachine, sendLetMachineIn, sendMachineLineLink, sendMachineCode, sendMachineTold, onMachineLogins, sendMachineLogins, type Machine, type MachineLoginsResult, type AddMachineResult, type MachineVersions, type ProjectOnMachine, type ComputersThrough, type MachinePerson, type MachineCode } from './machines.js';
|
|
10
10
|
export { onModules, runModuleCommand, runComputerCommand, runComputerCommandOn, readModule, type DashboardModule, type ModuleCommandResult, type ModuleReadResult } from './modules.js';
|
|
11
11
|
export { onProjectSkills, sendChangeSkills, sendProjectSkills, type ProjectSkills, type ProjectSkill, type ChangeSkillsResult } from './skills.js';
|
|
12
12
|
export { onPerson, type Person } from './person.js';
|
|
13
|
+
export { onGitHosts, sendUseGitHostAccount, sendGitHostLogin, sendGitHostInstall, onAgentState, sendAgentFix, onProjectAccounts, sendProjectAccounts, type GitHostsView, type GitHostRow, type GitHostAccount, type GitHostProvider, type AgentState, type ProjectAccountsView, type ProjectAgentAccounts } from './logins.js';
|
|
14
|
+
export { onAgentAccounts, sendAddAgentAccount, sendRemoveAgentAccount, sendUseAgentAccountFirst, sendNameOwnAgentAccount, type AccountsAgent, type AccountRow, type AccountWindow, type AccountAdding, type AccountsView, type AccountResult } from './accounts.js';
|
|
13
15
|
import { streamAgentEvents } from './events.js';
|
|
14
16
|
/** One RPC: called with whatever the browser sent, answering with whatever JSON.stringify keeps. */
|
|
15
17
|
export type RpcHandler = (...args: never[]) => unknown;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { runPackageCommand, type ProvidedCommand } from '@openagt/agent-data';
|
|
2
|
+
import type { DriverFix, DriverReadiness } from '@openagt/agent-driver';
|
|
3
|
+
import { type DriverName } from '../driver-names.js';
|
|
4
|
+
import { type AccountResult } from './accounts.js';
|
|
5
|
+
import { type GitHostProvider } from '../dashboard/git-hosts.js';
|
|
6
|
+
export type { GitHostAccount, GitHostProvider } from '../dashboard/git-hosts.js';
|
|
7
|
+
/** One host the projects' remotes are on: which projects, and its package's answer, or none when no package answers for it. */
|
|
8
|
+
export interface GitHostRow {
|
|
9
|
+
host: string;
|
|
10
|
+
/** The projects whose remote is there, by name. */
|
|
11
|
+
projects: string[];
|
|
12
|
+
provider?: GitHostProvider;
|
|
13
|
+
}
|
|
14
|
+
export interface GitHostsView {
|
|
15
|
+
hosts: GitHostRow[];
|
|
16
|
+
}
|
|
17
|
+
/** What the RPCs reach for, swapped in tests. */
|
|
18
|
+
export declare const loginsWiring: {
|
|
19
|
+
/** The origin remote's address of the project at `root`. */
|
|
20
|
+
origin: (root: string) => Promise<string | undefined>;
|
|
21
|
+
/** The project's git host package's command. */
|
|
22
|
+
gitHost: (root: string) => Promise<ProvidedCommand | undefined>;
|
|
23
|
+
run: typeof runPackageCommand;
|
|
24
|
+
ready: (driver: DriverName) => Promise<DriverReadiness>;
|
|
25
|
+
/** Run a fix's command to its end; rejects with its last lines. */
|
|
26
|
+
fix: (command: string) => Promise<void>;
|
|
27
|
+
driver: () => Promise<DriverName>;
|
|
28
|
+
};
|
|
29
|
+
/** The hosts the projects' remotes are on, in the projects' order, each with its package's answer. A project with no remote is on none. */
|
|
30
|
+
export declare function onGitHosts(): Promise<GitHostsView>;
|
|
31
|
+
/** Runs use `login` at `host` from now on; the terminal's own account stays as it is. */
|
|
32
|
+
export declare function sendUseGitHostAccount(host: string, login: string): Promise<AccountResult>;
|
|
33
|
+
/** Log another account in at `host`, in the browser: the code the person types, and where. */
|
|
34
|
+
export declare function sendGitHostLogin(host: string): Promise<{
|
|
35
|
+
ok: true;
|
|
36
|
+
code: string;
|
|
37
|
+
url: string;
|
|
38
|
+
} | {
|
|
39
|
+
ok: false;
|
|
40
|
+
error: string;
|
|
41
|
+
}>;
|
|
42
|
+
/** Install the tool `host`'s package works through, with the command it declared; the card follows it. */
|
|
43
|
+
export declare function sendGitHostInstall(host: string): Promise<AccountResult>;
|
|
44
|
+
/** How the coding agent's CLI is on this computer, and what a press does about what is missing. */
|
|
45
|
+
export interface AgentState {
|
|
46
|
+
driver: DriverName;
|
|
47
|
+
/** Installed and logged in, or it could not say otherwise. */
|
|
48
|
+
ready: boolean;
|
|
49
|
+
/** What is in the way, in words. */
|
|
50
|
+
problem?: string;
|
|
51
|
+
/** What a press does about it, when the agent's package declared a command for it. */
|
|
52
|
+
fix?: DriverFix;
|
|
53
|
+
/** A press's fix going on. */
|
|
54
|
+
fixing?: DriverFix['kind'];
|
|
55
|
+
/** Why the last press's fix failed. */
|
|
56
|
+
failed?: string;
|
|
57
|
+
}
|
|
58
|
+
/** The coding agent picked in Settings, or `driver`: installed, logged in, and what a press fixes. */
|
|
59
|
+
export declare function onAgentState(driver?: string): Promise<AgentState>;
|
|
60
|
+
/**
|
|
61
|
+
* Fix what is in the way of `driver`: the command its package declared for it, run here, the
|
|
62
|
+
* install to its end, the login until the browser said yes. Answers at once; the page follows it
|
|
63
|
+
* in {@link onAgentState}.
|
|
64
|
+
*/
|
|
65
|
+
export declare function sendAgentFix(driver: string): Promise<AccountResult>;
|
|
66
|
+
/** A project's own accounts, beside the computer's: shown for a kind the computer has two or more of, or that the project names already. */
|
|
67
|
+
export interface ProjectAccountsView {
|
|
68
|
+
gitHost?: {
|
|
69
|
+
host: string;
|
|
70
|
+
name: string;
|
|
71
|
+
/** The host's word for a pull request. */
|
|
72
|
+
requestWord: string;
|
|
73
|
+
accounts: string[];
|
|
74
|
+
/** The computer's runs' account. */
|
|
75
|
+
computer?: string;
|
|
76
|
+
/** The project's own, when it names one. */
|
|
77
|
+
project?: string;
|
|
78
|
+
};
|
|
79
|
+
claude?: ProjectAgentAccounts;
|
|
80
|
+
codex?: ProjectAgentAccounts;
|
|
81
|
+
}
|
|
82
|
+
/** One agent's accounts a project may pick from, and its own few. */
|
|
83
|
+
export interface ProjectAgentAccounts {
|
|
84
|
+
accounts: {
|
|
85
|
+
id: string;
|
|
86
|
+
name: string;
|
|
87
|
+
}[];
|
|
88
|
+
/** The project's own few, by id, when it names some. */
|
|
89
|
+
project?: string[];
|
|
90
|
+
}
|
|
91
|
+
export declare function onProjectAccounts(projectId: string): Promise<ProjectAccountsView | null>;
|
|
92
|
+
/** Change a project's own accounts: a value sets one, `null` goes back to the computer's. Kept on this computer, never in the repository. */
|
|
93
|
+
export declare function sendProjectAccounts(projectId: string, change: {
|
|
94
|
+
gitHost?: string | null;
|
|
95
|
+
claude?: string[] | null;
|
|
96
|
+
codex?: string[] | null;
|
|
97
|
+
}): Promise<AccountResult>;
|
|
@@ -123,25 +123,67 @@ export declare function sendMachineLineLink(machineId: string): Promise<{
|
|
|
123
123
|
ok: false;
|
|
124
124
|
error: string;
|
|
125
125
|
}>;
|
|
126
|
+
/** A code one more device of this person's gets in with at a saved machine: the link a camera opens, and what is typed instead, where and the code. */
|
|
127
|
+
export interface MachineCode {
|
|
128
|
+
url: string;
|
|
129
|
+
where: string;
|
|
130
|
+
code: string;
|
|
131
|
+
expires: string;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* A code that lets one more device of this person's in at a saved machine, a server: a device
|
|
135
|
+
* that is in gives the code for the next one. Asked of the machine's door with this computer's
|
|
136
|
+
* key there, so every computer of the person's that is in asks, not only the one that set the
|
|
137
|
+
* server up. The code works once, for a short time.
|
|
138
|
+
*/
|
|
139
|
+
export declare function sendMachineCode(machineId: string): Promise<{
|
|
140
|
+
ok: true;
|
|
141
|
+
value: MachineCode;
|
|
142
|
+
} | {
|
|
143
|
+
ok: false;
|
|
144
|
+
error: string;
|
|
145
|
+
}>;
|
|
126
146
|
/** Whether each saved machine answers right now, by id: one short call to each, with this computer's key. */
|
|
127
147
|
export declare function onMachinesReachable(): Promise<Record<string, boolean>>;
|
|
128
148
|
/** This computer's OpenAgent, and the one each saved machine runs. */
|
|
129
149
|
export interface MachineVersions {
|
|
130
150
|
/** This computer's own. */
|
|
131
151
|
version: string;
|
|
132
|
-
/**
|
|
152
|
+
/** This computer's own name, as another machine lists it. */
|
|
153
|
+
name: string;
|
|
154
|
+
/**
|
|
155
|
+
* Each saved machine, with its version when it answers and says, the id it lists this computer
|
|
156
|
+
* under among its devices, and the ids it is listed under at the doors of the machines it saved.
|
|
157
|
+
*/
|
|
133
158
|
machines: (Machine & {
|
|
134
159
|
version?: string;
|
|
135
160
|
device?: string;
|
|
161
|
+
listed?: string[];
|
|
136
162
|
})[];
|
|
137
163
|
}
|
|
138
164
|
/**
|
|
139
165
|
* The saved machines with the OpenAgent each runs, beside this computer's own: how a page tells
|
|
140
166
|
* that a machine fell behind this computer. One short call to each, with this computer's key.
|
|
141
167
|
* The key itself is never told: only the id the machine lists this computer under, which a page
|
|
142
|
-
* that lists the machine's devices names this computer by.
|
|
168
|
+
* that lists the machine's devices names this computer by. A machine also says the ids it is
|
|
169
|
+
* listed under at the doors it saved: one of them in this computer's own door is that machine,
|
|
170
|
+
* in there too, so a page lists the computer once. A machine that does not answer is known by
|
|
171
|
+
* what it said last.
|
|
143
172
|
*/
|
|
144
173
|
export declare function onMachineVersions(): Promise<MachineVersions>;
|
|
174
|
+
/** Give a saved machine the name the person picked. */
|
|
175
|
+
export declare function sendRenameMachine(id: string, label: string): Promise<AddMachineResult>;
|
|
176
|
+
/**
|
|
177
|
+
* Have a saved machine save this computer, with a link this computer's door gave for a new
|
|
178
|
+
* device: from then on it starts runs here too. Not for a computer reached through a server,
|
|
179
|
+
* whose runs come here through that server.
|
|
180
|
+
*/
|
|
181
|
+
export declare function sendLetMachineIn(machineId: string, link: string): Promise<{
|
|
182
|
+
ok: true;
|
|
183
|
+
} | {
|
|
184
|
+
ok: false;
|
|
185
|
+
error: string;
|
|
186
|
+
}>;
|
|
145
187
|
/** Whether a saved machine has a project of this computer's: `there` is false while the machine clones it. */
|
|
146
188
|
export type ProjectOnMachine = {
|
|
147
189
|
ok: true;
|