@onebrain-ai/cli 2.1.12 → 2.1.13

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/onebrain +94 -8
  2. package/package.json +1 -1
package/dist/onebrain CHANGED
@@ -9521,7 +9521,7 @@ var init_lib = __esm(() => {
9521
9521
  var require_package = __commonJS((exports, module) => {
9522
9522
  module.exports = {
9523
9523
  name: "@onebrain-ai/cli",
9524
- version: "2.1.12",
9524
+ version: "2.1.13",
9525
9525
  description: "CLI for OneBrain \u2014 personal AI OS for Obsidian with persistent memory, 24+ skills, and Claude Code integration",
9526
9526
  keywords: [
9527
9527
  "onebrain",
@@ -10858,7 +10858,7 @@ var import_picocolors5 = __toESM(require_picocolors(), 1);
10858
10858
  var import_picocolors = __toESM(require_picocolors(), 1);
10859
10859
  function resolveBinaryVersion() {
10860
10860
  if (true)
10861
- return "2.1.12";
10861
+ return "2.1.13";
10862
10862
  try {
10863
10863
  const pkg = require_package();
10864
10864
  return pkg.version ?? "dev";
@@ -12632,7 +12632,74 @@ function formatDatetime(date) {
12632
12632
  const mm = String(date.getMinutes()).padStart(2, "0");
12633
12633
  return `${dow} \xB7 ${day} ${mon} ${year} \xB7 ${hh}:${mm}`;
12634
12634
  }
12635
- async function resolveSessionToken(tmpDir = osTmpdir2()) {
12635
+ function commBasenameOf(raw) {
12636
+ return raw.trim().replace(/^.*[/\\]/, "").replace(/\.exe$/i, "");
12637
+ }
12638
+ var defaultProcLookup = (pid) => {
12639
+ if (process.platform === "win32")
12640
+ return null;
12641
+ let result;
12642
+ try {
12643
+ result = Bun.spawnSync(["ps", "-o", "ppid=,comm=", "-p", String(pid)], {
12644
+ stdout: "pipe",
12645
+ stderr: "pipe"
12646
+ });
12647
+ } catch (err) {
12648
+ const code = err?.code;
12649
+ process.stderr.write(`onebrain: ps spawn failed for pid ${pid} (${code ?? "unknown"})
12650
+ `);
12651
+ return null;
12652
+ }
12653
+ if (!result.success) {
12654
+ process.stderr.write(`onebrain: ps -p ${pid} exited ${result.exitCode}
12655
+ `);
12656
+ return null;
12657
+ }
12658
+ const out2 = new TextDecoder().decode(result.stdout).trim();
12659
+ if (!out2) {
12660
+ process.stderr.write(`onebrain: ps -p ${pid} returned empty output
12661
+ `);
12662
+ return null;
12663
+ }
12664
+ if (out2.includes(`
12665
+ `)) {
12666
+ process.stderr.write(`onebrain: ps -p ${pid} returned multi-line output: ${out2.replace(/\n/g, " | ").slice(0, 120)}
12667
+ `);
12668
+ return null;
12669
+ }
12670
+ const match = out2.match(/^\s*(\d+)\s+(.+)$/);
12671
+ if (!match) {
12672
+ process.stderr.write(`onebrain: ps -p ${pid} unparseable: ${out2.slice(0, 120)}
12673
+ `);
12674
+ return null;
12675
+ }
12676
+ const ppid = Number(match[1]);
12677
+ if (Number.isNaN(ppid))
12678
+ return null;
12679
+ return { ppid, commBasename: commBasenameOf(match[2] ?? "") };
12680
+ };
12681
+ function findClaudeAncestorPid(startPid, lookup = defaultProcLookup, maxDepth = 12) {
12682
+ let current = startPid;
12683
+ for (let i = 0;i < maxDepth; i++) {
12684
+ if (current <= 1)
12685
+ return null;
12686
+ const info = lookup(current);
12687
+ if (!info)
12688
+ return null;
12689
+ if (info.commBasename === "claude")
12690
+ return current;
12691
+ if (info.ppid <= 1) {
12692
+ process.stderr.write(`onebrain: walk-up reached init from pid ${startPid} without finding claude (last comm=${info.commBasename})
12693
+ `);
12694
+ return null;
12695
+ }
12696
+ current = info.ppid;
12697
+ }
12698
+ process.stderr.write(`onebrain: walk-up exhausted ${maxDepth} hops from pid ${startPid} without finding claude
12699
+ `);
12700
+ return null;
12701
+ }
12702
+ async function resolveSessionToken(tmpDir = osTmpdir2(), procLookup = defaultProcLookup) {
12636
12703
  const wtSession = process.env["WT_SESSION"];
12637
12704
  if (wtSession) {
12638
12705
  const stripped = wtSession.replace(/[^a-zA-Z0-9]/g, "").slice(0, 8);
@@ -12651,6 +12718,13 @@ async function resolveSessionToken(tmpDir = osTmpdir2()) {
12651
12718
  if (stripped.length > 0)
12652
12719
  return stripped;
12653
12720
  }
12721
+ const startPpid = process.ppid;
12722
+ if (startPpid !== undefined && startPpid > 1) {
12723
+ const claudePid = findClaudeAncestorPid(startPpid, procLookup);
12724
+ if (claudePid !== null && claudePid > 1) {
12725
+ return String(claudePid);
12726
+ }
12727
+ }
12654
12728
  const today = new Date;
12655
12729
  const yyyymmdd = [
12656
12730
  today.getFullYear(),
@@ -12719,9 +12793,21 @@ async function cleanStaleStateFile(token, tmpDir) {
12719
12793
  if (mtimeMs < processStartMs) {
12720
12794
  try {
12721
12795
  await unlink3(stateFile);
12722
- } catch {}
12796
+ } catch (err) {
12797
+ const code = err?.code;
12798
+ if (code !== "ENOENT") {
12799
+ process.stderr.write(`onebrain: cannot remove stale state file ${stateFile} (${code ?? "unknown"})
12800
+ `);
12801
+ }
12802
+ }
12723
12803
  }
12724
- } catch {}
12804
+ } catch (err) {
12805
+ const code = err?.code;
12806
+ if (code && code !== "ENOENT") {
12807
+ process.stderr.write(`onebrain: cleanStaleStateFile failed (${code})
12808
+ `);
12809
+ }
12810
+ }
12725
12811
  }
12726
12812
  async function queryQmdUnembedded() {
12727
12813
  try {
@@ -12752,13 +12838,13 @@ async function queryQmdUnembedded() {
12752
12838
  return 0;
12753
12839
  }
12754
12840
  }
12755
- async function runSessionInit(vaultRoot, tmpDir = osTmpdir2()) {
12841
+ async function runSessionInit(vaultRoot, tmpDir = osTmpdir2(), procLookup = defaultProcLookup) {
12756
12842
  try {
12757
12843
  await loadVaultConfig(vaultRoot);
12758
12844
  } catch {
12759
12845
  return { decision: "block", reason: "onebrain-init-required" };
12760
12846
  }
12761
- const sessionToken = await resolveSessionToken(tmpDir);
12847
+ const sessionToken = await resolveSessionToken(tmpDir, procLookup);
12762
12848
  await cleanStaleStateFile(sessionToken, tmpDir);
12763
12849
  const datetime = formatDatetime(new Date);
12764
12850
  const qmdUnembedded = await queryQmdUnembedded();
@@ -13002,7 +13088,7 @@ function patchUtf8(stream) {
13002
13088
  }
13003
13089
 
13004
13090
  // src/index.ts
13005
- var VERSION = "2.1.12";
13091
+ var VERSION = "2.1.13";
13006
13092
  var RELEASE_DATE = "2026-05-06";
13007
13093
  patchUtf8(process.stdout);
13008
13094
  patchUtf8(process.stderr);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@onebrain-ai/cli",
3
- "version": "2.1.12",
3
+ "version": "2.1.13",
4
4
  "description": "CLI for OneBrain — personal AI OS for Obsidian with persistent memory, 24+ skills, and Claude Code integration",
5
5
  "keywords": [
6
6
  "onebrain",