@openagt/servers 0.0.1 → 0.0.3
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/cli.d.ts +6 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +28 -20
- package/dist/cli.js.map +1 -1
- package/dist/dashboard/dashboard.css +1 -1
- package/dist/dashboard/dashboard.js +270 -190
- package/dist/install.d.ts +9 -0
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +24 -6
- package/dist/install.js.map +1 -1
- package/dist/logins.d.ts +11 -0
- package/dist/logins.d.ts.map +1 -1
- package/dist/logins.js +55 -16
- package/dist/logins.js.map +1 -1
- package/dist/steps.d.ts +26 -2
- package/dist/steps.d.ts.map +1 -1
- package/dist/steps.js +115 -1
- package/dist/steps.js.map +1 -1
- package/dist/store.d.ts +13 -1
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +24 -1
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/install.d.ts
CHANGED
|
@@ -23,6 +23,15 @@ export interface InstallOptions {
|
|
|
23
23
|
export declare class AlreadyWorking extends Error {
|
|
24
24
|
constructor(address: string);
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* This computer's own name and email in git, each when it has one: what the person commits as
|
|
28
|
+
* in a folder that says nothing else, so git is asked outside every folder. A server's git
|
|
29
|
+
* that has none gets them.
|
|
30
|
+
*/
|
|
31
|
+
export declare function ownGitIdentity(exec?: Exec): Promise<{
|
|
32
|
+
name?: string;
|
|
33
|
+
email?: string;
|
|
34
|
+
}>;
|
|
26
35
|
export declare function install(opts: InstallOptions): Promise<void>;
|
|
27
36
|
export type Link = {
|
|
28
37
|
ok: true;
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AACA,OAAO,EAAwD,KAAK,IAAI,EAAgB,MAAM,UAAU,CAAA;AAExG,OAAO,EAAsD,KAAK,MAAM,EAAkB,MAAM,YAAY,CAAA;AAE5G;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,sEAAsE;AACtE,qBAAa,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAO,EAAE,MAAM,EAE1B;CACF;AAKD;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,IAAI,GAAE,IAAe,GAAG,OAAO,CAAC;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAOtG;AAED,wBAAsB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuDjE;AAED,MAAM,MAAM,IAAI,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAQ5F;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAejH"}
|
package/dist/install.js
CHANGED
|
@@ -1,13 +1,28 @@
|
|
|
1
1
|
import { giveGithub, noteGithub } from './logins.js';
|
|
2
|
-
import { lastLines, openSession, withAdvice } from './ssh.js';
|
|
2
|
+
import { exec as realExec, lastLines, openSession, withAdvice } from './ssh.js';
|
|
3
3
|
import { SERVER_USER, STEPS, linkScript } from './steps.js';
|
|
4
|
-
import { BEAT_MS, changeServer, doorUrl, working } from './store.js';
|
|
4
|
+
import { BEAT_MS, changeServer, doorUrl, heartbeat, working } from './store.js';
|
|
5
5
|
/** Refused: the server's install already runs, in another process. */
|
|
6
6
|
export class AlreadyWorking extends Error {
|
|
7
7
|
constructor(address) {
|
|
8
8
|
super(`OpenAgent is being installed on ${address} right now`);
|
|
9
9
|
}
|
|
10
10
|
}
|
|
11
|
+
/** How long this computer's git gets to say a name. */
|
|
12
|
+
const GIT_TIMEOUT_MS = 10_000;
|
|
13
|
+
/**
|
|
14
|
+
* This computer's own name and email in git, each when it has one: what the person commits as
|
|
15
|
+
* in a folder that says nothing else, so git is asked outside every folder. A server's git
|
|
16
|
+
* that has none gets them.
|
|
17
|
+
*/
|
|
18
|
+
export async function ownGitIdentity(exec = realExec) {
|
|
19
|
+
const own = async (key) => {
|
|
20
|
+
const said = await exec('git', ['-C', '/', 'config', '--get', key], '', { timeoutMs: GIT_TIMEOUT_MS });
|
|
21
|
+
return said.code === 0 && said.out.trim() ? said.out.trim() : undefined;
|
|
22
|
+
};
|
|
23
|
+
const [name, email] = [await own('user.name'), await own('user.email')];
|
|
24
|
+
return { ...(name !== undefined ? { name } : {}), ...(email !== undefined ? { email } : {}) };
|
|
25
|
+
}
|
|
11
26
|
export async function install(opts) {
|
|
12
27
|
const { env, address, version } = opts;
|
|
13
28
|
const change = (apply) => changeServer(env, address, apply);
|
|
@@ -30,10 +45,11 @@ export async function install(opts) {
|
|
|
30
45
|
});
|
|
31
46
|
if (!server)
|
|
32
47
|
throw new Error(`no server at ${address}`);
|
|
33
|
-
const beating =
|
|
48
|
+
const beating = heartbeat(beat, opts.beatMs ?? BEAT_MS);
|
|
34
49
|
let session;
|
|
35
50
|
try {
|
|
36
51
|
session = await openSession(server, { ...(opts.exec ? { exec: opts.exec } : {}), ...(opts.signal ? { signal: opts.signal } : {}) });
|
|
52
|
+
const facts = { address, version, ...(await ownGitIdentity(opts.exec)) };
|
|
37
53
|
for (const step of STEPS) {
|
|
38
54
|
await set(step.id, 'running');
|
|
39
55
|
const login = step.id === 'login';
|
|
@@ -44,7 +60,7 @@ export async function install(opts) {
|
|
|
44
60
|
if (met.fingerprint)
|
|
45
61
|
await change(kept => void (kept.fingerprint = met.fingerprint));
|
|
46
62
|
}
|
|
47
|
-
const said = await session.run(step.as, step.script(
|
|
63
|
+
const said = await session.run(step.as, step.script(facts), step.timeoutMs);
|
|
48
64
|
if (said.code !== 0) {
|
|
49
65
|
const words = lastLines(said) || 'The step ended without a word.';
|
|
50
66
|
return void (await set(step.id, 'failed', login ? withAdvice(server, words) : words));
|
|
@@ -58,7 +74,7 @@ export async function install(opts) {
|
|
|
58
74
|
}
|
|
59
75
|
}
|
|
60
76
|
finally {
|
|
61
|
-
|
|
77
|
+
await beating.stop();
|
|
62
78
|
await change(kept => {
|
|
63
79
|
if (!mine(kept))
|
|
64
80
|
return;
|
|
@@ -71,6 +87,8 @@ export async function install(opts) {
|
|
|
71
87
|
await session?.close();
|
|
72
88
|
}
|
|
73
89
|
}
|
|
90
|
+
/** How long a link may be: a door's link is its address, a code and a key's mark, and a page draws it as a QR code. */
|
|
91
|
+
const LINK_MAX = 512;
|
|
74
92
|
/** How long the server gets to answer with a link: less than a page's command has, so the line is always hung up. */
|
|
75
93
|
const LINK_TIMEOUT_MS = 20_000;
|
|
76
94
|
/**
|
|
@@ -86,7 +104,7 @@ export async function askLink(server, opts = {}) {
|
|
|
86
104
|
return { ok: false, error: withAdvice(server, lastLines(said) || 'The server did not answer.') };
|
|
87
105
|
try {
|
|
88
106
|
const { url, expires } = JSON.parse(said.out.trim().split('\n').at(-1) ?? '');
|
|
89
|
-
if (typeof url === 'string' && typeof expires === 'string' && new URL(url).origin === doorUrl(server.address))
|
|
107
|
+
if (typeof url === 'string' && url.length <= LINK_MAX && typeof expires === 'string' && Number.isFinite(Date.parse(expires)) && new URL(url).origin === doorUrl(server.address))
|
|
90
108
|
return { ok: true, url, expires };
|
|
91
109
|
}
|
|
92
110
|
catch {
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAA2B,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/logins.d.ts
CHANGED
|
@@ -32,12 +32,21 @@ export type GithubGiven = {
|
|
|
32
32
|
});
|
|
33
33
|
/** Copy this computer's GitHub login to the server on a line that is already open. */
|
|
34
34
|
export declare function giveGithub(session: Session, run?: Exec): Promise<GithubGiven>;
|
|
35
|
+
/**
|
|
36
|
+
* Have the server get a GitHub login of its own, on a line that is already open: the server asks
|
|
37
|
+
* GitHub, GitHub answers with a code, `show` puts the code before the person, and the server
|
|
38
|
+
* waits until the person has typed it at GitHub and said yes there. No login passes through this
|
|
39
|
+
* computer.
|
|
40
|
+
*/
|
|
41
|
+
export declare function askGithub(session: Session, show: (code: string) => Promise<unknown>): Promise<GithubGiven>;
|
|
35
42
|
/** Write down how a copy of the GitHub login went. */
|
|
36
43
|
export declare function noteGithub(kept: Server, given: GithubGiven): void;
|
|
37
44
|
/** The login among what Claude Code showed, once all of it is there. */
|
|
38
45
|
export declare function mintedIn(shown: string): string | undefined;
|
|
39
46
|
/** Why Claude Code ended without a login, from what it showed: its last lines, never a part of a login. */
|
|
40
47
|
export declare function notMinted(shown: string): string;
|
|
48
|
+
/** Which process the lent terminal's first program said it is, once its whole line is there: half a number names another process. */
|
|
49
|
+
export declare function startedAs(shown: string): number | undefined;
|
|
41
50
|
export interface MintOptions {
|
|
42
51
|
signal?: AbortSignal;
|
|
43
52
|
/** How long the person has to say yes in the browser. */
|
|
@@ -67,6 +76,8 @@ export interface Job {
|
|
|
67
76
|
kind: LoginKind;
|
|
68
77
|
/** Take the login off the server, where otherwise the server is given one. */
|
|
69
78
|
remove: boolean;
|
|
79
|
+
/** GitHub: the server gets a login of its own, with a code a person types at GitHub, where otherwise this computer's is copied. */
|
|
80
|
+
own?: boolean;
|
|
70
81
|
}
|
|
71
82
|
export interface LoginOptions extends Job {
|
|
72
83
|
env: NodeJS.ProcessEnv;
|
package/dist/logins.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logins.d.ts","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"AACA,OAAO,EAAuD,KAAK,IAAI,EAAa,KAAK,OAAO,EAAE,MAAM,UAAU,CAAA;AAElH,OAAO,
|
|
1
|
+
{"version":3,"file":"logins.d.ts","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"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"}
|
package/dist/logins.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { exec as ownExec, lastLines, openSession, withAdvice } from './ssh.js';
|
|
3
|
-
import { LOGIN_TIMEOUT_MS, claudeLoginScript, claudeLogoutScript, githubLoginScript, githubLogoutScript } from './steps.js';
|
|
4
|
-
import { BEAT_MS, atWork, changeServer, isAccount } from './store.js';
|
|
3
|
+
import { GITHUB_CODE_TIMEOUT_MS, LOGIN_TIMEOUT_MS, claudeLoginScript, claudeLogoutScript, githubCodeScript, githubLoginScript, githubLogoutScript, githubWaitScript } from './steps.js';
|
|
4
|
+
import { BEAT_MS, atWork, changeServer, heartbeat, isAccount, isGithubCode } from './store.js';
|
|
5
5
|
/** How long one of this computer's own commands gets to answer. */
|
|
6
6
|
const OWN_TIMEOUT_MS = 15_000;
|
|
7
7
|
/** Why this computer's `gh` gave nothing, in words: never its own, which could hold what it was asked for. */
|
|
@@ -26,8 +26,8 @@ export function scrubbed(text, login) {
|
|
|
26
26
|
return login ? text.replaceAll(login, '•••') : text;
|
|
27
27
|
}
|
|
28
28
|
/** Run a login's script on the server. What comes back never holds the login. */
|
|
29
|
-
async function send(session, { as, script }, login = '') {
|
|
30
|
-
const said = await session.run(as, script,
|
|
29
|
+
async function send(session, { as, script }, login = '', timeoutMs = LOGIN_TIMEOUT_MS) {
|
|
30
|
+
const said = await session.run(as, script, timeoutMs);
|
|
31
31
|
const clean = { out: scrubbed(said.out, login), err: scrubbed(said.err, login) };
|
|
32
32
|
return said.code === 0 ? { ok: true, out: clean.out } : { ok: false, error: lastLines(clean) || 'The server did not answer.' };
|
|
33
33
|
}
|
|
@@ -42,6 +42,28 @@ export async function giveGithub(session, run = ownExec) {
|
|
|
42
42
|
const account = sent.out.trim().split('\n').at(-1)?.trim();
|
|
43
43
|
return isAccount(account) ? { ok: true, account } : { ok: false, error: 'The server took the login and did not say whose it is.', reached: true };
|
|
44
44
|
}
|
|
45
|
+
/** What the server answers once its `gh` waits for a code: the process, the file it writes to, and the code. */
|
|
46
|
+
const ASKING = /^(\d{1,10}) (\/[A-Za-z0-9._/-]{1,200}) (\S+)$/;
|
|
47
|
+
/**
|
|
48
|
+
* Have the server get a GitHub login of its own, on a line that is already open: the server asks
|
|
49
|
+
* GitHub, GitHub answers with a code, `show` puts the code before the person, and the server
|
|
50
|
+
* waits until the person has typed it at GitHub and said yes there. No login passes through this
|
|
51
|
+
* computer.
|
|
52
|
+
*/
|
|
53
|
+
export async function askGithub(session, show) {
|
|
54
|
+
const asked = await send(session, githubCodeScript());
|
|
55
|
+
if (!asked.ok)
|
|
56
|
+
return { ...asked, reached: true };
|
|
57
|
+
const [, pid, log, code] = ASKING.exec(asked.out.trim().split('\n').at(-1) ?? '') ?? [];
|
|
58
|
+
if (pid === undefined || log === undefined || !isGithubCode(code))
|
|
59
|
+
return { ok: false, error: 'The server answered something else than a code from GitHub.', reached: true };
|
|
60
|
+
await show(code);
|
|
61
|
+
const sent = await send(session, githubWaitScript(pid, log), '', GITHUB_CODE_TIMEOUT_MS);
|
|
62
|
+
if (!sent.ok)
|
|
63
|
+
return { ...sent, reached: true };
|
|
64
|
+
const account = sent.out.trim().split('\n').at(-1)?.trim();
|
|
65
|
+
return isAccount(account) ? { ok: true, account } : { ok: false, error: 'The server has a login and did not say whose it is.', reached: true };
|
|
66
|
+
}
|
|
45
67
|
/** What is known of a login beyond a try: since when it is there, and whose it is. */
|
|
46
68
|
const known = (login) => ({ ...(login?.since ? { since: login.since } : {}), ...(login?.account ? { account: login.account } : {}) });
|
|
47
69
|
/** Write down how a copy of the GitHub login went. */
|
|
@@ -52,12 +74,18 @@ export function noteGithub(kept, given) {
|
|
|
52
74
|
else
|
|
53
75
|
kept.github = { ...(given.reached ? {} : known(kept.github)), failed: given.error };
|
|
54
76
|
}
|
|
55
|
-
/** What Claude Code writes before and after the login it made, and what such a login reads as. */
|
|
56
|
-
const MINTED = /Your
|
|
77
|
+
/** What Claude Code writes before and after the login it made, and what such a login reads as. The gap between two words is of any width. */
|
|
78
|
+
const MINTED = /Your\s+OAuth\s+token[^\n]*:\s*(sk-ant-[A-Za-z0-9_-]{40,400})\s+Store\s+this\s+token\s+securely/;
|
|
57
79
|
/** What a terminal is told beside words: colours, where the cursor goes, a link's address. */
|
|
58
80
|
const TERMINAL = /\x1b\[[0-?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)|\x1b[@-Z\\-_]/g;
|
|
59
|
-
/**
|
|
60
|
-
const
|
|
81
|
+
/** A colour: the one thing a terminal is told that leaves the words on its two sides together. */
|
|
82
|
+
const COLOUR = /\x1b\[[0-9;:]*m/g;
|
|
83
|
+
/**
|
|
84
|
+
* The words Claude Code showed, without what only a terminal reads. A colour goes; anything else
|
|
85
|
+
* a terminal is told is a gap: Claude Code's screen puts a word at its column where a plain line
|
|
86
|
+
* holds a space, and a login the cursor moved in is not one login.
|
|
87
|
+
*/
|
|
88
|
+
const words = (shown) => shown.replace(COLOUR, '').replace(TERMINAL, ' ').replaceAll('\r', '\n');
|
|
61
89
|
/** The login among what Claude Code showed, once all of it is there. */
|
|
62
90
|
export function mintedIn(shown) {
|
|
63
91
|
return MINTED.exec(words(shown))?.[1];
|
|
@@ -65,16 +93,21 @@ export function mintedIn(shown) {
|
|
|
65
93
|
/** Why Claude Code ended without a login, from what it showed: its last lines, never a part of a login. */
|
|
66
94
|
export function notMinted(shown) {
|
|
67
95
|
const text = words(shown);
|
|
68
|
-
|
|
96
|
+
// However the screen was drawn: where a login or its heading shows, none of the screen is told.
|
|
97
|
+
if (/YourOAuthtoken|sk-ant-/.test(text.replace(/\s/g, '')))
|
|
69
98
|
return 'Claude Code made a login, and this OpenAgent could not read it off what Claude Code showed.';
|
|
70
|
-
const lines = [...new Set(text.split('\n').map(line => line.trim()).filter(line => line && !STARTED_AS.test(line)))];
|
|
99
|
+
const lines = [...new Set(text.split('\n').map(line => line.trim().replace(/\s+/g, ' ')).filter(line => line && !STARTED_AS.test(line)))];
|
|
71
100
|
return ['Claude Code ended without a login.', ...lines.slice(-5)].join('\n');
|
|
72
101
|
}
|
|
102
|
+
/** Which process the lent terminal's first program said it is, once its whole line is there: half a number names another process. */
|
|
103
|
+
export function startedAs(shown) {
|
|
104
|
+
return Number(/^started as (\d+)\n/m.exec(words(shown))?.[1]) || undefined;
|
|
105
|
+
}
|
|
73
106
|
const MINT_TIMEOUT_MS = 10 * 60_000;
|
|
74
107
|
/** How much of what Claude Code showed is kept: its end, where the login is. */
|
|
75
108
|
const SHOWN = 256 * 1024;
|
|
76
109
|
/** The line the lent terminal's first program writes of itself, before it becomes Claude Code. */
|
|
77
|
-
const STARTED_AS = /^started as
|
|
110
|
+
const STARTED_AS = /^started as \d+$/;
|
|
78
111
|
/**
|
|
79
112
|
* Make a Claude login that lasts a year, with Claude Code's own `claude setup-token`: it opens
|
|
80
113
|
* this computer's browser, the person says yes there, and it shows the login once. It keeps
|
|
@@ -122,7 +155,7 @@ export const mintClaude = ({ signal, timeoutMs = MINT_TIMEOUT_MS, command = 'cla
|
|
|
122
155
|
const read = (said) => {
|
|
123
156
|
shown = (shown + said).slice(-SHOWN);
|
|
124
157
|
// Read once, as it comes: it is the first thing written, and a long wait scrolls it out of what is kept.
|
|
125
|
-
lentTo ??=
|
|
158
|
+
lentTo ??= startedAs(shown);
|
|
126
159
|
const login = mintedIn(shown);
|
|
127
160
|
if (login)
|
|
128
161
|
end({ ok: true, login });
|
|
@@ -140,8 +173,8 @@ export class AlreadyAtWork extends Error {
|
|
|
140
173
|
}
|
|
141
174
|
}
|
|
142
175
|
/** Open a line to the server, meet it, and do `work` on it; a server that cannot be met is told with what to do about it. */
|
|
143
|
-
async function onServer(server, run, work) {
|
|
144
|
-
const session = await openSession(server, run ? { exec: run } : {});
|
|
176
|
+
async function onServer(server, run, work, signal) {
|
|
177
|
+
const session = await openSession(server, { ...(run ? { exec: run } : {}), ...(signal ? { signal } : {}) });
|
|
145
178
|
try {
|
|
146
179
|
const met = await session.meet();
|
|
147
180
|
if (!met.ok)
|
|
@@ -174,7 +207,7 @@ export async function changeLogin(opts) {
|
|
|
174
207
|
});
|
|
175
208
|
if (!server)
|
|
176
209
|
throw new Error(`no server at ${address}`);
|
|
177
|
-
const beating =
|
|
210
|
+
const beating = heartbeat(() => changeServer(env, address, kept => void (mine(kept) && (kept[kind].worker = beat()))), opts.beatMs ?? BEAT_MS);
|
|
178
211
|
const failed = (error) => (kept) => void (kept[kind] = { ...known(kept[kind]), failed: error });
|
|
179
212
|
let after = failed('The work stopped before it ended.');
|
|
180
213
|
try {
|
|
@@ -182,6 +215,12 @@ export async function changeLogin(opts) {
|
|
|
182
215
|
const gone = await onServer(server, opts.exec, session => send(session, kind === 'github' ? githubLogoutScript() : claudeLogoutScript()));
|
|
183
216
|
after = gone.ok ? kept => void delete kept[kind] : failed(gone.error);
|
|
184
217
|
}
|
|
218
|
+
else if (kind === 'github' && opts.own) {
|
|
219
|
+
// The wait for the person is cut when this process is told to stop: a second press asks the server anew.
|
|
220
|
+
const shown = (code) => changeServer(env, address, kept => void (mine(kept) && Object.assign(kept.github, { asking: true, code })));
|
|
221
|
+
const given = await onServer(server, opts.exec, session => askGithub(session, shown), opts.signal);
|
|
222
|
+
after = kept => noteGithub(kept, given);
|
|
223
|
+
}
|
|
185
224
|
else if (kind === 'github') {
|
|
186
225
|
const given = await onServer(server, opts.exec, session => giveGithub(session, opts.exec));
|
|
187
226
|
after = kept => noteGithub(kept, given);
|
|
@@ -197,7 +236,7 @@ export async function changeLogin(opts) {
|
|
|
197
236
|
}
|
|
198
237
|
}
|
|
199
238
|
finally {
|
|
200
|
-
|
|
239
|
+
await beating.stop();
|
|
201
240
|
// One that was started over is another process's by now: nothing of it is this one's to write.
|
|
202
241
|
await changeServer(env, address, kept => void (mine(kept) && after(kept))).catch(() => { });
|
|
203
242
|
}
|
package/dist/logins.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logins.js","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"logins.js","sourceRoot":"","sources":["../src/logins.ts"],"names":[],"mappings":"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"}
|
package/dist/steps.d.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* `root` is only who installs. What runs afterwards runs as the server's own user `openagent`:
|
|
7
7
|
* the programs are root's, so an agent that works there cannot change OpenAgent itself.
|
|
8
8
|
*/
|
|
9
|
-
export declare const STEP_IDS: readonly ['login', 'user', 'tools', 'openagent', 'agent', 'service', 'door'];
|
|
9
|
+
export declare const STEP_IDS: readonly ['login', 'user', 'tools', 'name', 'openagent', 'agent', 'service', 'door'];
|
|
10
10
|
export type StepId = (typeof STEP_IDS)[number];
|
|
11
11
|
/** What a script is written for. */
|
|
12
12
|
export interface Facts {
|
|
@@ -14,6 +14,10 @@ export interface Facts {
|
|
|
14
14
|
address: string;
|
|
15
15
|
/** The OpenAgent the server gets: the one that runs on this computer. */
|
|
16
16
|
version: string;
|
|
17
|
+
/** This computer's own name in git, when it has one. */
|
|
18
|
+
name?: string;
|
|
19
|
+
/** This computer's own email in git, when it has one. */
|
|
20
|
+
email?: string;
|
|
17
21
|
}
|
|
18
22
|
export interface StepDef {
|
|
19
23
|
id: StepId;
|
|
@@ -30,8 +34,13 @@ export declare const SERVER_USER = "openagent";
|
|
|
30
34
|
export declare const CLAUDE_FILE = "/etc/openagent/claude.env";
|
|
31
35
|
/** `value` as one word of a shell script, whatever it holds. */
|
|
32
36
|
export declare function quoted(value: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* What the service says to the OpenAgent it starts: this computer is a server one was installed
|
|
39
|
+
* on. Servers are connected from a person's own computer, so a server's own page offers none.
|
|
40
|
+
*/
|
|
41
|
+
export declare const SERVER_MARK = "OPENAGENT_SERVER";
|
|
33
42
|
/** What the service file holds. `KillMode=process`: a run is a process of its own and goes on when OpenAgent starts again, as on a laptop. */
|
|
34
|
-
export declare const SERVICE_UNIT = "[Unit]\nDescription=OpenAgent\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nUser=openagent\nWorkingDirectory=/home/openagent\nEnvironment=PATH=/home/openagent/.local/bin:/opt/openagent/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nEnvironmentFile=-/etc/openagent/claude.env\nExecStart=/opt/openagent/node/bin/openagent\nRestart=always\nRestartSec=5\nKillMode=process\nAmbientCapabilities=CAP_NET_BIND_SERVICE\n\n[Install]\nWantedBy=multi-user.target";
|
|
43
|
+
export declare const SERVICE_UNIT = "[Unit]\nDescription=OpenAgent\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nUser=openagent\nWorkingDirectory=/home/openagent\nEnvironment=PATH=/home/openagent/.local/bin:/opt/openagent/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nEnvironment=OPENAGENT_SERVER=1\nEnvironmentFile=-/etc/openagent/claude.env\nExecStart=/opt/openagent/node/bin/openagent\nRestart=always\nRestartSec=5\nKillMode=process\nAmbientCapabilities=CAP_NET_BIND_SERVICE\n\n[Install]\nWantedBy=multi-user.target";
|
|
35
44
|
export declare const STEPS: readonly StepDef[];
|
|
36
45
|
/** The script that asks the server's door for a link a new machine gets in with. Run as the server's own user. */
|
|
37
46
|
export declare function linkScript(): string;
|
|
@@ -50,6 +59,21 @@ export declare const LOGIN_TIMEOUT_MS: number;
|
|
|
50
59
|
* it is on no command line, and no program the script starts finds it among what it was given.
|
|
51
60
|
*/
|
|
52
61
|
export declare function githubLoginScript(login: string): LoginScript;
|
|
62
|
+
/** How long a person has to type the code at GitHub: GitHub's own limit is fifteen minutes. */
|
|
63
|
+
export declare const GITHUB_CODE_TIMEOUT_MS: number;
|
|
64
|
+
/**
|
|
65
|
+
* Have the server ask GitHub for a login of its own: its `gh` is started and left waiting, and
|
|
66
|
+
* GitHub answers with a short code that a person types at github.com/login/device. The script
|
|
67
|
+
* prints `<process> <file> <code>` and ends; {@link githubWaitScript} sees the rest. One that
|
|
68
|
+
* still waits from an earlier press is ended first. The login the server had goes, as with a
|
|
69
|
+
* copy: the server has one GitHub login, the last one asked for.
|
|
70
|
+
*/
|
|
71
|
+
export declare function githubCodeScript(): LoginScript;
|
|
72
|
+
/**
|
|
73
|
+
* Wait until the server's `gh` has its answer from GitHub, for the code {@link githubCodeScript}
|
|
74
|
+
* printed, and say whose login it is. All of it or none, as with a copy.
|
|
75
|
+
*/
|
|
76
|
+
export declare function githubWaitScript(pid: string, log: string): LoginScript;
|
|
53
77
|
/** Take the GitHub login off the server. */
|
|
54
78
|
export declare function githubLogoutScript(): LoginScript;
|
|
55
79
|
/**
|
package/dist/steps.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,QAAQ,YAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"steps.d.ts","sourceRoot":"","sources":["../src/steps.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,eAAO,MAAM,QAAQ,YAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AAC5G,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAA;AAE9C,oCAAoC;AACpC,MAAM,WAAW,KAAK;IACpB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAA;IACf,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAA;IACf,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAA;IACV,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAA;IACb,EAAE,EAAE,MAAM,GAAG,WAAW,CAAA;IACxB,4FAA4F;IAC5F,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAA;CAC7B;AAED,iEAAiE;AACjE,eAAO,MAAM,WAAW,cAAc,CAAA;AAOtC,8LAA8L;AAC9L,eAAO,MAAM,WAAW,8BAA8B,CAAA;AAOtD,gEAAgE;AAChE,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5C;AAgDD;;;GAGG;AACH,eAAO,MAAM,WAAW,qBAAqB,CAAA;AAE7C,8IAA8I;AAC9I,eAAO,MAAM,YAAY,yhBAkBE,CAAA;AAE3B,eAAO,MAAM,KAAK,EAAE,SAAS,OAAO,EA+NnC,CAAA;AAED,kHAAkH;AAClH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,uFAAuF;AACvF,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,oGAAoG;AACpG,eAAO,MAAM,gBAAgB,QAAa,CAAA;AAM1C;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAoB5D;AAED,+FAA+F;AAC/F,eAAO,MAAM,sBAAsB,QAAc,CAAA;AAqBjD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,CAgC9C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW,CA8BtE;AAED,4CAA4C;AAC5C,wBAAgB,kBAAkB,IAAI,WAAW,CAahD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA8B5D;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,IAAI,WAAW,CAchD"}
|
package/dist/steps.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* `root` is only who installs. What runs afterwards runs as the server's own user `openagent`:
|
|
7
7
|
* the programs are root's, so an agent that works there cannot change OpenAgent itself.
|
|
8
8
|
*/
|
|
9
|
-
export const STEP_IDS = ['login', 'user', 'tools', 'openagent', 'agent', 'service', 'door'];
|
|
9
|
+
export const STEP_IDS = ['login', 'user', 'tools', 'name', 'openagent', 'agent', 'service', 'door'];
|
|
10
10
|
/** The server's user everything runs as once it is installed. */
|
|
11
11
|
export const SERVER_USER = 'openagent';
|
|
12
12
|
/** Where the install keeps what it brings: Node, and OpenAgent inside it. */
|
|
@@ -65,6 +65,11 @@ const STARTED = `
|
|
|
65
65
|
return 1
|
|
66
66
|
}`;
|
|
67
67
|
const NOT_STARTED = 'fail "OpenAgent did not start on this server."';
|
|
68
|
+
/**
|
|
69
|
+
* What the service says to the OpenAgent it starts: this computer is a server one was installed
|
|
70
|
+
* on. Servers are connected from a person's own computer, so a server's own page offers none.
|
|
71
|
+
*/
|
|
72
|
+
export const SERVER_MARK = 'OPENAGENT_SERVER';
|
|
68
73
|
/** What the service file holds. `KillMode=process`: a run is a process of its own and goes on when OpenAgent starts again, as on a laptop. */
|
|
69
74
|
export const SERVICE_UNIT = `[Unit]
|
|
70
75
|
Description=OpenAgent
|
|
@@ -75,6 +80,7 @@ Wants=network-online.target
|
|
|
75
80
|
User=${SERVER_USER}
|
|
76
81
|
WorkingDirectory=/home/${SERVER_USER}
|
|
77
82
|
Environment=PATH=/home/${SERVER_USER}/.local/bin:${ROOT}/node/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
83
|
+
Environment=${SERVER_MARK}=1
|
|
78
84
|
EnvironmentFile=-${CLAUDE_FILE}
|
|
79
85
|
ExecStart=${ROOT}/node/bin/openagent
|
|
80
86
|
Restart=always
|
|
@@ -175,6 +181,27 @@ export const STEPS = [
|
|
|
175
181
|
fi
|
|
176
182
|
browser || fail "Chrome was installed, and it does not start on this server."
|
|
177
183
|
fi
|
|
184
|
+
`),
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: 'name',
|
|
188
|
+
label: 'Your name and email for git',
|
|
189
|
+
as: 'openagent',
|
|
190
|
+
timeoutMs: 2 * MINUTE,
|
|
191
|
+
script: ({ name = '', email = '' }) => script('openagent', { NAME: name, EMAIL: email }, `
|
|
192
|
+
# A run's record and an agent's work are commits, and git makes none without a name and an email.
|
|
193
|
+
# Only what the server's git lacks is given: what someone set there stays. Nothing is written until both are sure.
|
|
194
|
+
# Asked outside every folder: what a project's own git says is that project's alone.
|
|
195
|
+
has() { [ -n "$(cd / && git config --get "$1" || true)" ]; }
|
|
196
|
+
none() {
|
|
197
|
+
fail "The server's git has no $1, and this computer's git has none to give: nothing an agent does there could be saved. Give this computer both, then try again:
|
|
198
|
+
git config --global user.name 'Your Name'
|
|
199
|
+
git config --global user.email 'you@example.com'"
|
|
200
|
+
}
|
|
201
|
+
has user.name || [ -n "$NAME" ] || none name
|
|
202
|
+
has user.email || [ -n "$EMAIL" ] || none email
|
|
203
|
+
has user.name || git config --global -- user.name "$NAME"
|
|
204
|
+
has user.email || git config --global -- user.email "$EMAIL"
|
|
178
205
|
`),
|
|
179
206
|
},
|
|
180
207
|
{
|
|
@@ -268,6 +295,7 @@ export function githubLoginScript(login) {
|
|
|
268
295
|
as: SERVER_USER,
|
|
269
296
|
script: script(SERVER_USER, { LOGIN: login }, `
|
|
270
297
|
${GH_OWN}
|
|
298
|
+
${GH_STOP_ASKING}
|
|
271
299
|
rm -f ${GH_FILE}
|
|
272
300
|
given() {
|
|
273
301
|
printf '%s\\n' "$LOGIN" | gh auth login --hostname github.com --git-protocol https --with-token &&
|
|
@@ -279,12 +307,98 @@ export function githubLoginScript(login) {
|
|
|
279
307
|
`),
|
|
280
308
|
};
|
|
281
309
|
}
|
|
310
|
+
/** How long a person has to type the code at GitHub: GitHub's own limit is fifteen minutes. */
|
|
311
|
+
export const GITHUB_CODE_TIMEOUT_MS = 16 * MINUTE;
|
|
312
|
+
/** Where the server's `gh` writes while it waits for the code to be typed, and the one that waits right now. */
|
|
313
|
+
const GH_ASKING = '"$HOME/.cache/openagent-github-login"';
|
|
314
|
+
/** Whether the process `$1` is a `gh` that asks GitHub for a login: a number kept in a file may be another process's by now. */
|
|
315
|
+
const GH_IS_ASKING = `asking() { ps -o args= -p "$1" 2>/dev/null | grep -q 'gh auth login'; }`;
|
|
316
|
+
/**
|
|
317
|
+
* End the server's `gh` that still waits for a code, when one does, and forget it: every script
|
|
318
|
+
* that changes the server's GitHub login starts with this, so a code from an earlier press brings
|
|
319
|
+
* nothing once the login was asked for anew, copied or taken off, and its wait changes nothing.
|
|
320
|
+
*/
|
|
321
|
+
const GH_STOP_ASKING = `${GH_IS_ASKING}
|
|
322
|
+
waiting=$(cat ${GH_ASKING}.pid 2>/dev/null || true)
|
|
323
|
+
case "$waiting" in
|
|
324
|
+
'' | *[!0-9]*) ;;
|
|
325
|
+
*) if asking "$waiting"; then kill "$waiting" 2>/dev/null || true; fi ;;
|
|
326
|
+
esac
|
|
327
|
+
rm -f ${GH_ASKING}.pid`;
|
|
328
|
+
/**
|
|
329
|
+
* Have the server ask GitHub for a login of its own: its `gh` is started and left waiting, and
|
|
330
|
+
* GitHub answers with a short code that a person types at github.com/login/device. The script
|
|
331
|
+
* prints `<process> <file> <code>` and ends; {@link githubWaitScript} sees the rest. One that
|
|
332
|
+
* still waits from an earlier press is ended first. The login the server had goes, as with a
|
|
333
|
+
* copy: the server has one GitHub login, the last one asked for.
|
|
334
|
+
*/
|
|
335
|
+
export function githubCodeScript() {
|
|
336
|
+
return {
|
|
337
|
+
as: SERVER_USER,
|
|
338
|
+
script: script(SERVER_USER, {}, `
|
|
339
|
+
${GH_OWN}
|
|
340
|
+
command -v gh >/dev/null || fail "gh is not on this server yet. Press Update on its row first."
|
|
341
|
+
mkdir -p "$HOME/.cache"
|
|
342
|
+
${GH_STOP_ASKING}
|
|
343
|
+
rm -f ${GH_FILE}
|
|
344
|
+
log=$(umask 077; mktemp ${GH_ASKING}.XXXXXX)
|
|
345
|
+
nohup setsid gh auth login --hostname github.com --git-protocol https --web >"$log" 2>&1 &
|
|
346
|
+
pid=$!
|
|
347
|
+
echo "$pid" > ${GH_ASKING}.pid
|
|
348
|
+
for _ in $(seq 1 150); do
|
|
349
|
+
grep -q 'one-time code' "$log" && break
|
|
350
|
+
asking "$pid" || break
|
|
351
|
+
sleep 0.2
|
|
352
|
+
done
|
|
353
|
+
code=$(grep -oE 'one-time code: [A-Z0-9]{4}-[A-Z0-9]{4}' "$log" | head -n 1 | awk '{print $NF}' || true)
|
|
354
|
+
if [ -z "$code" ]; then
|
|
355
|
+
kill "$pid" 2>/dev/null || true
|
|
356
|
+
tail -n 5 "$log" >&2
|
|
357
|
+
rm -f "$log" ${GH_ASKING}.pid
|
|
358
|
+
fail "GitHub gave the server no code."
|
|
359
|
+
fi
|
|
360
|
+
echo "$pid $log $code"
|
|
361
|
+
`),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Wait until the server's `gh` has its answer from GitHub, for the code {@link githubCodeScript}
|
|
366
|
+
* printed, and say whose login it is. All of it or none, as with a copy.
|
|
367
|
+
*/
|
|
368
|
+
export function githubWaitScript(pid, log) {
|
|
369
|
+
return {
|
|
370
|
+
as: SERVER_USER,
|
|
371
|
+
script: script(SERVER_USER, { PID: pid, LOG: log }, `
|
|
372
|
+
${GH_OWN}
|
|
373
|
+
${GH_IS_ASKING}
|
|
374
|
+
while asking "$PID"; do sleep 1; done
|
|
375
|
+
# Asked for anew, copied or taken off in the meantime: the server's login is that change's to say, and none of it is this wait's.
|
|
376
|
+
if [ "$(cat ${GH_ASKING}.pid 2>/dev/null || true)" != "$PID" ]; then
|
|
377
|
+
rm -f "$LOG"
|
|
378
|
+
fail "The login was asked for anew, or changed another way, before the code was typed."
|
|
379
|
+
fi
|
|
380
|
+
rm -f ${GH_ASKING}.pid
|
|
381
|
+
# The login the server had was taken off before GitHub was asked: one that is there now came from GitHub.
|
|
382
|
+
given() {
|
|
383
|
+
gh auth setup-git --hostname github.com &&
|
|
384
|
+
gh api --hostname github.com user --jq .login
|
|
385
|
+
}
|
|
386
|
+
if ! given; then
|
|
387
|
+
grep -v 'one-time code' "$LOG" | tail -n 3 >&2 || true
|
|
388
|
+
rm -f "$LOG" ${GH_FILE}
|
|
389
|
+
fail "No login came from GitHub: the code was not typed in time, or it was refused."
|
|
390
|
+
fi
|
|
391
|
+
rm -f "$LOG"
|
|
392
|
+
`),
|
|
393
|
+
};
|
|
394
|
+
}
|
|
282
395
|
/** Take the GitHub login off the server. */
|
|
283
396
|
export function githubLogoutScript() {
|
|
284
397
|
return {
|
|
285
398
|
as: SERVER_USER,
|
|
286
399
|
script: script(SERVER_USER, {}, `
|
|
287
400
|
${GH_OWN}
|
|
401
|
+
${GH_STOP_ASKING}
|
|
288
402
|
rm -f ${GH_FILE}
|
|
289
403
|
`),
|
|
290
404
|
};
|