flaio-cli 0.3.1

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 (271) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +461 -0
  3. package/dist/agents/agent-detector.d.ts +21 -0
  4. package/dist/agents/agent-detector.d.ts.map +1 -0
  5. package/dist/agents/agent-detector.js +109 -0
  6. package/dist/agents/agent-detector.js.map +1 -0
  7. package/dist/agents/agent-registry.d.ts +6 -0
  8. package/dist/agents/agent-registry.d.ts.map +1 -0
  9. package/dist/agents/agent-registry.js +25 -0
  10. package/dist/agents/agent-registry.js.map +1 -0
  11. package/dist/agents/agent-session.d.ts +60 -0
  12. package/dist/agents/agent-session.d.ts.map +1 -0
  13. package/dist/agents/agent-session.js +251 -0
  14. package/dist/agents/agent-session.js.map +1 -0
  15. package/dist/agents/drivers/base-driver.d.ts +37 -0
  16. package/dist/agents/drivers/base-driver.d.ts.map +1 -0
  17. package/dist/agents/drivers/base-driver.js +18 -0
  18. package/dist/agents/drivers/base-driver.js.map +1 -0
  19. package/dist/agents/drivers/claude-driver.d.ts +23 -0
  20. package/dist/agents/drivers/claude-driver.d.ts.map +1 -0
  21. package/dist/agents/drivers/claude-driver.js +61 -0
  22. package/dist/agents/drivers/claude-driver.js.map +1 -0
  23. package/dist/agents/drivers/gemini-driver.d.ts +23 -0
  24. package/dist/agents/drivers/gemini-driver.d.ts.map +1 -0
  25. package/dist/agents/drivers/gemini-driver.js +60 -0
  26. package/dist/agents/drivers/gemini-driver.js.map +1 -0
  27. package/dist/agents/session-metadata.d.ts +33 -0
  28. package/dist/agents/session-metadata.d.ts.map +1 -0
  29. package/dist/agents/session-metadata.js +34 -0
  30. package/dist/agents/session-metadata.js.map +1 -0
  31. package/dist/agents/sideband/hook-scripts.d.ts +29 -0
  32. package/dist/agents/sideband/hook-scripts.d.ts.map +1 -0
  33. package/dist/agents/sideband/hook-scripts.js +259 -0
  34. package/dist/agents/sideband/hook-scripts.js.map +1 -0
  35. package/dist/agents/sideband/sideband-receiver.d.ts +37 -0
  36. package/dist/agents/sideband/sideband-receiver.d.ts.map +1 -0
  37. package/dist/agents/sideband/sideband-receiver.js +203 -0
  38. package/dist/agents/sideband/sideband-receiver.js.map +1 -0
  39. package/dist/agents/sideband/status-resolver.d.ts +55 -0
  40. package/dist/agents/sideband/status-resolver.d.ts.map +1 -0
  41. package/dist/agents/sideband/status-resolver.js +194 -0
  42. package/dist/agents/sideband/status-resolver.js.map +1 -0
  43. package/dist/app.d.ts +3 -0
  44. package/dist/app.d.ts.map +1 -0
  45. package/dist/app.js +94 -0
  46. package/dist/app.js.map +1 -0
  47. package/dist/cli.d.ts +3 -0
  48. package/dist/cli.d.ts.map +1 -0
  49. package/dist/cli.js +188 -0
  50. package/dist/cli.js.map +1 -0
  51. package/dist/config/config.d.ts +341 -0
  52. package/dist/config/config.d.ts.map +1 -0
  53. package/dist/config/config.js +94 -0
  54. package/dist/config/config.js.map +1 -0
  55. package/dist/config/defaults.d.ts +33 -0
  56. package/dist/config/defaults.d.ts.map +1 -0
  57. package/dist/config/defaults.js +33 -0
  58. package/dist/config/defaults.js.map +1 -0
  59. package/dist/connectors/adapters/discord-adapter.d.ts +25 -0
  60. package/dist/connectors/adapters/discord-adapter.d.ts.map +1 -0
  61. package/dist/connectors/adapters/discord-adapter.js +154 -0
  62. package/dist/connectors/adapters/discord-adapter.js.map +1 -0
  63. package/dist/connectors/adapters/slack-adapter.d.ts +38 -0
  64. package/dist/connectors/adapters/slack-adapter.d.ts.map +1 -0
  65. package/dist/connectors/adapters/slack-adapter.js +502 -0
  66. package/dist/connectors/adapters/slack-adapter.js.map +1 -0
  67. package/dist/connectors/adapters/telegram-adapter.d.ts +25 -0
  68. package/dist/connectors/adapters/telegram-adapter.d.ts.map +1 -0
  69. package/dist/connectors/adapters/telegram-adapter.js +164 -0
  70. package/dist/connectors/adapters/telegram-adapter.js.map +1 -0
  71. package/dist/connectors/connector-interface.d.ts +41 -0
  72. package/dist/connectors/connector-interface.d.ts.map +1 -0
  73. package/dist/connectors/connector-interface.js +2 -0
  74. package/dist/connectors/connector-interface.js.map +1 -0
  75. package/dist/connectors/connector-manager.d.ts +24 -0
  76. package/dist/connectors/connector-manager.d.ts.map +1 -0
  77. package/dist/connectors/connector-manager.js +82 -0
  78. package/dist/connectors/connector-manager.js.map +1 -0
  79. package/dist/connectors/debug.d.ts +3 -0
  80. package/dist/connectors/debug.d.ts.map +1 -0
  81. package/dist/connectors/debug.js +16 -0
  82. package/dist/connectors/debug.js.map +1 -0
  83. package/dist/hooks/hook-server.d.ts +27 -0
  84. package/dist/hooks/hook-server.d.ts.map +1 -0
  85. package/dist/hooks/hook-server.js +149 -0
  86. package/dist/hooks/hook-server.js.map +1 -0
  87. package/dist/hooks/hook.d.ts +10 -0
  88. package/dist/hooks/hook.d.ts.map +1 -0
  89. package/dist/hooks/hook.js +58 -0
  90. package/dist/hooks/hook.js.map +1 -0
  91. package/dist/hooks/install.d.ts +8 -0
  92. package/dist/hooks/install.d.ts.map +1 -0
  93. package/dist/hooks/install.js +160 -0
  94. package/dist/hooks/install.js.map +1 -0
  95. package/dist/hooks/notification-hook.d.ts +9 -0
  96. package/dist/hooks/notification-hook.d.ts.map +1 -0
  97. package/dist/hooks/notification-hook.js +38 -0
  98. package/dist/hooks/notification-hook.js.map +1 -0
  99. package/dist/hooks/post-tool-hook.d.ts +9 -0
  100. package/dist/hooks/post-tool-hook.d.ts.map +1 -0
  101. package/dist/hooks/post-tool-hook.js +39 -0
  102. package/dist/hooks/post-tool-hook.js.map +1 -0
  103. package/dist/hooks/stop-hook.d.ts +9 -0
  104. package/dist/hooks/stop-hook.d.ts.map +1 -0
  105. package/dist/hooks/stop-hook.js +37 -0
  106. package/dist/hooks/stop-hook.js.map +1 -0
  107. package/dist/portal/ansi-renderer.d.ts +15 -0
  108. package/dist/portal/ansi-renderer.d.ts.map +1 -0
  109. package/dist/portal/ansi-renderer.js +75 -0
  110. package/dist/portal/ansi-renderer.js.map +1 -0
  111. package/dist/portal/portal-client.d.ts +18 -0
  112. package/dist/portal/portal-client.d.ts.map +1 -0
  113. package/dist/portal/portal-client.js +335 -0
  114. package/dist/portal/portal-client.js.map +1 -0
  115. package/dist/portal/portal-picker.d.ts +8 -0
  116. package/dist/portal/portal-picker.d.ts.map +1 -0
  117. package/dist/portal/portal-picker.js +145 -0
  118. package/dist/portal/portal-picker.js.map +1 -0
  119. package/dist/portal/portal-server.d.ts +24 -0
  120. package/dist/portal/portal-server.d.ts.map +1 -0
  121. package/dist/portal/portal-server.js +330 -0
  122. package/dist/portal/portal-server.js.map +1 -0
  123. package/dist/portal/shared.d.ts +79 -0
  124. package/dist/portal/shared.d.ts.map +1 -0
  125. package/dist/portal/shared.js +5 -0
  126. package/dist/portal/shared.js.map +1 -0
  127. package/dist/relay/rate-limiter.d.ts +16 -0
  128. package/dist/relay/rate-limiter.d.ts.map +1 -0
  129. package/dist/relay/rate-limiter.js +37 -0
  130. package/dist/relay/rate-limiter.js.map +1 -0
  131. package/dist/relay/relay-auth.d.ts +29 -0
  132. package/dist/relay/relay-auth.d.ts.map +1 -0
  133. package/dist/relay/relay-auth.js +129 -0
  134. package/dist/relay/relay-auth.js.map +1 -0
  135. package/dist/relay/relay-client.d.ts +52 -0
  136. package/dist/relay/relay-client.d.ts.map +1 -0
  137. package/dist/relay/relay-client.js +1102 -0
  138. package/dist/relay/relay-client.js.map +1 -0
  139. package/dist/relay/relay-crypto.d.ts +29 -0
  140. package/dist/relay/relay-crypto.d.ts.map +1 -0
  141. package/dist/relay/relay-crypto.js +100 -0
  142. package/dist/relay/relay-crypto.js.map +1 -0
  143. package/dist/relay/relay-message-schemas.d.ts +276 -0
  144. package/dist/relay/relay-message-schemas.d.ts.map +1 -0
  145. package/dist/relay/relay-message-schemas.js +137 -0
  146. package/dist/relay/relay-message-schemas.js.map +1 -0
  147. package/dist/relay/relay-protocol.d.ts +444 -0
  148. package/dist/relay/relay-protocol.d.ts.map +1 -0
  149. package/dist/relay/relay-protocol.js +15 -0
  150. package/dist/relay/relay-protocol.js.map +1 -0
  151. package/dist/relay/relay-store.d.ts +23 -0
  152. package/dist/relay/relay-store.d.ts.map +1 -0
  153. package/dist/relay/relay-store.js +54 -0
  154. package/dist/relay/relay-store.js.map +1 -0
  155. package/dist/relay/ticket-tracker.d.ts +18 -0
  156. package/dist/relay/ticket-tracker.d.ts.map +1 -0
  157. package/dist/relay/ticket-tracker.js +58 -0
  158. package/dist/relay/ticket-tracker.js.map +1 -0
  159. package/dist/store/app-store.d.ts +66 -0
  160. package/dist/store/app-store.d.ts.map +1 -0
  161. package/dist/store/app-store.js +227 -0
  162. package/dist/store/app-store.js.map +1 -0
  163. package/dist/store/connector-store.d.ts +21 -0
  164. package/dist/store/connector-store.d.ts.map +1 -0
  165. package/dist/store/connector-store.js +591 -0
  166. package/dist/store/connector-store.js.map +1 -0
  167. package/dist/store/portal-store.d.ts +5 -0
  168. package/dist/store/portal-store.d.ts.map +1 -0
  169. package/dist/store/portal-store.js +5 -0
  170. package/dist/store/portal-store.js.map +1 -0
  171. package/dist/store/settings-store.d.ts +13 -0
  172. package/dist/store/settings-store.d.ts.map +1 -0
  173. package/dist/store/settings-store.js +59 -0
  174. package/dist/store/settings-store.js.map +1 -0
  175. package/dist/terminal/pty-manager.d.ts +19 -0
  176. package/dist/terminal/pty-manager.d.ts.map +1 -0
  177. package/dist/terminal/pty-manager.js +58 -0
  178. package/dist/terminal/pty-manager.js.map +1 -0
  179. package/dist/terminal/screen-buffer.d.ts +36 -0
  180. package/dist/terminal/screen-buffer.d.ts.map +1 -0
  181. package/dist/terminal/screen-buffer.js +109 -0
  182. package/dist/terminal/screen-buffer.js.map +1 -0
  183. package/dist/terminal/xterm-bridge.d.ts +32 -0
  184. package/dist/terminal/xterm-bridge.d.ts.map +1 -0
  185. package/dist/terminal/xterm-bridge.js +168 -0
  186. package/dist/terminal/xterm-bridge.js.map +1 -0
  187. package/dist/ui/components/adopt-agent-dialog.d.ts +10 -0
  188. package/dist/ui/components/adopt-agent-dialog.d.ts.map +1 -0
  189. package/dist/ui/components/adopt-agent-dialog.js +31 -0
  190. package/dist/ui/components/adopt-agent-dialog.js.map +1 -0
  191. package/dist/ui/components/agent-tab.d.ts +17 -0
  192. package/dist/ui/components/agent-tab.d.ts.map +1 -0
  193. package/dist/ui/components/agent-tab.js +33 -0
  194. package/dist/ui/components/agent-tab.js.map +1 -0
  195. package/dist/ui/components/agents-settings-content.d.ts +7 -0
  196. package/dist/ui/components/agents-settings-content.d.ts.map +1 -0
  197. package/dist/ui/components/agents-settings-content.js +238 -0
  198. package/dist/ui/components/agents-settings-content.js.map +1 -0
  199. package/dist/ui/components/help-modal.d.ts +7 -0
  200. package/dist/ui/components/help-modal.d.ts.map +1 -0
  201. package/dist/ui/components/help-modal.js +29 -0
  202. package/dist/ui/components/help-modal.js.map +1 -0
  203. package/dist/ui/components/new-session-dialog.d.ts +8 -0
  204. package/dist/ui/components/new-session-dialog.d.ts.map +1 -0
  205. package/dist/ui/components/new-session-dialog.js +84 -0
  206. package/dist/ui/components/new-session-dialog.js.map +1 -0
  207. package/dist/ui/components/path-input.d.ts +8 -0
  208. package/dist/ui/components/path-input.d.ts.map +1 -0
  209. package/dist/ui/components/path-input.js +151 -0
  210. package/dist/ui/components/path-input.js.map +1 -0
  211. package/dist/ui/components/settings-panel.d.ts +7 -0
  212. package/dist/ui/components/settings-panel.d.ts.map +1 -0
  213. package/dist/ui/components/settings-panel.js +134 -0
  214. package/dist/ui/components/settings-panel.js.map +1 -0
  215. package/dist/ui/components/standalone-agents.d.ts +9 -0
  216. package/dist/ui/components/standalone-agents.d.ts.map +1 -0
  217. package/dist/ui/components/standalone-agents.js +28 -0
  218. package/dist/ui/components/standalone-agents.js.map +1 -0
  219. package/dist/ui/components/terminal-view.d.ts +12 -0
  220. package/dist/ui/components/terminal-view.d.ts.map +1 -0
  221. package/dist/ui/components/terminal-view.js +53 -0
  222. package/dist/ui/components/terminal-view.js.map +1 -0
  223. package/dist/ui/components/viewer-approval-dialog.d.ts +9 -0
  224. package/dist/ui/components/viewer-approval-dialog.d.ts.map +1 -0
  225. package/dist/ui/components/viewer-approval-dialog.js +38 -0
  226. package/dist/ui/components/viewer-approval-dialog.js.map +1 -0
  227. package/dist/ui/hooks/use-git-info.d.ts +8 -0
  228. package/dist/ui/hooks/use-git-info.d.ts.map +1 -0
  229. package/dist/ui/hooks/use-git-info.js +72 -0
  230. package/dist/ui/hooks/use-git-info.js.map +1 -0
  231. package/dist/ui/hooks/use-keybindings.d.ts +10 -0
  232. package/dist/ui/hooks/use-keybindings.d.ts.map +1 -0
  233. package/dist/ui/hooks/use-keybindings.js +91 -0
  234. package/dist/ui/hooks/use-keybindings.js.map +1 -0
  235. package/dist/ui/hooks/use-portal-connected.d.ts +2 -0
  236. package/dist/ui/hooks/use-portal-connected.d.ts.map +1 -0
  237. package/dist/ui/hooks/use-portal-connected.js +10 -0
  238. package/dist/ui/hooks/use-portal-connected.js.map +1 -0
  239. package/dist/ui/hooks/use-raw-input.d.ts +8 -0
  240. package/dist/ui/hooks/use-raw-input.d.ts.map +1 -0
  241. package/dist/ui/hooks/use-raw-input.js +106 -0
  242. package/dist/ui/hooks/use-raw-input.js.map +1 -0
  243. package/dist/ui/hooks/use-spinner.d.ts +2 -0
  244. package/dist/ui/hooks/use-spinner.d.ts.map +1 -0
  245. package/dist/ui/hooks/use-spinner.js +13 -0
  246. package/dist/ui/hooks/use-spinner.js.map +1 -0
  247. package/dist/ui/hooks/use-terminal-size.d.ts +5 -0
  248. package/dist/ui/hooks/use-terminal-size.d.ts.map +1 -0
  249. package/dist/ui/hooks/use-terminal-size.js +22 -0
  250. package/dist/ui/hooks/use-terminal-size.js.map +1 -0
  251. package/dist/ui/hooks/use-update-check.d.ts +6 -0
  252. package/dist/ui/hooks/use-update-check.d.ts.map +1 -0
  253. package/dist/ui/hooks/use-update-check.js +62 -0
  254. package/dist/ui/hooks/use-update-check.js.map +1 -0
  255. package/dist/ui/layout/main-pane.d.ts +13 -0
  256. package/dist/ui/layout/main-pane.d.ts.map +1 -0
  257. package/dist/ui/layout/main-pane.js +36 -0
  258. package/dist/ui/layout/main-pane.js.map +1 -0
  259. package/dist/ui/layout/shell.d.ts +17 -0
  260. package/dist/ui/layout/shell.d.ts.map +1 -0
  261. package/dist/ui/layout/shell.js +24 -0
  262. package/dist/ui/layout/shell.js.map +1 -0
  263. package/dist/ui/layout/sidebar.d.ts +12 -0
  264. package/dist/ui/layout/sidebar.d.ts.map +1 -0
  265. package/dist/ui/layout/sidebar.js +9 -0
  266. package/dist/ui/layout/sidebar.js.map +1 -0
  267. package/dist/ui/layout/status-bar.d.ts +9 -0
  268. package/dist/ui/layout/status-bar.d.ts.map +1 -0
  269. package/dist/ui/layout/status-bar.js +138 -0
  270. package/dist/ui/layout/status-bar.js.map +1 -0
  271. package/package.json +70 -0
@@ -0,0 +1,591 @@
1
+ import { createStore } from "zustand/vanilla";
2
+ import { ConnectorManager } from "../connectors/connector-manager.js";
3
+ import { SlackAdapter } from "../connectors/adapters/slack-adapter.js";
4
+ import { HookServer } from "../hooks/hook-server.js";
5
+ import { PortalServer } from "../portal/portal-server.js";
6
+ import { RelayClient } from "../relay/relay-client.js";
7
+ import { setRelayLoggedIn } from "../relay/relay-store.js";
8
+ import { installHooks } from "../hooks/install.js";
9
+ import { appStore, getSessionInstance, setPermissionPending, clearPermissionPending } from "./app-store.js";
10
+ import { settingsStore } from "./settings-store.js";
11
+ import { makeDebugLog } from "../connectors/debug.js";
12
+ const debugLog = makeDebugLog("connector");
13
+ export const connectorStatusStore = createStore(() => ({
14
+ connectors: [],
15
+ }));
16
+ function publishConnectorStatuses() {
17
+ const badges = connectorManager.getAll().map((c) => ({
18
+ name: c.name,
19
+ displayName: c.displayName,
20
+ status: c.status,
21
+ }));
22
+ connectorStatusStore.setState({ connectors: badges });
23
+ }
24
+ // ---------------------------------------------------------------------------
25
+ // Module-level singletons (same pattern as agentDetector in app-store.ts)
26
+ // ---------------------------------------------------------------------------
27
+ const connectorManager = new ConnectorManager();
28
+ const hookServer = new HookServer();
29
+ const portalServer = new PortalServer();
30
+ const relayClient = new RelayClient();
31
+ let started = false;
32
+ let unsubSettings = null;
33
+ let unsubSessions = null;
34
+ // Session status tracking for notification transitions
35
+ const prevStatuses = new Map();
36
+ // Dedup: avoid posting the same response twice (waiting_input → exited, or hook + status transition)
37
+ const lastPostedResponse = new Map();
38
+ // Track last post time per session to debounce rapid transitions
39
+ const lastPostTime = new Map();
40
+ const DEDUP_WINDOW_MS = 3000;
41
+ // Debounce + mutex state for config reactivity
42
+ let debounceTimer = null;
43
+ let syncInProgress = false;
44
+ let lastSlackFields = null;
45
+ /**
46
+ * Start the HookServer IPC and wire all bridges.
47
+ * Safe to call multiple times — only the first call has effect.
48
+ */
49
+ export async function startConnectors() {
50
+ if (started)
51
+ return;
52
+ started = true;
53
+ // Ensure settings are loaded before reading config
54
+ if (!settingsStore.getState().loaded) {
55
+ settingsStore.getState().load();
56
+ }
57
+ // Install/upgrade hooks in ~/.claude/settings.json (replaces legacy hooks)
58
+ installHooks({ silent: true });
59
+ await hookServer.start();
60
+ await portalServer.start();
61
+ wireHookBridge();
62
+ wirePromptBridge();
63
+ wireSessionNotifications();
64
+ await syncSlackFromConfig();
65
+ wireConfigReactivity();
66
+ // Start relay if enabled and authenticated
67
+ await syncRelayFromConfig();
68
+ wireRelayConfigReactivity();
69
+ }
70
+ /**
71
+ * Tear down everything cleanly.
72
+ */
73
+ export async function stopConnectors() {
74
+ if (!started)
75
+ return;
76
+ started = false;
77
+ if (debounceTimer) {
78
+ clearTimeout(debounceTimer);
79
+ debounceTimer = null;
80
+ }
81
+ if (relayDebounceTimer) {
82
+ clearTimeout(relayDebounceTimer);
83
+ relayDebounceTimer = null;
84
+ }
85
+ if (unsubSettings) {
86
+ unsubSettings();
87
+ unsubSettings = null;
88
+ }
89
+ if (unsubRelaySettings) {
90
+ unsubRelaySettings();
91
+ unsubRelaySettings = null;
92
+ }
93
+ if (unsubSessions) {
94
+ unsubSessions();
95
+ unsubSessions = null;
96
+ }
97
+ prevStatuses.clear();
98
+ lastPostedResponse.clear();
99
+ lastPostTime.clear();
100
+ lastSlackFields = null;
101
+ await relayClient.stop();
102
+ await portalServer.stop();
103
+ await connectorManager.disconnectAll();
104
+ publishConnectorStatuses();
105
+ await hookServer.stop();
106
+ }
107
+ // ---------------------------------------------------------------------------
108
+ // Internal wiring
109
+ // ---------------------------------------------------------------------------
110
+ /**
111
+ * Resolve a hook-originated session ID (Claude Code's session_id) to our
112
+ * internal AgentSession.id by matching on cwd. Falls back to the hook
113
+ * session ID as-is when no match is found.
114
+ */
115
+ function resolveInternalSessionId(hookSessionId, cwd) {
116
+ if (!cwd)
117
+ return hookSessionId;
118
+ const match = appStore.getState().sessions.find((s) => s.cwd === cwd);
119
+ return match ? match.id : hookSessionId;
120
+ }
121
+ /**
122
+ * Check whether the hook event originated from an agent session managed by
123
+ * this app (matched by cwd). External/standalone Claude Code instances
124
+ * should NOT have their events forwarded to Slack.
125
+ */
126
+ function isInternalSession(cwd) {
127
+ if (!cwd)
128
+ return false;
129
+ return appStore.getState().sessions.some((s) => s.cwd === cwd);
130
+ }
131
+ /**
132
+ * Bridge HookServer events → ConnectorManager
133
+ */
134
+ function wireHookBridge() {
135
+ // permission_request: async — await connector reply then call socket reply callback
136
+ // If no connectors are connected or the agent isn't managed by this app,
137
+ // reply with "ack" so the hook falls through instead of denying.
138
+ hookServer.on("permission_request", (payload, reply) => {
139
+ const cwd = String(payload.cwd ?? "");
140
+ // Only forward events from agents running inside this app
141
+ if (!isInternalSession(cwd)) {
142
+ reply({ type: "ack", payload: {} });
143
+ return;
144
+ }
145
+ const connected = connectorManager.getAll().filter((c) => c.status === "connected");
146
+ if (connected.length === 0) {
147
+ // No connectors to ask — let hook fall through to default behavior
148
+ reply({ type: "ack", payload: {} });
149
+ return;
150
+ }
151
+ const sessionId = resolveInternalSessionId(String(payload.sessionId ?? ""), cwd);
152
+ // Show blue "waiting_permission" badge while awaiting connector reply.
153
+ // Set status first, then arm the guard so the driver's 1s poll can't
154
+ // overwrite it with "running". The guard auto-clears if the agent
155
+ // transitions to waiting_input/exited (self-healing).
156
+ appStore.getState().updateSessionStatus(sessionId, "waiting_permission");
157
+ setPermissionPending(sessionId);
158
+ (async () => {
159
+ try {
160
+ const result = await connectorManager.requestPermission({
161
+ sessionId,
162
+ toolName: String(payload.toolName ?? ""),
163
+ toolInput: payload.toolInput ?? {},
164
+ cwd,
165
+ });
166
+ reply({
167
+ type: "permission_reply",
168
+ payload: { allowed: result.allowed, message: result.message },
169
+ });
170
+ }
171
+ catch {
172
+ reply({
173
+ type: "permission_reply",
174
+ payload: { allowed: false, message: "Connector error" },
175
+ });
176
+ }
177
+ finally {
178
+ clearPermissionPending(sessionId);
179
+ appStore.getState().updateSessionStatus(sessionId, "running");
180
+ }
181
+ })();
182
+ });
183
+ // post_tool_use: acknowledged but not forwarded to Slack
184
+ // (agent responses are sent via the "notification" event instead)
185
+ hookServer.on("post_tool_use", () => { });
186
+ // notification: from Claude Code's Notification hook.
187
+ // Filter out "waiting for input" noise — forward actual responses.
188
+ // Only forward for agents managed by this app.
189
+ hookServer.on("notification", (payload) => {
190
+ const cwd = String(payload.cwd ?? "");
191
+ if (!isInternalSession(cwd))
192
+ return;
193
+ const sessionId = resolveInternalSessionId(String(payload.sessionId ?? ""), cwd);
194
+ const message = String(payload.message ?? "");
195
+ if (!message)
196
+ return;
197
+ // Filter out noise — desktop notifications about waiting for input
198
+ const lower = message.toLowerCase();
199
+ if (lower.includes("waiting for") || lower.includes("needs input") || lower.includes("needs your input"))
200
+ return;
201
+ // Dedup: skip if we just posted this exact content via wireSessionNotifications
202
+ if (message === lastPostedResponse.get(sessionId)) {
203
+ const lastTime = lastPostTime.get(sessionId) ?? 0;
204
+ if (Date.now() - lastTime < DEDUP_WINDOW_MS) {
205
+ debugLog(`dedup: skipping hook notification for ${sessionId} (same as recent post)`);
206
+ return;
207
+ }
208
+ }
209
+ lastPostedResponse.set(sessionId, message);
210
+ lastPostTime.set(sessionId, Date.now());
211
+ connectorManager
212
+ .postNotification({
213
+ sessionId,
214
+ type: "response",
215
+ message,
216
+ cwd,
217
+ })
218
+ .catch((err) => {
219
+ debugLog(`hook notification post failed for ${sessionId}:`, String(err));
220
+ });
221
+ });
222
+ // stop: session stopped notification (only for managed agents)
223
+ hookServer.on("stop", (payload) => {
224
+ const cwd = String(payload.cwd ?? "");
225
+ if (!isInternalSession(cwd))
226
+ return;
227
+ const sessionId = resolveInternalSessionId(String(payload.sessionId ?? ""), cwd);
228
+ connectorManager
229
+ .postNotification({
230
+ sessionId,
231
+ type: "stopped",
232
+ message: `Session exited (code ${payload.exitCode ?? "?"})`,
233
+ cwd,
234
+ })
235
+ .catch((err) => {
236
+ debugLog(`stop notification failed for ${sessionId}:`, String(err));
237
+ });
238
+ });
239
+ }
240
+ /**
241
+ * Route inbound Slack messages to the correct agent's PTY input.
242
+ * If a sessionId is provided (thread-routed), target that session directly.
243
+ * Otherwise fall back to the active session.
244
+ */
245
+ function wirePromptBridge() {
246
+ connectorManager.on("prompt", (text, sessionId) => {
247
+ let session = sessionId ? getSessionInstance(sessionId) : null;
248
+ if (!session) {
249
+ session = appStore.getState().getActiveSession();
250
+ }
251
+ if (session) {
252
+ // Write text first, then send Enter as a separate event after a short
253
+ // delay so the agent's input handler can commit the text before submission.
254
+ session.write(text);
255
+ setTimeout(() => session.write("\r"), 100);
256
+ }
257
+ });
258
+ }
259
+ /**
260
+ * Extract only the agent's latest response.
261
+ * First tries the viewport content (from the session instance, already processed by xterm).
262
+ * Falls back to the full scrollback buffer when the prompt scrolled off-screen.
263
+ */
264
+ function extractLatestResponse(sessionId) {
265
+ const session = getSessionInstance(sessionId);
266
+ if (!session)
267
+ return null;
268
+ // Primary: use viewport content from the session (reliable — already flushed by xterm)
269
+ const content = session.getContent();
270
+ if (content && content.length > 0) {
271
+ const viewportLines = content.map((line) => line.map((span) => span.text).join("").trimEnd());
272
+ const result = extractFromLines(viewportLines);
273
+ if (result)
274
+ return result;
275
+ }
276
+ // Fallback: read scrollback for long responses where prompt scrolled off viewport
277
+ return extractFromLines(session.getPlainText(500));
278
+ }
279
+ /**
280
+ * Find the last user prompt (❯ with text), take lines after it,
281
+ * and strip terminal chrome / hook output.
282
+ */
283
+ function extractFromLines(allLines) {
284
+ // Find the last user prompt line — several prompt styles:
285
+ // "❯ sometext", "$ sometext", or Claude Code's "human>" / "H:"
286
+ // NOTE: ">" is intentionally excluded — it matches Markdown blockquotes
287
+ // (`> quoted text`) which appear in agent responses, causing truncation.
288
+ let promptIdx = -1;
289
+ for (let i = allLines.length - 1; i >= 0; i--) {
290
+ const l = allLines[i];
291
+ // Match "❯ sometext" or "$ sometext" but not bare prompts
292
+ if (/^[❯$]\s+\S/.test(l)) {
293
+ promptIdx = i;
294
+ break;
295
+ }
296
+ }
297
+ if (promptIdx < 0)
298
+ return null;
299
+ // Take lines after the prompt
300
+ const after = allLines.slice(promptIdx + 1);
301
+ // Filter out terminal chrome and noise
302
+ const cleaned = after.filter((l) => {
303
+ if (!l)
304
+ return false;
305
+ // Dividers (solid lines of dashes, equals, etc.)
306
+ if (/^[─━═\-]+$/.test(l))
307
+ return false;
308
+ // Box drawing borders
309
+ if (/^[╭╰╮╯│┌└┐┘├┤┬┴┼]/.test(l))
310
+ return false;
311
+ if (/[╭╰╮╯│┌└┐┘├┤┬┴┼]$/.test(l.trimEnd()))
312
+ return false;
313
+ // Empty prompt line (excludes ">" — see prompt-detection note above)
314
+ if (/^[❯$]\s*$/.test(l))
315
+ return false;
316
+ // Hook output lines
317
+ if (/^\s*⏺\s+(Ran|Running|Read|Edit|Write|Bash|Glob|Grep|Task)\b/.test(l))
318
+ return false;
319
+ if (/^\s*[⎿]\s/.test(l))
320
+ return false;
321
+ if (/hook error/i.test(l))
322
+ return false;
323
+ // Claude Code status/chrome lines
324
+ if (/\?\s+for shortcuts/i.test(l))
325
+ return false;
326
+ if (/\/ide\s+for\s/i.test(l))
327
+ return false;
328
+ if (/\/help/i.test(l) && /shortcuts|commands/i.test(l))
329
+ return false;
330
+ // Update/install notices
331
+ if (/update available/i.test(l))
332
+ return false;
333
+ if (/npm install -g/i.test(l))
334
+ return false;
335
+ if (/npm update/i.test(l))
336
+ return false;
337
+ // Cost / token stats bar
338
+ if (/^\s*\$[\d.]+\s+(cost|total)/i.test(l))
339
+ return false;
340
+ if (/tokens?[:\s]+[\d,]+/i.test(l) && /cost|input|output/i.test(l))
341
+ return false;
342
+ // Model name on its own line
343
+ if (/^\s*claude-/i.test(l) && l.trim().length < 80)
344
+ return false;
345
+ // "Press Enter" / "Esc to cancel" prompts
346
+ if (/^\s*(Press|Esc\s)/i.test(l))
347
+ return false;
348
+ // Compact mode tip, auto-update notice
349
+ if (/^\s*tip:/i.test(l))
350
+ return false;
351
+ if (/^\s*Run\s.*to update/i.test(l))
352
+ return false;
353
+ // Progress bars / spinners
354
+ if (/^\s*[⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏⣾⣽⣻⢿⡿⣟⣯⣷]\s/.test(l))
355
+ return false;
356
+ // ANSI escape-only lines (after stripping — but these appear as empty)
357
+ if (l.replace(/\x1B\[[0-9;]*[a-zA-Z]/g, "").trim() === "")
358
+ return false;
359
+ return true;
360
+ });
361
+ const text = cleaned.join("\n").trim();
362
+ return text || null;
363
+ }
364
+ /**
365
+ * Subscribe to appStore to detect session status transitions
366
+ * and post notifications to connectors.
367
+ */
368
+ function wireSessionNotifications() {
369
+ // Initialize tracking from current state
370
+ for (const s of appStore.getState().sessions) {
371
+ prevStatuses.set(s.id, s.status);
372
+ }
373
+ unsubSessions = appStore.subscribe((state) => {
374
+ const currentIds = new Set();
375
+ for (const s of state.sessions) {
376
+ currentIds.add(s.id);
377
+ const prev = prevStatuses.get(s.id);
378
+ if (prev !== s.status) {
379
+ prevStatuses.set(s.id, s.status);
380
+ // Detect meaningful transitions
381
+ if (prev === "starting" && s.status === "running") {
382
+ connectorManager
383
+ .postNotification({
384
+ sessionId: s.id,
385
+ type: "started",
386
+ message: `Session started (${s.displayName})`,
387
+ cwd: s.cwd,
388
+ })
389
+ .catch((err) => {
390
+ debugLog(`started notification failed for ${s.id}:`, String(err));
391
+ });
392
+ }
393
+ else if (s.status === "running" &&
394
+ (prev === "waiting_input" || prev === "idle")) {
395
+ // Agent started working — emit typing notification for placeholder
396
+ connectorManager
397
+ .postNotification({
398
+ sessionId: s.id,
399
+ type: "typing",
400
+ message: "Thinking...",
401
+ cwd: s.cwd,
402
+ })
403
+ .catch((err) => {
404
+ debugLog(`typing notification failed for ${s.id}:`, String(err));
405
+ });
406
+ }
407
+ else if (s.status === "waiting_input" || s.status === "exited") {
408
+ // Agent finished responding — extract latest response after a short
409
+ // delay so the ScreenBuffer's 30fps debounce can flush fresh content.
410
+ const sessionId = s.id;
411
+ const cwd = s.cwd;
412
+ const displayName = s.displayName;
413
+ const isExited = s.status === "exited";
414
+ setTimeout(() => {
415
+ const response = extractLatestResponse(sessionId);
416
+ if (response) {
417
+ // Dedup: skip if same content posted recently (hook or prior transition)
418
+ const lastContent = lastPostedResponse.get(sessionId);
419
+ const lastTime = lastPostTime.get(sessionId) ?? 0;
420
+ if (response === lastContent && Date.now() - lastTime < DEDUP_WINDOW_MS) {
421
+ debugLog(`dedup: skipping status-transition post for ${sessionId}`);
422
+ }
423
+ else {
424
+ lastPostedResponse.set(sessionId, response);
425
+ lastPostTime.set(sessionId, Date.now());
426
+ connectorManager
427
+ .postNotification({
428
+ sessionId,
429
+ type: "response",
430
+ message: response,
431
+ cwd,
432
+ })
433
+ .catch((err) => {
434
+ debugLog(`response post failed for ${sessionId}:`, String(err));
435
+ });
436
+ }
437
+ }
438
+ else {
439
+ debugLog(`no extractable response for ${sessionId} after transition`);
440
+ }
441
+ if (isExited) {
442
+ connectorManager
443
+ .postNotification({
444
+ sessionId,
445
+ type: "stopped",
446
+ message: `Session exited (${displayName})`,
447
+ cwd,
448
+ })
449
+ .catch((err) => {
450
+ debugLog(`exit notification failed for ${sessionId}:`, String(err));
451
+ });
452
+ }
453
+ }, 150);
454
+ }
455
+ }
456
+ }
457
+ // Clean up map entries for removed sessions
458
+ for (const id of prevStatuses.keys()) {
459
+ if (!currentIds.has(id)) {
460
+ prevStatuses.delete(id);
461
+ lastPostedResponse.delete(id);
462
+ lastPostTime.delete(id);
463
+ }
464
+ }
465
+ });
466
+ }
467
+ /**
468
+ * Sync SlackAdapter from current settings config.
469
+ * Tears down existing adapter if present, then creates a new one if config is valid.
470
+ */
471
+ async function syncSlackFromConfig() {
472
+ const { config } = settingsStore.getState();
473
+ const slack = config.connectors.slack;
474
+ // Tear down existing adapter if registered
475
+ const existing = connectorManager.get("slack");
476
+ if (existing) {
477
+ try {
478
+ await existing.disconnect();
479
+ }
480
+ catch {
481
+ // Best effort
482
+ }
483
+ connectorManager.unregister("slack");
484
+ }
485
+ // Register and connect if enabled with required fields
486
+ if (slack.enabled && slack.botToken && slack.channelId) {
487
+ const adapterConfig = {
488
+ botToken: slack.botToken,
489
+ channelId: slack.channelId,
490
+ appToken: slack.appToken,
491
+ pollInterval: slack.pollInterval,
492
+ timeout: slack.timeout,
493
+ };
494
+ const adapter = new SlackAdapter(adapterConfig);
495
+ connectorManager.register(adapter);
496
+ try {
497
+ await adapter.connect();
498
+ }
499
+ catch {
500
+ // Error status is set inside the adapter
501
+ }
502
+ }
503
+ publishConnectorStatuses();
504
+ }
505
+ /**
506
+ * Watch settingsStore for Slack config changes.
507
+ * Debounced (1s) with shallow comparison and mutex to prevent reconnect storms.
508
+ */
509
+ function wireConfigReactivity() {
510
+ // Snapshot initial state
511
+ lastSlackFields = serializeSlackConfig();
512
+ unsubSettings = settingsStore.subscribe(() => {
513
+ const current = serializeSlackConfig();
514
+ // Skip no-ops
515
+ if (current === lastSlackFields)
516
+ return;
517
+ lastSlackFields = current;
518
+ // Debounce to avoid reconnect storms while typing tokens
519
+ if (debounceTimer)
520
+ clearTimeout(debounceTimer);
521
+ debounceTimer = setTimeout(() => {
522
+ debounceTimer = null;
523
+ // Mutex to prevent concurrent syncs from interleaving
524
+ if (syncInProgress)
525
+ return;
526
+ syncInProgress = true;
527
+ syncSlackFromConfig().finally(() => {
528
+ syncInProgress = false;
529
+ });
530
+ }, 1000);
531
+ });
532
+ }
533
+ // ---------------------------------------------------------------------------
534
+ // Relay client lifecycle
535
+ // ---------------------------------------------------------------------------
536
+ let relayDebounceTimer = null;
537
+ let relaySyncInProgress = false;
538
+ let lastRelayFields = null;
539
+ let unsubRelaySettings = null;
540
+ async function syncRelayFromConfig() {
541
+ const { config } = settingsStore.getState();
542
+ const relay = config.relay;
543
+ setRelayLoggedIn(!!relay.authToken);
544
+ // Stop relay if disabled or no token
545
+ if (!relay.enabled || !relay.authToken) {
546
+ await relayClient.stop();
547
+ return;
548
+ }
549
+ // Start if auto-connect is on
550
+ if (relay.autoConnect) {
551
+ await relayClient.start();
552
+ }
553
+ }
554
+ function wireRelayConfigReactivity() {
555
+ lastRelayFields = serializeRelayConfig();
556
+ unsubRelaySettings = settingsStore.subscribe(() => {
557
+ const current = serializeRelayConfig();
558
+ if (current === lastRelayFields)
559
+ return;
560
+ lastRelayFields = current;
561
+ if (relayDebounceTimer)
562
+ clearTimeout(relayDebounceTimer);
563
+ relayDebounceTimer = setTimeout(() => {
564
+ relayDebounceTimer = null;
565
+ if (relaySyncInProgress)
566
+ return;
567
+ relaySyncInProgress = true;
568
+ syncRelayFromConfig().finally(() => {
569
+ relaySyncInProgress = false;
570
+ });
571
+ }, 1000);
572
+ });
573
+ }
574
+ function serializeRelayConfig() {
575
+ const { config } = settingsStore.getState();
576
+ const r = config.relay;
577
+ return JSON.stringify([r.enabled, r.authToken, r.autoConnect]);
578
+ }
579
+ function serializeSlackConfig() {
580
+ const { config } = settingsStore.getState();
581
+ const s = config.connectors.slack;
582
+ return JSON.stringify([
583
+ s.enabled,
584
+ s.botToken,
585
+ s.appToken,
586
+ s.channelId,
587
+ s.pollInterval,
588
+ s.timeout,
589
+ ]);
590
+ }
591
+ //# sourceMappingURL=connector-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connector-store.js","sourceRoot":"","sources":["../../src/store/connector-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export interface PortalState {
2
+ connectedSessionIds: Set<string>;
3
+ }
4
+ export declare const portalStore: import("zustand/vanilla").StoreApi<PortalState>;
5
+ //# sourceMappingURL=portal-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-store.d.ts","sourceRoot":"","sources":["../../src/store/portal-store.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,mBAAmB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,eAAO,MAAM,WAAW,iDAErB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { createStore } from "zustand/vanilla";
2
+ export const portalStore = createStore()(() => ({
3
+ connectedSessionIds: new Set(),
4
+ }));
5
+ //# sourceMappingURL=portal-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-store.js","sourceRoot":"","sources":["../../src/store/portal-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM9C,MAAM,CAAC,MAAM,WAAW,GAAG,WAAW,EAAe,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3D,mBAAmB,EAAE,IAAI,GAAG,EAAU;CACvC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { type AppConfig } from "../config/config.js";
2
+ export interface SettingsState {
3
+ config: AppConfig;
4
+ loaded: boolean;
5
+ load: () => void;
6
+ save: () => void;
7
+ update: (patch: Partial<AppConfig>) => void;
8
+ updateConnector: (name: "slack" | "discord" | "telegram", patch: Record<string, unknown>) => void;
9
+ updateUi: (patch: Record<string, unknown>) => void;
10
+ updateRelay: (patch: Record<string, unknown>) => void;
11
+ }
12
+ export declare const settingsStore: import("zustand/vanilla").StoreApi<SettingsState>;
13
+ //# sourceMappingURL=settings-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store.d.ts","sourceRoot":"","sources":["../../src/store/settings-store.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAEhB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;IAC5C,eAAe,EAAE,CACf,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,UAAU,EACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC3B,IAAI,CAAC;IACV,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACvD;AAED,eAAO,MAAM,aAAa,mDA6DvB,CAAC"}