@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.
- package/dist/aterm.app/Contents/Frameworks/libaterm_core.dylib +0 -0
- package/dist/aterm.app/Contents/MacOS/aterm +0 -0
- package/dist/aterm.app/Contents/Resources/bin/aterm +90 -97
- package/dist/aterm.app/Contents/Resources/default.metallib +0 -0
- package/dist/aterm.app/Contents/_CodeSignature/CodeResources +15 -4
- package/package.json +1 -1
|
Binary file
|
|
Binary file
|
|
@@ -379,9 +379,10 @@ if [ -z "$ATERM_IPC_SOCKET" ]; then
|
|
|
379
379
|
shift
|
|
380
380
|
exec telepty inject "$@" ;;
|
|
381
381
|
list)
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
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
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
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
|
-
|
|
410
|
-
|
|
411
|
-
|
|
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(
|
|
416
|
-
s.connect(
|
|
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
|
-
|
|
433
|
-
except:
|
|
434
|
-
|
|
435
|
-
|
|
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
|
-
|
|
461
|
-
|
|
462
|
-
|
|
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
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
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
|
-
|
|
487
|
-
|
|
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
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
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
|
|
Binary file
|
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
</data>
|
|
11
11
|
<key>Resources/bin/aterm</key>
|
|
12
12
|
<data>
|
|
13
|
-
|
|
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
|
-
|
|
26
|
+
WbASotY2YHXdFgvjCdpZjbTt7wI=
|
|
23
27
|
</data>
|
|
24
28
|
<key>requirement</key>
|
|
25
|
-
<string>cdhash H"
|
|
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
|
-
|
|
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>
|