@dmsdc-ai/aterm-darwin-arm64 0.2.8 → 0.2.10

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.
Binary file
@@ -379,9 +379,10 @@ if [ -z "$ATERM_IPC_SOCKET" ]; then
379
379
  shift
380
380
  exec telepty inject "$@" ;;
381
381
  list)
382
- _has_telepty || _no_telepty_msg
383
- shift
384
- exec telepty list "$@" ;;
382
+ # Fall through to main case below — list ALWAYS merges union
383
+ # (internal via /tmp/aterm-*.sock discovery + telepty). No early
384
+ # short-circuit to telepty-only.
385
+ ;;
385
386
  status)
386
387
  if [ "$#" -le 1 ]; then
387
388
  print_ecosystem_status
@@ -399,21 +400,36 @@ fi
399
400
 
400
401
  case "${1:-help}" in
401
402
  list)
402
- if [ "${2:-}" = "--json" ]; then
403
- # JSON mode: output merged JSON
404
- python3 -c '
405
- import json, sys, os, subprocess, os.path
403
+ # Parse flags: --all (default), --internal-only, --telepty-only, --json
404
+ shift
405
+ _list_mode="all"
406
+ _list_json=false
407
+ while [ $# -gt 0 ]; do
408
+ case "$1" in
409
+ --all) _list_mode="all"; shift ;;
410
+ --internal-only) _list_mode="internal"; shift ;;
411
+ --telepty-only) _list_mode="telepty"; shift ;;
412
+ --json) _list_json=true; shift ;;
413
+ *) shift ;; # ignore unknown
414
+ esac
415
+ done
416
+ ATERM_LIST_MODE="$_list_mode" ATERM_LIST_JSON_FLAG="$_list_json" python3 -c '
417
+ import json, os, subprocess, glob
418
+ import socket as S
419
+
420
+ mode = os.environ.get("ATERM_LIST_MODE", "all")
421
+ json_out = os.environ.get("ATERM_LIST_JSON_FLAG", "false") == "true"
422
+ lang = os.environ.get("ATERM_UI_LANG", "en")
406
423
 
407
424
  sessions = []
408
425
 
409
- # 1. aterm internal sessions
410
- sock = os.environ.get("ATERM_IPC_SOCKET", "")
411
- if sock:
412
- import socket as S
426
+ def query_aterm_socket(sock_path):
427
+ """Query a single aterm IPC socket for workspaces. Returns list of dicts or []."""
428
+ out = []
413
429
  try:
414
430
  s = S.socket(S.AF_UNIX, S.SOCK_STREAM)
415
- s.settimeout(5)
416
- s.connect(sock)
431
+ s.settimeout(2)
432
+ s.connect(sock_path)
417
433
  s.sendall(json.dumps({"action": "ListWorkspaces"}).encode() + b"\n")
418
434
  s.shutdown(S.SHUT_WR)
419
435
  data = b""
@@ -428,95 +444,72 @@ if sock:
428
444
  if ws.get("status") in ("dead", "closing"):
429
445
  continue
430
446
  ws["terminal"] = "aterm"
447
+ ws["source"] = "internal"
431
448
  ws.setdefault("name", os.path.basename(ws.get("cwd", "")) or ws.get("id", "?"))
432
- sessions.append(ws)
433
- except: pass
434
-
435
- # 2. telepty external sessions (only if installed, deduplicated)
436
- aterm_names = set(s.get("name", "") for s in sessions)
437
- try:
438
- result = subprocess.run(["telepty", "list", "--json"], capture_output=True, text=True, timeout=5)
439
- if result.returncode == 0:
440
- tdata = json.loads(result.stdout)
441
- for ts in (tdata if isinstance(tdata, list) else tdata.get("sessions", [])):
442
- ts.setdefault("terminal", ts.get("terminal", "external"))
443
- ts.setdefault("name", ts.get("id", "?"))
444
- if ts.get("name", "") in aterm_names:
445
- continue
446
- sessions.append(ts)
447
- except (FileNotFoundError, subprocess.TimeoutExpired, json.JSONDecodeError): pass
448
-
449
- print(json.dumps({"sessions": sessions}))
450
- '
451
- else
452
- # Table mode: merged display
453
- python3 -c '
454
- import json, sys, os, subprocess, os.path
455
-
456
- sessions = []
457
- lang = os.environ.get("ATERM_UI_LANG", "en")
449
+ out.append(ws)
450
+ except Exception:
451
+ pass
452
+ return out
458
453
 
459
- # 1. aterm internal sessions
460
- sock = os.environ.get("ATERM_IPC_SOCKET", "")
461
- if sock:
462
- import socket as S
454
+ # 1. aterm internal sessions — discover socket if needed
455
+ if mode in ("all", "internal"):
456
+ sock = os.environ.get("ATERM_IPC_SOCKET", "")
457
+ if sock and os.path.exists(sock):
458
+ sessions.extend(query_aterm_socket(sock))
459
+ else:
460
+ # Socket discovery: glob /tmp/aterm-*.sock, try each until one responds
461
+ for candidate in glob.glob("/tmp/aterm-*.sock"):
462
+ got = query_aterm_socket(candidate)
463
+ if got:
464
+ sessions.extend(got)
465
+ break # first responsive socket wins
466
+
467
+ # 2. telepty external sessions — deduplicated by name (internal precedence)
468
+ if mode in ("all", "telepty"):
469
+ aterm_names = set(s.get("name", "") for s in sessions)
463
470
  try:
464
- s = S.socket(S.AF_UNIX, S.SOCK_STREAM)
465
- s.settimeout(5)
466
- s.connect(sock)
467
- s.sendall(json.dumps({"action": "ListWorkspaces"}).encode() + b"\n")
468
- s.shutdown(S.SHUT_WR)
469
- data = b""
470
- while True:
471
- chunk = s.recv(4096)
472
- if not chunk: break
473
- data += chunk
474
- if b"\n" in data: break
475
- s.close()
476
- resp = json.loads(data.decode().strip().split("\n")[0])
477
- for ws in resp.get("data", []):
478
- if ws.get("status") in ("dead", "closing"):
479
- continue
480
- name = ws.get("name") or os.path.basename(ws.get("cwd", "")) or ws.get("id", "?")
481
- cli = ws.get("cli", "")
482
- cwd = ws.get("cwd", "")
483
- sessions.append((name, cli, cwd, "aterm"))
484
- except: pass
471
+ result = subprocess.run(
472
+ ["telepty", "list", "--json"],
473
+ capture_output=True, text=True, timeout=5
474
+ )
475
+ if result.returncode == 0:
476
+ tdata = json.loads(result.stdout)
477
+ entries = tdata if isinstance(tdata, list) else tdata.get("sessions", [])
478
+ for ts in entries:
479
+ ts.setdefault("name", ts.get("id", "?"))
480
+ if ts.get("name", "") in aterm_names:
481
+ continue # internal precedence: drop telepty duplicate
482
+ ts.setdefault("terminal", ts.get("terminal", "external"))
483
+ ts["source"] = "telepty"
484
+ sessions.append(ts)
485
+ except (FileNotFoundError, subprocess.TimeoutExpired, json.JSONDecodeError):
486
+ pass
485
487
 
486
- # 2. telepty external sessions (only if installed, deduplicated)
487
- aterm_names = set(r[0] for r in sessions)
488
- try:
489
- result = subprocess.run(["telepty", "list", "--json"], capture_output=True, text=True, timeout=5)
490
- if result.returncode == 0:
491
- tdata = json.loads(result.stdout)
492
- for ts in (tdata if isinstance(tdata, list) else tdata.get("sessions", [])):
493
- name = ts.get("name") or ts.get("id", "?")
494
- if name in aterm_names:
495
- continue
496
- cli = ts.get("cli", "")
497
- cwd = ts.get("cwd", "")
498
- terminal = ts.get("terminal", "external")
499
- sessions.append((name, cli, cwd, terminal))
500
- except (FileNotFoundError, subprocess.TimeoutExpired, json.JSONDecodeError): pass
501
-
502
- if not sessions:
503
- print("(도달 가능한 세션 없음)" if lang == "ko" else "(no reachable sessions)")
488
+ if json_out:
489
+ print(json.dumps({"sessions": sessions}))
504
490
  else:
505
- cols = ["이름", "CLI", "경로", "터미널"] if lang == "ko" else ["NAME", "CLI", "CWD", "TERMINAL"]
506
- widths = [max(len(c), *(len(r[i]) for r in sessions)) for i, c in enumerate(cols)]
507
- fmt = " ".join(f"{{:<{w}}}" for w in widths)
508
- print(fmt.format(*cols))
509
- print(" ".join("\u2500" * w for w in widths))
510
- for r in sessions:
511
- print(fmt.format(*r))
512
- if all(r[3] == "aterm" for r in sessions):
513
- print()
514
- if lang == "ko":
515
- print("💡 현재 도달 가능한 세션은 모두 aterm 내부 세션입니다. 다른 터미널과 연결하려면 telepty를 사용하세요: 이미 포함되어 있습니다.")
516
- else:
517
- print("💡 All reachable sessions are internal to aterm. Use telepty for cross-terminal access: it is already included.")
518
- '
519
- fi ;;
491
+ if not sessions:
492
+ print("(도달 가능한 세션 없음)" if lang == "ko" else "(no reachable sessions)")
493
+ else:
494
+ # Build table rows: NAME | CLI | CWD | TERMINAL | SOURCE
495
+ rows = []
496
+ for s in sessions:
497
+ name = s.get("name") or s.get("id") or "?"
498
+ cli = s.get("cli", "") or s.get("command", "")
499
+ cwd = s.get("cwd", "")
500
+ terminal = s.get("terminal", "external")
501
+ source = s.get("source", "?")
502
+ rows.append((name, cli, cwd, terminal, source))
503
+ cols = (["이름", "CLI", "경로", "터미널", "출처"]
504
+ if lang == "ko"
505
+ else ["NAME", "CLI", "CWD", "TERMINAL", "SOURCE"])
506
+ widths = [max(len(c), *(len(r[i]) for r in rows)) for i, c in enumerate(cols)]
507
+ fmt = " ".join(f"{{:<{w}}}" for w in widths)
508
+ print(fmt.format(*cols))
509
+ print(" ".join("\u2500" * w for w in widths))
510
+ for r in rows:
511
+ print(fmt.format(*r))
512
+ ' ;;
520
513
  inject)
521
514
  shift
522
515
  _force_flag=false
@@ -10,7 +10,11 @@
10
10
  </data>
11
11
  <key>Resources/bin/aterm</key>
12
12
  <data>
13
- IZBiv5oShrmYfdH/0NXFDXSmXFk=
13
+ VRZz0AFDaEcCwkQxxSReqCUEY4w=
14
+ </data>
15
+ <key>Resources/default.metallib</key>
16
+ <data>
17
+ 9rAreH1GznVFOySblocjrpe1uIY=
14
18
  </data>
15
19
  </dict>
16
20
  <key>files2</key>
@@ -19,10 +23,10 @@
19
23
  <dict>
20
24
  <key>cdhash</key>
21
25
  <data>
22
- KDxl7ZhBktvm9PLz6I5oyXcnsY4=
26
+ WbASotY2YHXdFgvjCdpZjbTt7wI=
23
27
  </data>
24
28
  <key>requirement</key>
25
- <string>cdhash H"283c65ed984192dbe6f4f2f3e88e68c97727b18e"</string>
29
+ <string>cdhash H"59b012a2d6366075dd160be309da598db4edef02"</string>
26
30
  </dict>
27
31
  <key>Resources/AppIcon.icns</key>
28
32
  <dict>
@@ -35,7 +39,14 @@
35
39
  <dict>
36
40
  <key>hash2</key>
37
41
  <data>
38
- 745JIYSJftF+iS63Mtf4HkVRAFTXTi4+kWGCuIFNEAw=
42
+ 4HaXnqqZ6Rlis6H4+0G2qD7ZMF2hvEygD/c3UFd9pm4=
43
+ </data>
44
+ </dict>
45
+ <key>Resources/default.metallib</key>
46
+ <dict>
47
+ <key>hash2</key>
48
+ <data>
49
+ /Zf0Dqz2WcHaeICkOLQ5VzRLI4H7Zo0q+/VKaPbM31Y=
39
50
  </data>
40
51
  </dict>
41
52
  </dict>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dmsdc-ai/aterm-darwin-arm64",
3
- "version": "0.2.8",
3
+ "version": "0.2.10",
4
4
  "description": "darwin-arm64 native bundle for @dmsdc-ai/aterm",
5
5
  "type": "module",
6
6
  "files": [