@onepointfour-packs/flaredeck-agent 0.2.37 → 0.2.39

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 (102) hide show
  1. package/dist/agent.d.ts +42 -3
  2. package/dist/agent.js +84 -6
  3. package/dist/agent.js.map +1 -1
  4. package/dist/automode.js +43 -3
  5. package/dist/automode.js.map +1 -1
  6. package/dist/boards.d.ts +72 -0
  7. package/dist/boards.js +136 -0
  8. package/dist/boards.js.map +1 -0
  9. package/dist/branches.d.ts +12 -1
  10. package/dist/branches.js +13 -3
  11. package/dist/branches.js.map +1 -1
  12. package/dist/browser.d.ts +59 -0
  13. package/dist/browser.js +260 -26
  14. package/dist/browser.js.map +1 -1
  15. package/dist/config.d.ts +22 -0
  16. package/dist/config.js +37 -2
  17. package/dist/config.js.map +1 -1
  18. package/dist/credentials.d.ts +217 -0
  19. package/dist/credentials.js +332 -0
  20. package/dist/credentials.js.map +1 -0
  21. package/dist/engine-antigravity.js +2 -0
  22. package/dist/engine-antigravity.js.map +1 -1
  23. package/dist/engine-claude.js +14 -2
  24. package/dist/engine-claude.js.map +1 -1
  25. package/dist/engine.d.ts +19 -0
  26. package/dist/engine.js.map +1 -1
  27. package/dist/environment.d.ts +15 -3
  28. package/dist/environment.js +79 -9
  29. package/dist/environment.js.map +1 -1
  30. package/dist/envtools.d.ts +58 -0
  31. package/dist/envtools.js +151 -0
  32. package/dist/envtools.js.map +1 -0
  33. package/dist/flaredeck-proxy.d.ts +11 -1
  34. package/dist/flaredeck-proxy.js +27 -1
  35. package/dist/flaredeck-proxy.js.map +1 -1
  36. package/dist/flaredeck.d.ts +24 -0
  37. package/dist/flaredeck.js +20 -0
  38. package/dist/flaredeck.js.map +1 -1
  39. package/dist/github.d.ts +2 -0
  40. package/dist/github.js +4 -0
  41. package/dist/github.js.map +1 -1
  42. package/dist/githubauth.d.ts +11 -1
  43. package/dist/githubauth.js +82 -16
  44. package/dist/githubauth.js.map +1 -1
  45. package/dist/hydrate.d.ts +76 -0
  46. package/dist/hydrate.js +77 -0
  47. package/dist/hydrate.js.map +1 -0
  48. package/dist/limits.d.ts +184 -0
  49. package/dist/limits.js +251 -0
  50. package/dist/limits.js.map +1 -0
  51. package/dist/main.js +177 -33
  52. package/dist/main.js.map +1 -1
  53. package/dist/picker.d.ts +10 -0
  54. package/dist/picker.js +150 -0
  55. package/dist/picker.js.map +1 -0
  56. package/dist/preflight.d.ts +43 -0
  57. package/dist/preflight.js +133 -19
  58. package/dist/preflight.js.map +1 -1
  59. package/dist/repopicker.js +8 -96
  60. package/dist/repopicker.js.map +1 -1
  61. package/dist/runs.d.ts +19 -4
  62. package/dist/runs.js +74 -9
  63. package/dist/runs.js.map +1 -1
  64. package/dist/serve.d.ts +6 -0
  65. package/dist/serve.js +1152 -138
  66. package/dist/serve.js.map +1 -1
  67. package/dist/session.d.ts +51 -0
  68. package/dist/session.js +145 -0
  69. package/dist/session.js.map +1 -0
  70. package/dist/settle.d.ts +18 -0
  71. package/dist/settle.js +39 -0
  72. package/dist/settle.js.map +1 -0
  73. package/dist/signin.d.ts +47 -0
  74. package/dist/signin.js +331 -0
  75. package/dist/signin.js.map +1 -0
  76. package/dist/stream.d.ts +8 -0
  77. package/dist/stream.js +44 -3
  78. package/dist/stream.js.map +1 -1
  79. package/dist/subscriptions.d.ts +115 -0
  80. package/dist/subscriptions.js +140 -0
  81. package/dist/subscriptions.js.map +1 -0
  82. package/dist/team.js +7 -1
  83. package/dist/team.js.map +1 -1
  84. package/dist/tmux.d.ts +1 -0
  85. package/dist/tmux.js +47 -0
  86. package/dist/tmux.js.map +1 -0
  87. package/dist/ui.d.ts +13 -0
  88. package/dist/ui.js +7 -2
  89. package/dist/ui.js.map +1 -1
  90. package/dist/usage.d.ts +105 -0
  91. package/dist/usage.js +348 -0
  92. package/dist/usage.js.map +1 -0
  93. package/dist/wall.d.ts +35 -0
  94. package/dist/wall.js +94 -0
  95. package/dist/wall.js.map +1 -0
  96. package/dist/workspace.d.ts +15 -1
  97. package/dist/workspace.js +25 -1
  98. package/dist/workspace.js.map +1 -1
  99. package/dist/worktree.d.ts +19 -0
  100. package/dist/worktree.js +179 -4
  101. package/dist/worktree.js.map +1 -1
  102. package/package.json +1 -1
package/dist/browser.d.ts CHANGED
@@ -1,5 +1,33 @@
1
+ import { type SavedSession } from './session.js';
1
2
  import type { EnvContract } from './environment.js';
2
3
  export declare const BROWSER_TOOL_NAMES: string[];
4
+ /**
5
+ * Keep a session a person just signed in with, where the browser tools will find it: FlareDeck.
6
+ *
7
+ * Exported because the sign-in happens OUTSIDE a card — a person runs it when an agent asks —
8
+ * and it has to land under the same identity `open_page` reads. It is keyed centrally, by the
9
+ * HOST when the session is for a real site, so one sign-in serves every agent in the workspace
10
+ * that needs that site. The session is asked where it came from rather than the caller being made
11
+ * to say, which is why this needs no new argument.
12
+ *
13
+ * STILL SYNCHRONOUS, and that is now a compromise rather than a free win. The vault write is
14
+ * necessarily asynchronous, so this starts it and returns the id for the caller to print; if the
15
+ * write ultimately fails, nothing is saved anywhere, because there is no longer a local copy by
16
+ * design. The card then meets the sign-in wall again on its next look and the existing machinery
17
+ * asks for a fresh one — the same path an expired session takes, so the failure degrades into a
18
+ * case that is already handled rather than a new one.
19
+ *
20
+ * `rememberSignInNow` is the same thing awaited, for a caller that wants to report the outcome.
21
+ * Both of this function's callers (main.ts, serve.ts) belong to other work; switching them over
22
+ * is a one-line change each and would turn "Signed in." into the truth rather than a hope.
23
+ */
24
+ export declare function rememberSignIn(repo: string, part: string, session: SavedSession): string;
25
+ /** `rememberSignIn`, awaited: the credential id and whether it actually reached FlareDeck. */
26
+ export declare function rememberSignInNow(repo: string, part: string, session: SavedSession, onNote?: (t: string) => void): Promise<{
27
+ id: string;
28
+ ok: boolean;
29
+ message?: string;
30
+ }>;
3
31
  /** What this page is, independent of where it happens to be today. See the note on this module. */
4
32
  export declare function siteIdentity(repo: string, part: string): string;
5
33
  export type BrowserDeps = {
@@ -7,13 +35,44 @@ export type BrowserDeps = {
7
35
  repo: string;
8
36
  /** Addresses the environment reported, so the agent names a part rather than a port. */
9
37
  endpoints: () => Record<string, string>;
38
+ /**
39
+ * Deployed addresses the BOARD declared — the dev or UAT site, not production. A card is often
40
+ * about code that is already live, and an agent that can only see what it started locally
41
+ * cannot tell "my change is wrong" from "it was already like that".
42
+ */
43
+ sites?: () => Record<string, string>;
44
+ /** The part found to serve the app's page, when the harness could tell (see webPart). */
45
+ defaultPart?: () => string | undefined;
10
46
  /** Credentials the project published, so nobody types a password into a model. */
11
47
  contract: () => EnvContract | undefined;
12
48
  /** Where a screenshot should land so the agent can attach it to a card. */
13
49
  cwd: string;
14
50
  onNote: (text: string) => void;
15
51
  };
52
+ /**
53
+ * How every browser here is launched.
54
+ *
55
+ * `headless: true` on its own picks `chromium-headless-shell` whenever that build is present,
56
+ * and a Google sign-in cannot be completed in it — see installChromium. `channel: 'chromium'`
57
+ * asks for the full browser and still runs it with no window, which is the combination measured
58
+ * to work. Without this line the installer change below fixes nothing on any machine that
59
+ * already has the shell.
60
+ */
61
+ export declare const HEADLESS_FULL: {
62
+ readonly headless: true;
63
+ readonly channel: "chromium";
64
+ };
65
+ /**
66
+ * Make sure the browser is on this machine, once.
67
+ *
68
+ * Called at startup so the download happens while the agent is idle rather than in the middle of
69
+ * the first card that needs eyes — 186MB is a long pause to take with a card in hand. Memoised,
70
+ * because the lazy path still calls it: a card arriving mid-download must wait for the download
71
+ * in flight, not start a second one.
72
+ */
73
+ export declare function ensureBrowser(onNote?: (t: string) => void): Promise<boolean>;
16
74
  export declare function browserTools(deps: BrowserDeps): {
17
75
  server: unknown;
18
76
  toolNames: string[];
77
+ close: () => Promise<void>;
19
78
  };
package/dist/browser.js CHANGED
@@ -23,11 +23,15 @@
23
23
  * and hands, and remembers.
24
24
  */
25
25
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
26
+ import { captureSession, contextFor, restoreIndexedDb } from './session.js';
27
+ import { settle } from './settle.js';
28
+ import { signInWall, wallBrief } from './wall.js';
26
29
  import { dirname, join } from 'node:path';
27
30
  import { z } from 'zod';
28
31
  import { tool } from '@anthropic-ai/claude-agent-sdk';
29
32
  import { sdkServer } from './localmcp.js';
30
33
  import { configDir } from './config.js';
34
+ import { credentialsFor, getJson, putInsistently, sessionOrigin, siteCredentialId, } from './credentials.js';
31
35
  export const BROWSER_TOOL_NAMES = [
32
36
  'mcp__browser__open_page',
33
37
  'mcp__browser__look',
@@ -49,6 +53,35 @@ const memoryDir = () => {
49
53
  const safe = (s) => s.replace(/[^A-Za-z0-9._-]/g, '_');
50
54
  const memoryFile = (site) => join(memoryDir(), `${safe(site)}.json`);
51
55
  const sessionFile = (site) => join(memoryDir(), `${safe(site)}.session.json`);
56
+ /**
57
+ * Sessions live in the FlareDeck vault and nowhere else — not on this disk, not as a cache.
58
+ *
59
+ * That is the whole point of moving them: one sign-in by one person serves every agent in the
60
+ * workspace, and twenty machines each holding a copy of a credential is the situation being
61
+ * escaped rather than the design. It also makes revocation honest, since there is no stale copy
62
+ * anywhere to keep working after the fact. See credentials.ts.
63
+ */
64
+ const sessionStore = (repo, onNote = () => { }) => credentialsFor(repo, onNote);
65
+ /**
66
+ * The stored session, or an explanation.
67
+ *
68
+ * `{ ok: true, value: null }` and `{ ok: false }` must not be collapsed: no session means ask for
69
+ * a sign-in (the wall machinery does that), while a vault that could not be reached means stop
70
+ * and say so. There is nothing local to fall back to.
71
+ */
72
+ async function loadSession(repo, id, onNote) {
73
+ return getJson(sessionStore(repo, onNote), id);
74
+ }
75
+ /**
76
+ * Keep a captured session, with retries.
77
+ *
78
+ * It has nowhere else to go, so one network blip must not cost a person another trip through a
79
+ * sign-in form. If it is lost anyway, the card hits the wall again on its next look and the
80
+ * existing machinery asks for a fresh one — the same path an expired session takes.
81
+ */
82
+ async function saveSession(repo, id, s, onNote = () => { }) {
83
+ return putInsistently(sessionStore(repo, onNote), id, Buffer.from(JSON.stringify(s), 'utf8'), { kind: 'browser-session', label: id.replace(/^session:(host|repo):/, '') }, onNote);
84
+ }
52
85
  function loadMemory(site) {
53
86
  try {
54
87
  return JSON.parse(readFileSync(memoryFile(site), 'utf8'));
@@ -63,14 +96,101 @@ function saveMemory(site, m) {
63
96
  }
64
97
  catch { /* not worth failing for */ }
65
98
  }
99
+ /**
100
+ * Keep a session a person just signed in with, where the browser tools will find it: FlareDeck.
101
+ *
102
+ * Exported because the sign-in happens OUTSIDE a card — a person runs it when an agent asks —
103
+ * and it has to land under the same identity `open_page` reads. It is keyed centrally, by the
104
+ * HOST when the session is for a real site, so one sign-in serves every agent in the workspace
105
+ * that needs that site. The session is asked where it came from rather than the caller being made
106
+ * to say, which is why this needs no new argument.
107
+ *
108
+ * STILL SYNCHRONOUS, and that is now a compromise rather than a free win. The vault write is
109
+ * necessarily asynchronous, so this starts it and returns the id for the caller to print; if the
110
+ * write ultimately fails, nothing is saved anywhere, because there is no longer a local copy by
111
+ * design. The card then meets the sign-in wall again on its next look and the existing machinery
112
+ * asks for a fresh one — the same path an expired session takes, so the failure degrades into a
113
+ * case that is already handled rather than a new one.
114
+ *
115
+ * `rememberSignInNow` is the same thing awaited, for a caller that wants to report the outcome.
116
+ * Both of this function's callers (main.ts, serve.ts) belong to other work; switching them over
117
+ * is a one-line change each and would turn "Signed in." into the truth rather than a hope.
118
+ */
119
+ export function rememberSignIn(repo, part, session) {
120
+ const id = siteCredentialId(repo, part, sessionOrigin(session));
121
+ void rememberSignInNow(repo, part, session);
122
+ return id;
123
+ }
124
+ /** `rememberSignIn`, awaited: the credential id and whether it actually reached FlareDeck. */
125
+ export async function rememberSignInNow(repo, part, session, onNote = () => { }) {
126
+ const id = siteCredentialId(repo, part, sessionOrigin(session));
127
+ const r = await saveSession(repo, id, session, onNote);
128
+ if (!r.ok) {
129
+ onNote(`the sign-in could NOT be saved to FlareDeck (${r.message}). Nothing was kept on this ` +
130
+ `machine — credentials live only in FlareDeck — so a sign-in will be requested again.`);
131
+ }
132
+ return { id, ...r };
133
+ }
66
134
  /** What this page is, independent of where it happens to be today. See the note on this module. */
67
135
  export function siteIdentity(repo, part) {
68
136
  return `${repo.split('/').pop() || repo}/${part || 'ui'}`;
69
137
  }
138
+ /**
139
+ * How every browser here is launched.
140
+ *
141
+ * `headless: true` on its own picks `chromium-headless-shell` whenever that build is present,
142
+ * and a Google sign-in cannot be completed in it — see installChromium. `channel: 'chromium'`
143
+ * asks for the full browser and still runs it with no window, which is the combination measured
144
+ * to work. Without this line the installer change below fixes nothing on any machine that
145
+ * already has the shell.
146
+ */
147
+ export const HEADLESS_FULL = { headless: true, channel: 'chromium' };
70
148
  /**
71
149
  * Fetch the browser Playwright expects. Once per machine, and never asked of the agent: an
72
150
  * instruction to run an installer is setup, and the point of this is that there is none.
151
+ *
152
+ * The FULL chromium, not `chromium-headless-shell`. The shell is smaller and reads pages
153
+ * perfectly well, and it was what this installed — but it is a stripped build, and a Google
154
+ * sign-in cannot be completed in it: the opener-to-popup channel Firebase needs does not
155
+ * survive, so the login runs to the end and then fails with "the popup has been closed by the
156
+ * user", which is false. Measured on 2026-10-09 across three configurations:
157
+ *
158
+ * full chromium, headed sign-in completed
159
+ * full chromium, HEADLESS sign-in completed
160
+ * headless shell, headless auth/popup-closed-by-user
161
+ *
162
+ * So headless is fine and the shell is not. One build for everything, because two means a
163
+ * machine where ordinary page reading works and signing in mysteriously does not. It also means
164
+ * no Xvfb and no virtual display anywhere: the full build runs headless like any other.
73
165
  */
166
+ let installing = null;
167
+ /**
168
+ * Make sure the browser is on this machine, once.
169
+ *
170
+ * Called at startup so the download happens while the agent is idle rather than in the middle of
171
+ * the first card that needs eyes — 186MB is a long pause to take with a card in hand. Memoised,
172
+ * because the lazy path still calls it: a card arriving mid-download must wait for the download
173
+ * in flight, not start a second one.
174
+ */
175
+ export function ensureBrowser(onNote = () => { }) {
176
+ if (!installing) {
177
+ installing = (async () => {
178
+ const { chromium } = await import('playwright-core');
179
+ // Already there: nothing to say and nothing to fetch.
180
+ try {
181
+ const b = await chromium.launch(HEADLESS_FULL);
182
+ await b.close();
183
+ return true;
184
+ }
185
+ catch { /* fetch it */ }
186
+ onNote('fetching Chromium (first use on this machine, ~186MB)');
187
+ const ok = await installChromium();
188
+ onNote(ok ? 'Chromium ready' : 'could not fetch Chromium — a card needing a browser will say so');
189
+ return ok;
190
+ })();
191
+ }
192
+ return installing;
193
+ }
74
194
  async function installChromium() {
75
195
  const { execFile } = await import('node:child_process');
76
196
  const { fileURLToPath } = await import('node:url');
@@ -78,10 +198,52 @@ async function installChromium() {
78
198
  if (!existsSync(cli))
79
199
  return false;
80
200
  return new Promise((resolve) => {
81
- execFile(process.execPath, [cli, 'install', 'chromium-headless-shell'], { timeout: 10 * 60_000 }, (err) => resolve(!err));
201
+ execFile(process.execPath, [cli, 'install', 'chromium'], { timeout: 15 * 60_000 }, (err) => resolve(!err));
202
+ });
203
+ }
204
+ /**
205
+ * Somewhere this browser may go.
206
+ *
207
+ * An agent that has just written and started its own start script knows a URL the harness does
208
+ * not, so refusing everything but a named part leaves it unable to look at what it just brought
209
+ * up. Allowing anything, though, would make a project tool into a web browser — and a page is
210
+ * input: whatever is written on it arrives in the agent's turn. So: this machine, a private
211
+ * network, or a site the board itself named. Nothing else.
212
+ */
213
+ function addressable(url, declared) {
214
+ let u;
215
+ try {
216
+ u = new URL(url);
217
+ }
218
+ catch {
219
+ return `"${url}" is not a URL.`;
220
+ }
221
+ if (!/^https?:$/.test(u.protocol))
222
+ return `Only http and https. "${u.protocol}" is neither.`;
223
+ const h = u.hostname.toLowerCase();
224
+ const local = h === 'localhost' || h.endsWith('.localhost') || h === '::1' || h === '[::1]' ||
225
+ /^127\./.test(h) || /^10\./.test(h) || /^192\.168\./.test(h) ||
226
+ /^172\.(1[6-9]|2\d|3[01])\./.test(h);
227
+ if (local)
228
+ return null;
229
+ const named = declared.some((d) => {
230
+ try {
231
+ return new URL(d).origin === u.origin;
232
+ }
233
+ catch {
234
+ return false;
235
+ }
82
236
  });
237
+ if (named)
238
+ return null;
239
+ return (`${u.origin} is not this project's. A URL is allowed when it is on this machine or private ` +
240
+ `network, or when the board declared it as a site. Open a part by name instead` +
241
+ (declared.length ? `, or one of the sites the board named: ${declared.join(', ')}.` : '.'));
83
242
  }
84
243
  export function browserTools(deps) {
244
+ // `site` names the project's page and keys the local notes; `credential` is the central
245
+ // identity the SESSION is stored under, which is the host for a real site. They differ on
246
+ // purpose — see siteCredentialId in credentials.ts.
85
247
  let live = null;
86
248
  const closeQuietly = async () => {
87
249
  try {
@@ -116,28 +278,51 @@ export function browserTools(deps) {
116
278
  name: 'browser',
117
279
  version: '1.0.0',
118
280
  tools: [
119
- tool('open_page', 'Open a page in a real browser against THIS card\'s own environment. Name a part the ' +
120
- 'environment reported (for example "ui") rather than a port — several worktrees run at ' +
121
- 'once and the ports differ. Returns what is on the page, and anything earlier sessions ' +
122
- 'learned about this project.', {
123
- part: z.string().optional().describe('Which part of the environment, e.g. "ui". Defaults to the first one.'),
281
+ tool('open_page', 'Open a page in a real browser. Name a part THIS card\'s environment reported (for ' +
282
+ 'example "ui") rather than a port — several worktrees run at once and the ports differ. ' +
283
+ 'A deployed site the board declared can be named the same way. Returns what is on the ' +
284
+ 'page, and anything earlier sessions learned about this project.', {
285
+ part: z.string().optional().describe('Which part, e.g. "ui". Defaults to the app\'s own page when the harness found it, else the first one.'),
124
286
  path: z.string().optional().describe('A path on that part, e.g. "/admin/learning".'),
287
+ url: z.string().optional().describe('A full address, for something you started yourself that no part names yet. ' +
288
+ 'This machine, a private network, or a site the board declared.'),
125
289
  }, async (args) => {
126
- const { part, path } = args;
290
+ const { part, path, url: asked } = args;
127
291
  const ends = deps.endpoints();
128
- const name = part || (ends['ui'] ? 'ui' : Object.keys(ends)[0] ?? '');
129
- const base = ends[name];
292
+ const declared = deps.sites?.() ?? {};
293
+ // Both sources answer to a name. A part the environment started wins a name collision,
294
+ // because that is this card's own code and the deployed one is not.
295
+ const all = { ...declared, ...ends };
296
+ let name = part || deps.defaultPart?.() || (all['ui'] ? 'ui' : Object.keys(all)[0] ?? '');
297
+ let base = all[name];
298
+ if (asked) {
299
+ const no = addressable(asked, Object.values(declared));
300
+ if (no)
301
+ return say(no, true);
302
+ base = asked;
303
+ // Named parts keep their saved session; a bare URL is identified by its host, so
304
+ // coming back to the same place twice is still the same place.
305
+ if (!part)
306
+ name = new URL(asked).host;
307
+ }
130
308
  if (!base) {
131
- return say(`This environment reported no part called "${name}". It has: ` +
132
- `${Object.keys(ends).join(', ') || '(nothing — the project is not running)'}.`, true);
309
+ const have = Object.entries(all).map(([k, v]) => ` · ${k}: ${v}`).join('\n');
310
+ return say(have
311
+ ? `Nothing here is called "${name}". What there is:\n${have}`
312
+ : `Nothing is running that this card knows about, and the board declared no site.\n\n` +
313
+ `If you started something yourself, pass its \`url\` — this machine or a private ` +
314
+ `network is allowed. If this project has no way to come up at all, that is worth ` +
315
+ `fixing once: a \`${'.flaredeck/start.sh'}\` that brings it up and prints ` +
316
+ `\`name=url\` lines gives every future card on this board a browser.`, true);
133
317
  }
134
318
  const site = siteIdentity(deps.repo, name);
319
+ const credential = siteCredentialId(deps.repo, name, base);
135
320
  const memory = loadMemory(site);
136
321
  await closeQuietly();
137
322
  const { chromium } = await import('playwright-core');
138
323
  let browser;
139
324
  try {
140
- browser = await chromium.launch({ headless: true });
325
+ browser = await chromium.launch(HEADLESS_FULL);
141
326
  }
142
327
  catch (first) {
143
328
  // No browser on this machine yet, or Playwright moved to a newer build than the one
@@ -146,22 +331,35 @@ export function browserTools(deps) {
146
331
  if (!/executable doesn't exist|please run.*install/i.test(String(first))) {
147
332
  return say(`Could not start a browser: ${first instanceof Error ? first.message : String(first)}`, true);
148
333
  }
149
- deps.onNote('browser: fetching Chromium (first use on this machine)');
150
- const ok = await installChromium();
334
+ const ok = await ensureBrowser((t) => deps.onNote(`browser: ${t}`));
151
335
  if (!ok) {
152
336
  return say('This machine has no browser and it could not be fetched. Say so on the card — ' +
153
337
  'do not try to install anything yourself.', true);
154
338
  }
155
339
  try {
156
- browser = await chromium.launch({ headless: true });
340
+ browser = await chromium.launch(HEADLESS_FULL);
157
341
  }
158
342
  catch (e) {
159
343
  return say(`Browser still will not start: ${e instanceof Error ? e.message : String(e)}`, true);
160
344
  }
161
345
  }
162
- // A session saved by an earlier card, so this one does not sign in again.
163
- const saved = existsSync(sessionFile(site)) ? sessionFile(site) : undefined;
164
- const context = await browser.newContext(saved ? { storageState: saved } : {});
346
+ // A session signed in by an earlier card, on this machine or on any OTHER agent's — it
347
+ // comes from FlareDeck, so one sign-in serves the whole workspace. Read whole, because
348
+ // being signed in is not only cookies: see session.ts.
349
+ const got = await loadSession(deps.repo, credential, (t) => deps.onNote(`browser: ${t}`));
350
+ if (!got.ok) {
351
+ // Sessions are in FlareDeck and nowhere else, so there is nothing to fall back to and
352
+ // nothing to be gained by opening the page anyway: it would come up signed out, the
353
+ // sign-in wall would be detected, and the request for a sign-in would then fail for
354
+ // the same reason. Stopping here says the true thing once.
355
+ await closeQuietly();
356
+ return say(`FlareDeck could not be reached, so the sign-in for this site is not available: ${got.why}\n\n` +
357
+ `Sign-in sessions are kept in FlareDeck and nowhere else, so there is no local copy ` +
358
+ `to fall back to. Nothing is wrong with the card — say so on it and try again once ` +
359
+ `FlareDeck is reachable.`, true);
360
+ }
361
+ const stored = got.value;
362
+ const context = await contextFor(browser, stored);
165
363
  const page = await context.newPage();
166
364
  const url = `${base.replace(/\/+$/, '')}${path ? (path.startsWith('/') ? path : `/${path}`) : ''}`;
167
365
  try {
@@ -171,19 +369,43 @@ export function browserTools(deps) {
171
369
  await closeQuietly();
172
370
  return say(`Could not open ${url}: ${e instanceof Error ? e.message : String(e)}`, true);
173
371
  }
174
- live = { browser, context, page, site };
175
- deps.onNote(`browser: ${url}${saved ? ' (signed in from an earlier session)' : ''}`);
372
+ // IndexedDB can only be written once the databases exist, so it goes back AFTER the
373
+ // first navigation, and the reload inside is what lets the app read it on init.
374
+ // Without this a Firebase app restores silently as nobody — measured, not assumed.
375
+ if (await restoreIndexedDb(page, stored)) {
376
+ await page.waitForLoadState('domcontentloaded', { timeout: 10_000 }).catch(() => { });
377
+ }
378
+ await settle(page);
379
+ live = { browser, context, page, site, credential };
380
+ deps.onNote(`browser: ${url}${stored ? ' (signed in from an earlier session)' : ''}`);
176
381
  const creds = Object.entries(deps.contract()?.credentials ?? {})
177
382
  .map(([who, v]) => typeof v === 'string' ? ` · ${who}: ${v}` : ` · ${who}: ${v.username ?? ''} / ${v.password ?? ''}`)
178
383
  .join('\n');
179
384
  const learned = Object.entries(memory.recipes)
180
385
  .map(([about, how]) => ` · ${about}: ${how}`).join('\n');
181
- return say(`Open at ${url}${saved ? ', already signed in from an earlier session' : ''}.\n\n` +
386
+ // A login page looks, from inside a snapshot, exactly like "the thing I was sent to
387
+ // find is not here". Saying so outright is what stops the next twenty minutes being
388
+ // spent on it. Leads the answer, because it changes what the whole turn should do.
389
+ const wall = await signInWall(page);
390
+ if (wall.wall) {
391
+ deps.onNote(`browser: ${url} is a sign-in wall (${wall.how})`);
392
+ return say(`${wallBrief(wall, url)}\n\nWhat is on it:\n${await describe(page)}`);
393
+ }
394
+ return say(`Open at ${url}${stored ? ', already signed in from an earlier session' : ''}.\n\n` +
182
395
  `${await describe(page)}\n` +
183
396
  (learned ? `\nWhat earlier sessions learned about ${site}:\n${learned}\n` : '') +
184
- (!saved && creds ? `\nSign-ins this project published:\n${creds}\n` : ''));
397
+ (!stored && creds ? `\nSign-ins this project published:\n${creds}\n` : ''));
398
+ }),
399
+ tool('look', 'What is on the page now. Use after an action to see what changed.', {}, async () => {
400
+ const { page } = needPage();
401
+ await settle(page);
402
+ // A session can die mid-turn as easily as before it — a revoked token, an expiry, a
403
+ // sign-out elsewhere. An agent that walked into a wall between two clicks would
404
+ // otherwise carry on reading a login form as though it were the app.
405
+ const wall = await signInWall(page);
406
+ const seen = await describe(page);
407
+ return say(wall.wall ? `${wallBrief(wall, page.url())}\n\nWhat is on it:\n${seen}` : seen);
185
408
  }),
186
- tool('look', 'What is on the page now. Use after an action to see what changed.', {}, async () => say(await describe(needPage().page))),
187
409
  tool('click', 'Click something by what it IS, as the page describes it — a role and its name, taken ' +
188
410
  'from the snapshot you were given. Never a CSS selector.', {
189
411
  role: z.string().describe('The role, e.g. "button", "link", "checkbox".'),
@@ -199,6 +421,8 @@ export function browserTools(deps) {
199
421
  `What is actually on the page:\n${await describe(page)}`, true);
200
422
  }
201
423
  await page.waitForLoadState('domcontentloaded', { timeout: 10_000 }).catch(() => { });
424
+ // What a click DID is usually drawn after the navigation settles, not with it.
425
+ await settle(page);
202
426
  return say(`Clicked ${role} "${name}".\n\n${await describe(page)}`);
203
427
  }),
204
428
  tool('fill', 'Type into a field, named the way the page describes it.', {
@@ -244,10 +468,15 @@ export function browserTools(deps) {
244
468
  const memory = loadMemory(site);
245
469
  memory.recipes[about.trim().toLowerCase()] = how.trim();
246
470
  saveMemory(site, memory);
247
- // Signed in once, signed in for every card after this.
471
+ // Signed in once, signed in for every card after this — and, since the session goes to
472
+ // FlareDeck rather than this disk, for every other agent in the workspace that needs
473
+ // the same site. Awaited so a failure is reported rather than lost: there is no local
474
+ // copy behind it any more.
248
475
  if (live) {
249
476
  try {
250
- await live.context.storageState({ path: sessionFile(site) });
477
+ const kept = await saveSession(deps.repo, live.credential, await captureSession(live.context, live.page), (t) => deps.onNote(`browser: ${t}`));
478
+ if (!kept.ok)
479
+ deps.onNote(`browser: the signed-in session was NOT saved (${kept.message})`);
251
480
  }
252
481
  catch { /* best effort */ }
253
482
  }
@@ -256,6 +485,11 @@ export function browserTools(deps) {
256
485
  }),
257
486
  ],
258
487
  });
259
- return { server, toolNames: BROWSER_TOOL_NAMES };
488
+ // A turn's browser must go when the turn does. Nothing used to close it: a new tool set is
489
+ // built per turn, so the last one's Chromium became unreachable AND still running — one leaked
490
+ // browser tree for every turn that looked at anything, on a daemon that runs for days. This is
491
+ // the same shape as the start scripts nobody took down, which left a build box at 106 node
492
+ // processes and 276 MB free.
493
+ return { server, toolNames: BROWSER_TOOL_NAMES, close: closeQuietly };
260
494
  }
261
495
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -19,6 +19,22 @@ export type Config = {
19
19
  * folder grants nothing — and empty or absent means every repo found there.
20
20
  */
21
21
  repos?: string[];
22
+ /**
23
+ * The boards this agent works, ticked at login. Empty or absent means every board the account
24
+ * can see, which is what every install did before this existed.
25
+ *
26
+ * An agent was only ever bound to a TENANT, so one signed in as a person — or as an account
27
+ * with broad access — woke for every card and every message on every board in it. The cost is
28
+ * not the noise: it is a turn. A test agent spent 23k of context deciding that a two-week-old
29
+ * message on another team's board needed no reply. Scope is cheaper than judgement.
30
+ *
31
+ * The name is kept beside the key so `whoami` can say which boards without a round trip, and
32
+ * so a board that is renamed still reads sensibly until the next login.
33
+ */
34
+ boards?: {
35
+ key: string;
36
+ name: string;
37
+ }[];
22
38
  /**
23
39
  * Git-ignored files a project needs in order to RUN, carried into each card's worktree.
24
40
  *
@@ -133,8 +149,14 @@ export declare const configDir: () => string;
133
149
  export declare const configPath: (repo: string) => string;
134
150
  export declare function loadConfig(repo?: string): Config | null;
135
151
  export declare function saveConfig(config: Config): string;
152
+ type GitHubLogin = NonNullable<Config['github']>;
153
+ export declare function loadGitHub(): GitHubLogin | null;
154
+ export declare function saveGitHub(login: GitHubLogin): void;
155
+ /** Forget the machine's GitHub login, so the next one is a fresh sign-in rather than a reuse. */
156
+ export declare function forgetGitHub(): void;
136
157
  export declare function loadMe(): Tokens | null;
137
158
  export declare function saveMe(tokens: Tokens): string;
138
159
  export declare function forgetConfig(repo: string): boolean;
139
160
  /** Config with defaults filled in — for commands that can run before `login` has written one. */
140
161
  export declare function configOrDefaults(repo?: string): Config;
162
+ export {};