Module: Space::Architect::SessionSync

Defined in:
lib/space_architect/session_sync.rb,
lib/space_architect/session_sync/plist.rb,
lib/space_architect/session_sync/cursor.rb,
lib/space_architect/session_sync/runner.rb,
lib/space_architect/session_sync/bin_path.rb,
lib/space_architect/session_sync/session_id.rb

Overview

Session-sync rail's laptop half: scans ~/.pi/agent/sessions//*.jsonl and ~/.claude/projects//*.jsonl for conversation files, uploads new/grown ones to a space-server via ConversationsClient, and installs a per-user launchd agent that runs the sync on an interval. Opencode (sqlite) is out of scope for this rail.

Defined Under Namespace

Modules: BinPath, SessionId Classes: Cursor, Plist, Runner

Constant Summary collapse

LABEL =
"io.github.jetpks.space-architect.session-sync"
APP_NAME =
"space-architect"
TOKEN_ENV =
"SPACE_ARCHITECT_INGEST_TOKEN"

Class Method Summary collapse

Class Method Details

.default_claude_root(env: ENV) ⇒ Object



44
45
46
# File 'lib/space_architect/session_sync.rb', line 44

def default_claude_root(env: ENV)
  File.join(Space::Core::XDG.home(env: env), ".claude", "projects")
end

.default_pi_root(env: ENV) ⇒ Object



40
41
42
# File 'lib/space_architect/session_sync.rb', line 40

def default_pi_root(env: ENV)
  File.join(Space::Core::XDG.home(env: env), ".pi", "agent", "sessions")
end

.default_state_file(env: ENV) ⇒ Object



36
37
38
# File 'lib/space_architect/session_sync.rb', line 36

def default_state_file(env: ENV)
  File.join(state_dir(env: env), "session-sync.yaml")
end

.launch_agents_dir(env: ENV) ⇒ Object



52
53
54
# File 'lib/space_architect/session_sync.rb', line 52

def launch_agents_dir(env: ENV)
  File.join(Space::Core::XDG.home(env: env), "Library", "LaunchAgents")
end

.log_dir(env: ENV) ⇒ Object



48
49
50
# File 'lib/space_architect/session_sync.rb', line 48

def log_dir(env: ENV)
  File.join(state_dir(env: env), "logs")
end

.resolve_token(ref) ⇒ Object

The one op-read seam under lib/: resolves an op:// ref via op read. Shared by ConversationsClient's default op_resolver and Sessions::Agent::Install (both test-injectable around this call).

Raises:



25
26
27
28
29
30
# File 'lib/space_architect/session_sync.rb', line 25

def resolve_token(ref)
  value = IO.popen(["op", "read", ref], &:read)
  raise Space::Core::Error, "op read failed for #{ref}" unless $?.success?

  value.chomp
end

.state_dir(env: ENV) ⇒ Object



32
33
34
# File 'lib/space_architect/session_sync.rb', line 32

def state_dir(env: ENV)
  File.join(Space::Core::XDG.state_home(env: env).to_s, APP_NAME)
end