@pulso/companion 0.4.7 → 0.4.8

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 +52 -2
  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,
@@ -11200,12 +11233,28 @@ print(result.stdout[:5000])
11200
11233
  );
11201
11234
  }
11202
11235
  case "sys_claude_status": {
11236
+ const _home = process.env.HOME || "";
11237
+ const _claudePaths = [
11238
+ `${_home}/.local/bin/claude`,
11239
+ `${_home}/.local/share/claude/versions/latest/claude`,
11240
+ "/usr/local/bin/claude",
11241
+ "/opt/homebrew/bin/claude"
11242
+ ];
11243
+ let _claudeBin = "claude";
11244
+ for (const _p of _claudePaths) {
11245
+ try {
11246
+ execSync3(`test -x "${_p}"`, { stdio: "ignore" });
11247
+ _claudeBin = _p;
11248
+ break;
11249
+ } catch {
11250
+ }
11251
+ }
11203
11252
  try {
11204
- const version = await runShell4("claude --version 2>/dev/null", 5e3);
11253
+ const version = await runShell4(`"${_claudeBin}" --version 2>/dev/null`, 5e3);
11205
11254
  let authStatus = "unknown";
11206
11255
  let authDetails;
11207
11256
  try {
11208
- const status = await runShell4("claude auth status 2>&1", 1e4);
11257
+ const status = await runShell4(`"${_claudeBin}" auth status 2>&1`, 1e4);
11209
11258
  const trimmed = status.trim();
11210
11259
  let parsed = null;
11211
11260
  try {
@@ -12293,6 +12342,7 @@ async function probeCapabilities() {
12293
12342
  }
12294
12343
  tools.add("llm_infer");
12295
12344
  tools.add("llm_list_local");
12345
+ tools.add("llm_detect_sessions");
12296
12346
  if (adapter.platform === "macos" || adapter.platform === "windows") {
12297
12347
  tools.add("llm_browser_claude");
12298
12348
  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.8",
4
4
  "type": "module",
5
5
  "description": "Pulso Companion — gives your AI agent real control over your computer",
6
6
  "bin": {