@optima-chat/browser-cli 0.22.0 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +60 -36
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -116,6 +116,48 @@ var config = loadConfig();
116
116
  var BROWSER_API_URL = config.apiUrl;
117
117
  var AUTH = config.auth;
118
118
 
119
+ // src/session.ts
120
+ import { readFileSync as readFileSync2, writeFileSync, unlinkSync, existsSync as existsSync2, mkdirSync } from "fs";
121
+ import { join as join2 } from "path";
122
+ import { homedir as homedir2 } from "os";
123
+ var OPTIMA_DIR = join2(homedir2(), ".optima");
124
+ function conversationId() {
125
+ const raw = process.env.SESSION_ID;
126
+ return raw ? raw.replace(/[^A-Za-z0-9_-]/g, "_") : null;
127
+ }
128
+ function sessionFile() {
129
+ const conv = conversationId();
130
+ return join2(OPTIMA_DIR, conv ? `browser-session-id.${conv}` : "browser-session-id");
131
+ }
132
+ var _sessionOverride = null;
133
+ function setSessionOverride(id) {
134
+ _sessionOverride = id;
135
+ }
136
+ function saveSessionId(id) {
137
+ mkdirSync(OPTIMA_DIR, { recursive: true });
138
+ writeFileSync(sessionFile(), id, "utf-8");
139
+ }
140
+ function loadSessionId() {
141
+ if (_sessionOverride) {
142
+ return _sessionOverride;
143
+ }
144
+ const file = sessionFile();
145
+ if (!existsSync2(file)) {
146
+ throw new Error(
147
+ "No active browser session. Run 'browser-cli launch' first. (If the backend says you already have one, close it by id: browser-cli --session <id> close)"
148
+ );
149
+ }
150
+ return readFileSync2(file, "utf-8").trim();
151
+ }
152
+ function clearSessionId(onlyIfEquals) {
153
+ const file = sessionFile();
154
+ if (!existsSync2(file)) return;
155
+ if (onlyIfEquals !== void 0 && readFileSync2(file, "utf-8").trim() !== onlyIfEquals) {
156
+ return;
157
+ }
158
+ unlinkSync(file);
159
+ }
160
+
119
161
  // src/api.ts
120
162
  var BrowserAPIError = class extends Error {
121
163
  constructor(statusCode, errorCode, message) {
@@ -153,6 +195,10 @@ function withAuthContext(err) {
153
195
  err.message += `\uFF08\u51ED\u8BC1\u6765\u6E90 ${AUTH.source}${exp}\uFF0Cfp=${fp}\uFF09`;
154
196
  return err;
155
197
  }
198
+ function conversationHeader() {
199
+ const conv = conversationId();
200
+ return conv ? { "X-Optima-Conversation": conv } : {};
201
+ }
156
202
  async function request(path, options = {}) {
157
203
  const url = `${BROWSER_API_URL}${path}`;
158
204
  const auth = authHeader();
@@ -163,6 +209,7 @@ async function request(path, options = {}) {
163
209
  headers: {
164
210
  "Content-Type": "application/json",
165
211
  ...auth,
212
+ ...conversationHeader(),
166
213
  ...options.headers
167
214
  }
168
215
  });
@@ -195,7 +242,7 @@ async function requestBinary(path) {
195
242
  let response;
196
243
  try {
197
244
  response = await fetch(url, {
198
- headers: auth
245
+ headers: { ...auth, ...conversationHeader() }
199
246
  });
200
247
  } catch {
201
248
  throw new Error(
@@ -411,39 +458,6 @@ var BrowserAPI = class {
411
458
  };
412
459
  var api = new BrowserAPI();
413
460
 
414
- // src/session.ts
415
- import { readFileSync as readFileSync2, writeFileSync, unlinkSync, existsSync as existsSync2, mkdirSync } from "fs";
416
- import { join as join2 } from "path";
417
- import { homedir as homedir2 } from "os";
418
- var OPTIMA_DIR = join2(homedir2(), ".optima");
419
- var SESSION_FILE = join2(OPTIMA_DIR, "browser-session-id");
420
- var _sessionOverride = null;
421
- function setSessionOverride(id) {
422
- _sessionOverride = id;
423
- }
424
- function saveSessionId(id) {
425
- mkdirSync(OPTIMA_DIR, { recursive: true });
426
- writeFileSync(SESSION_FILE, id, "utf-8");
427
- }
428
- function loadSessionId() {
429
- if (_sessionOverride) {
430
- return _sessionOverride;
431
- }
432
- if (!existsSync2(SESSION_FILE)) {
433
- throw new Error(
434
- "No active browser session. Run 'browser-cli launch' first. (If the backend says you already have one, close it by id: browser-cli --session <id> close)"
435
- );
436
- }
437
- return readFileSync2(SESSION_FILE, "utf-8").trim();
438
- }
439
- function clearSessionId(onlyIfEquals) {
440
- if (!existsSync2(SESSION_FILE)) return;
441
- if (onlyIfEquals !== void 0 && readFileSync2(SESSION_FILE, "utf-8").trim() !== onlyIfEquals) {
442
- return;
443
- }
444
- unlinkSync(SESSION_FILE);
445
- }
446
-
447
461
  // src/formatter.ts
448
462
  var URL_STALE_WARNING = "\u26A0 URL/title may be stale: the live page probe failed, values above are cached. Verify with a screenshot before concluding a navigation failed.";
449
463
  function formatPageState(state) {
@@ -819,8 +833,18 @@ function parseWaitTimeout(raw) {
819
833
  return n;
820
834
  }
821
835
  function stillRunningMessage(task, waitedS, nowMs = Date.now()) {
822
- const started = task.created_at ? Date.parse(task.created_at) : Number.NaN;
823
- const elapsed = Number.isFinite(started) ? `running for ${Math.max(0, Math.round((nowMs - started) / 1e3))}s` : `waited ${waitedS}s`;
836
+ const secondsSince = (iso) => {
837
+ const t = iso ? Date.parse(iso) : Number.NaN;
838
+ return Number.isFinite(t) ? Math.max(0, Math.round((nowMs - t) / 1e3)) : null;
839
+ };
840
+ const created = secondsSince(task.created_at);
841
+ let elapsed;
842
+ if (task.queue?.queued) {
843
+ elapsed = `queued, ${task.queue.ahead} task(s) of this user ahead` + (created !== null ? `, created ${created}s ago` : "");
844
+ } else {
845
+ const ran = secondsSince(task.queue?.started_at) ?? created;
846
+ elapsed = ran !== null ? `running for ${ran}s` : `waited ${waitedS}s`;
847
+ }
824
848
  const step = task.total_steps ? `, step ${task.current_step}/${task.total_steps}` : "";
825
849
  const waiting = waitingHumanLine(task);
826
850
  return `Still running (${elapsed}${step}). Call again as a separate command: browser-cli script-task ${task.id} --wait` + (waiting ? ` --through-human
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optima-chat/browser-cli",
3
- "version": "0.22.0",
3
+ "version": "0.24.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "bin": {