chore: drop gateway ipc remnants
This commit is contained in:
@@ -119,12 +119,12 @@ First Clawdis release post rebrand. This is a semver-major because we dropped le
|
|||||||
- Heartbeat alerts now honor `responsePrefix`.
|
- Heartbeat alerts now honor `responsePrefix`.
|
||||||
- Command failures return user-friendly messages.
|
- Command failures return user-friendly messages.
|
||||||
- Test session isolation to avoid touching real `sessions.json`.
|
- Test session isolation to avoid touching real `sessions.json`.
|
||||||
- IPC reuse for `clawdis send/heartbeat` prevents Signal/WhatsApp session corruption.
|
- (Removed in 2.0.0) IPC reuse for `clawdis send/heartbeat` prevents Signal/WhatsApp session corruption.
|
||||||
- Web send respects media kind (image/audio/video/document) with correct limits.
|
- Web send respects media kind (image/audio/video/document) with correct limits.
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
- IPC gateway socket at `~/.clawdis/ipc/gateway.sock` with automatic CLI fallback.
|
- (Removed in 2.0.0) IPC gateway socket at `~/.clawdis/ipc/gateway.sock` with automatic CLI fallback.
|
||||||
- Batched inbound messages with timestamps; typing indicator after IPC sends.
|
- Batched inbound messages with timestamps; typing indicator after sends.
|
||||||
- Watchdog restarts WhatsApp after long inactivity; heartbeat logging includes minutes since last message.
|
- Watchdog restarts WhatsApp after long inactivity; heartbeat logging includes minutes since last message.
|
||||||
- Early `allowFrom` filtering before decryption.
|
- Early `allowFrom` filtering before decryption.
|
||||||
- Same-phone mode with echo detection and optional `inbound.samePhoneMarker`.
|
- Same-phone mode with echo detection and optional `inbound.samePhoneMarker`.
|
||||||
|
|||||||
@@ -128,17 +128,17 @@ enum DebugActions {
|
|||||||
await HealthStore.shared.refresh(onDemand: true)
|
await HealthStore.shared.refresh(onDemand: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func sendTestHeartbeat() async -> Result<ControlHeartbeatEvent?, String> {
|
static func sendTestHeartbeat() async -> Result<ControlHeartbeatEvent?, Error> {
|
||||||
do {
|
do {
|
||||||
_ = await AgentRPC.shared.setHeartbeatsEnabled(true)
|
_ = await AgentRPC.shared.setHeartbeatsEnabled(true)
|
||||||
try await ControlChannel.shared.configure()
|
await ControlChannel.shared.configure()
|
||||||
let data = try await ControlChannel.shared.request(method: "last-heartbeat")
|
let data = try await ControlChannel.shared.request(method: "last-heartbeat")
|
||||||
if let evt = try? JSONDecoder().decode(ControlHeartbeatEvent.self, from: data) {
|
if let evt = try? JSONDecoder().decode(ControlHeartbeatEvent.self, from: data) {
|
||||||
return .success(evt)
|
return .success(evt)
|
||||||
}
|
}
|
||||||
return .success(nil)
|
return .success(nil)
|
||||||
} catch {
|
} catch {
|
||||||
return .failure(error.localizedDescription)
|
return .failure(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ enum DebugActions {
|
|||||||
static func toggleVerboseLoggingMain() async -> Bool {
|
static func toggleVerboseLoggingMain() async -> Bool {
|
||||||
let newValue = !self.verboseLoggingEnabledMain
|
let newValue = !self.verboseLoggingEnabledMain
|
||||||
UserDefaults.standard.set(newValue, forKey: self.verboseDefaultsKey)
|
UserDefaults.standard.set(newValue, forKey: self.verboseDefaultsKey)
|
||||||
try? await ControlChannel.shared.request(
|
_ = try? await ControlChannel.shared.request(
|
||||||
method: "system-event",
|
method: "system-event",
|
||||||
params: ["text": AnyHashable("verbose-main:\(newValue ? "on" : "off")")])
|
params: ["text": AnyHashable("verbose-main:\(newValue ? "on" : "off")")])
|
||||||
return newValue
|
return newValue
|
||||||
|
|||||||
@@ -4,11 +4,6 @@ import OSLog
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
struct HealthSnapshot: Codable, Sendable {
|
struct HealthSnapshot: Codable, Sendable {
|
||||||
struct Ipc: Codable, Sendable {
|
|
||||||
let exists: Bool?
|
|
||||||
let path: String?
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Web: Codable, Sendable {
|
struct Web: Codable, Sendable {
|
||||||
struct Connect: Codable, Sendable {
|
struct Connect: Codable, Sendable {
|
||||||
let ok: Bool
|
let ok: Bool
|
||||||
@@ -37,7 +32,6 @@ struct HealthSnapshot: Codable, Sendable {
|
|||||||
let ts: Double
|
let ts: Double
|
||||||
let durationMs: Double
|
let durationMs: Double
|
||||||
let web: Web
|
let web: Web
|
||||||
let ipc: Ipc?
|
|
||||||
let heartbeatSeconds: Int?
|
let heartbeatSeconds: Int?
|
||||||
let sessions: Sessions
|
let sessions: Sessions
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -261,7 +261,7 @@ final class InstancesStore: ObservableObject {
|
|||||||
lastInputSeconds: nil,
|
lastInputSeconds: nil,
|
||||||
mode: "health",
|
mode: "health",
|
||||||
reason: "health probe",
|
reason: "health probe",
|
||||||
text: "Health ok · linked=\(snap.web.linked) · ipc.exists=\(snap.ipc.exists)",
|
text: "Health ok · linked=\(snap.web.linked)",
|
||||||
ts: snap.ts)
|
ts: snap.ts)
|
||||||
if !self.instances.contains(where: { $0.id == entry.id }) {
|
if !self.instances.contains(where: { $0.id == entry.id }) {
|
||||||
self.instances.insert(entry, at: 0)
|
self.instances.insert(entry, at: 0)
|
||||||
|
|||||||
@@ -244,6 +244,10 @@ final class WebChatManager {
|
|||||||
static let shared = WebChatManager()
|
static let shared = WebChatManager()
|
||||||
private var controller: WebChatWindowController?
|
private var controller: WebChatWindowController?
|
||||||
|
|
||||||
|
func preferredSessionKey() -> String {
|
||||||
|
WorkActivityStore.shared.current?.sessionKey ?? "main"
|
||||||
|
}
|
||||||
|
|
||||||
func show(sessionKey: String) {
|
func show(sessionKey: String) {
|
||||||
if self.controller == nil {
|
if self.controller == nil {
|
||||||
self.controller = WebChatWindowController(sessionKey: sessionKey)
|
self.controller = WebChatWindowController(sessionKey: sessionKey)
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import Testing
|
|||||||
|
|
||||||
#expect(snap?.web.linked == true)
|
#expect(snap?.web.linked == true)
|
||||||
#expect(snap?.sessions.count == 1)
|
#expect(snap?.sessions.count == 1)
|
||||||
#expect(snap?.ipc.exists == true)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test func decodesWithLeadingNoise() async throws {
|
@Test func decodesWithLeadingNoise() async throws {
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ Short guide to verify the WhatsApp Web / Baileys stack without guessing.
|
|||||||
## Deep diagnostics
|
## Deep diagnostics
|
||||||
- Creds on disk: `ls -l ~/.clawdis/credentials/creds.json` (mtime should be recent).
|
- Creds on disk: `ls -l ~/.clawdis/credentials/creds.json` (mtime should be recent).
|
||||||
- Session store: `ls -l ~/.clawdis/sessions.json` (path can be overridden in config). Count and recent recipients are surfaced via `status`.
|
- Session store: `ls -l ~/.clawdis/sessions.json` (path can be overridden in config). Count and recent recipients are surfaced via `status`.
|
||||||
- IPC socket (if gateway is running): `ls -l ~/.clawdis/clawdis.sock`.
|
|
||||||
- Relink flow: `pnpm clawdis logout && pnpm clawdis login --provider web --verbose` when status codes 409–515 or `loggedOut` appear in logs.
|
- Relink flow: `pnpm clawdis logout && pnpm clawdis login --provider web --verbose` when status codes 409–515 or `loggedOut` appear in logs.
|
||||||
|
|
||||||
## When something fails
|
## When something fails
|
||||||
@@ -26,4 +25,4 @@ Short guide to verify the WhatsApp Web / Baileys stack without guessing.
|
|||||||
- No inbound messages → confirm linked phone is online and sender is allowed; use `pnpm clawdis heartbeat --all --verbose` to test each known recipient.
|
- No inbound messages → confirm linked phone is online and sender is allowed; use `pnpm clawdis heartbeat --all --verbose` to test each known recipient.
|
||||||
|
|
||||||
## Dedicated "health" command
|
## Dedicated "health" command
|
||||||
`pnpm clawdis health --json` runs a connect-only probe (no sends) and reports: linked creds, auth age, Baileys connect result/status code, session-store summary, IPC presence, and a probe duration. It exits non-zero if not linked or if the connect fails/timeouts. Use `--timeout <ms>` to override the 10s default.
|
`pnpm clawdis health --json` runs a connect-only probe (no sends) and reports: linked creds, auth age, Baileys connect result/status code, session-store summary, and a probe duration. It exits non-zero if not linked or if the connect fails/timeouts. Use `--timeout <ms>` to override the 10s default.
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ Goal: make replies deterministic per channel while keeping one shared context fo
|
|||||||
- **WebChat:** Always attaches to `main`, loads the full Tau transcript so desktop reflects cross-surface history, and writes new turns back to the same session.
|
- **WebChat:** Always attaches to `main`, loads the full Tau transcript so desktop reflects cross-surface history, and writes new turns back to the same session.
|
||||||
- **Implementation hints:**
|
- **Implementation hints:**
|
||||||
- Set `Surface` in each ingress (WhatsApp gateway, WebChat bridge, future Telegram).
|
- Set `Surface` in each ingress (WhatsApp gateway, WebChat bridge, future Telegram).
|
||||||
- Keep routing deterministic: originate → same surface. Use IPC/web senders accordingly.
|
- Keep routing deterministic: originate → same surface. Use the gateway WebSocket for sends; avoid side channels.
|
||||||
- Do not let the agent emit “send to X” decisions; keep that policy in the host code.
|
- Do not let the agent emit “send to X” decisions; keep that policy in the host code.
|
||||||
|
|||||||
Reference in New Issue
Block a user