@pulso/companion 0.4.7 → 0.4.9

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 +67 -5
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -9955,6 +9955,39 @@ async function handleCommand(command, params, streamCb) {
9955
9955
  }
9956
9956
  };
9957
9957
  }
9958
+ if (command === "llm_detect_sessions") {
9959
+ const sessions = [];
9960
+ const PROVIDERS = [
9961
+ { provider: "claude", url: "claude.ai", login_indicator: "/login" },
9962
+ { provider: "chatgpt", url: "chatgpt.com", login_indicator: "/auth/login" },
9963
+ { provider: "perplexity", url: "perplexity.ai", login_indicator: "/login" },
9964
+ { provider: "gemini", url: "gemini.google.com", login_indicator: "/signin" }
9965
+ ];
9966
+ try {
9967
+ const tabsResult = await adapter.browserListTabs();
9968
+ const tabs = Array.isArray(tabsResult) ? tabsResult : tabsResult?.data ?? [];
9969
+ const tabList = tabs;
9970
+ for (const p of PROVIDERS) {
9971
+ const matchingTabs = tabList.filter((t) => t.url?.includes(p.url));
9972
+ const tabOpen = matchingTabs.length > 0;
9973
+ const loggedIn = tabOpen && !matchingTabs.some((t) => t.url?.includes(p.login_indicator));
9974
+ sessions.push({ provider: p.provider, url: p.url, logged_in: loggedIn, tab_open: tabOpen });
9975
+ }
9976
+ } catch {
9977
+ for (const p of PROVIDERS) {
9978
+ sessions.push({ provider: p.provider, url: p.url, logged_in: false, tab_open: false });
9979
+ }
9980
+ }
9981
+ const available = sessions.filter((s) => s.logged_in).map((s) => s.provider);
9982
+ return {
9983
+ success: true,
9984
+ data: {
9985
+ sessions,
9986
+ available_providers: available,
9987
+ has_browser_llm: available.length > 0
9988
+ }
9989
+ };
9990
+ }
9958
9991
  if (command === "llm_infer") {
9959
9992
  const {
9960
9993
  messages,
@@ -11058,7 +11091,6 @@ print(result.stdout[:5000])
11058
11091
  if (useStreamJson) {
11059
11092
  args.push("--verbose", "--include-partial-messages");
11060
11093
  }
11061
- args.push("--tools", "");
11062
11094
  if (systemPrompt && systemPrompt.trim()) {
11063
11095
  args.push("--system-prompt", systemPrompt.trim());
11064
11096
  }
@@ -11105,9 +11137,21 @@ print(result.stdout[:5000])
11105
11137
  }
11106
11138
  }
11107
11139
  };
11140
+ const { join: _join, dirname: _dirname } = __require("path");
11141
+ const _fs = __require("fs");
11142
+ const _augPath = augmentedPath2();
11143
+ let _nodeBinDir = "";
11144
+ for (const _dir of _augPath.split(":")) {
11145
+ try {
11146
+ _fs.accessSync(_join(_dir, "node"), _fs.constants.X_OK);
11147
+ _nodeBinDir = _dir;
11148
+ break;
11149
+ } catch {
11150
+ }
11151
+ }
11108
11152
  const childEnv = {
11109
11153
  ...process.env,
11110
- PATH: `${home}/.local/bin:${process.env.PATH}`
11154
+ PATH: _nodeBinDir ? `${_nodeBinDir}:${_augPath}` : _augPath
11111
11155
  };
11112
11156
  delete childEnv.CLAUDECODE;
11113
11157
  delete childEnv.CLAUDE_CODE;
@@ -11200,13 +11244,30 @@ print(result.stdout[:5000])
11200
11244
  );
11201
11245
  }
11202
11246
  case "sys_claude_status": {
11247
+ const _home = process.env.HOME || "";
11248
+ const _claudePaths = [
11249
+ `${_home}/.local/bin/claude`,
11250
+ `${_home}/.local/share/claude/versions/latest/claude`,
11251
+ "/usr/local/bin/claude",
11252
+ "/opt/homebrew/bin/claude"
11253
+ ];
11254
+ let _claudeBin = "claude";
11255
+ for (const _p of _claudePaths) {
11256
+ try {
11257
+ execSync3(`test -x "${_p}"`, { stdio: "ignore" });
11258
+ _claudeBin = _p;
11259
+ break;
11260
+ } catch {
11261
+ }
11262
+ }
11203
11263
  try {
11204
- const version = await runShell4("claude --version 2>/dev/null", 5e3);
11264
+ const version = await runShell4(`"${_claudeBin}" --version 2>/dev/null`, 5e3);
11205
11265
  let authStatus = "unknown";
11206
11266
  let authDetails;
11207
11267
  try {
11208
- const status = await runShell4("claude auth status 2>&1", 1e4);
11209
- const trimmed = status.trim();
11268
+ const status = await runShell4(`"${_claudeBin}" auth status 2>&1`, 1e4);
11269
+ const jsonLine = status.split("\n").find((l) => l.trimStart().startsWith("{"));
11270
+ const trimmed = jsonLine?.trim() ?? status.trim();
11210
11271
  let parsed = null;
11211
11272
  try {
11212
11273
  parsed = JSON.parse(trimmed);
@@ -12293,6 +12354,7 @@ async function probeCapabilities() {
12293
12354
  }
12294
12355
  tools.add("llm_infer");
12295
12356
  tools.add("llm_list_local");
12357
+ tools.add("llm_detect_sessions");
12296
12358
  if (adapter.platform === "macos" || adapter.platform === "windows") {
12297
12359
  tools.add("llm_browser_claude");
12298
12360
  tools.add("llm_browser_chatgpt");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pulso/companion",
3
- "version": "0.4.7",
3
+ "version": "0.4.9",
4
4
  "type": "module",
5
5
  "description": "Pulso Companion — gives your AI agent real control over your computer",
6
6
  "bin": {