ha-opencode 0.1.1 → 0.2.0

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/commands.js CHANGED
@@ -1,100 +1,79 @@
1
1
  import { notify } from "./notify.js";
2
- import { cleanupStaleSessionsManual } from "./cleanup.js";
3
2
  export class CommandHandler {
4
- mqtt;
5
- discovery;
3
+ wsClient;
6
4
  state;
7
5
  client;
8
- haConfig;
9
- constructor(mqtt, discovery, state, client, haConfig) {
10
- this.mqtt = mqtt;
11
- this.discovery = discovery;
6
+ instanceToken;
7
+ constructor(wsClient, state, client, instanceToken) {
8
+ this.wsClient = wsClient;
12
9
  this.state = state;
13
10
  this.client = client;
14
- this.haConfig = haConfig;
11
+ this.instanceToken = instanceToken;
15
12
  }
16
- async start() {
17
- const commandTopic = this.discovery.getCommandTopic();
18
- await this.mqtt.subscribe(commandTopic, this.handleMessage.bind(this));
13
+ /**
14
+ * Start listening for commands from Home Assistant.
15
+ */
16
+ start() {
17
+ this.wsClient.onCommand(this.handleCommand.bind(this));
18
+ this.wsClient.onStateRequest(this.handleStateRequest.bind(this));
19
19
  }
20
- handleMessage(_topic, payload) {
21
- let command;
22
- try {
23
- command = JSON.parse(payload);
24
- }
25
- catch (err) {
26
- console.error("[ha-opencode] Invalid command JSON:", payload);
27
- return;
28
- }
29
- if (!command.command) {
30
- console.error("[ha-opencode] Command missing 'command' field:", payload);
31
- return;
32
- }
33
- // Trigger Kitty terminal alert for incoming command (skip noisy history requests)
34
- if (!["get_history", "get_history_since", "get_agents"].includes(command.command)) {
35
- notify("HA Command Received", `Command: ${command.command}`);
20
+ handleCommand(command, sessionId, data) {
21
+ // Trigger notification for incoming command (skip noisy history requests)
22
+ if (!["get_history", "get_history_since", "get_agents"].includes(command)) {
23
+ notify("HA Command Received", `Command: ${command}`);
36
24
  }
37
25
  // Handle command asynchronously
38
- this.processCommand(command).catch((err) => {
39
- console.error("[ha-opencode] Error processing command:", err);
26
+ this.processCommand(command, sessionId, data).catch(() => {
27
+ // Silent failure - errors are handled in processCommand
40
28
  });
41
29
  }
42
- async processCommand(command) {
43
- switch (command.command) {
44
- case "permission_response":
45
- await this.handlePermissionResponse(command);
30
+ async processCommand(command, sessionId, data) {
31
+ switch (command) {
32
+ case "respond_permission":
33
+ await this.handlePermissionResponse(sessionId, data);
46
34
  break;
47
- case "prompt":
48
- await this.handlePrompt(command);
35
+ case "send_prompt":
36
+ await this.handlePrompt(sessionId, data);
49
37
  break;
50
38
  case "get_history":
51
- await this.handleGetHistory(command);
52
- break;
53
- case "get_history_since":
54
- await this.handleGetHistorySince(command);
55
- break;
56
- case "cleanup_stale_sessions":
57
- await this.handleCleanup(command);
39
+ await this.handleGetHistory(sessionId, data);
58
40
  break;
59
41
  case "get_agents":
60
- await this.handleGetAgents(command);
42
+ await this.handleGetAgents(sessionId, data);
61
43
  break;
62
44
  default:
63
- notify("Unknown Command", `Unrecognized: ${command.command}`);
45
+ notify("Unknown Command", `Unrecognized: ${command}`);
64
46
  }
65
47
  }
66
- async handleCleanup(command) {
67
- const maxAgeDays = command.max_age_days ?? 7;
68
- notify("Cleanup Started", `Removing sessions older than ${maxAgeDays} days`);
69
- try {
70
- await cleanupStaleSessionsManual(this.mqtt, {
71
- maxAgeDays,
72
- haConfig: this.haConfig,
73
- });
74
- notify("Cleanup Complete", "Check opencode/cleanup/response for results");
75
- }
76
- catch (err) {
77
- const errorMsg = err instanceof Error ? err.message : "Unknown error";
78
- notify("Cleanup Failed", errorMsg);
79
- console.error("[ha-opencode] Failed to run cleanup:", err);
80
- }
48
+ /**
49
+ * Handle state request from HA - send all current sessions.
50
+ */
51
+ handleStateRequest() {
52
+ const sessions = this.state.getAllSessions();
53
+ this.wsClient
54
+ .sendStateResponse(this.instanceToken, sessions)
55
+ .catch(() => {
56
+ // Silent failure
57
+ });
81
58
  }
82
- async handlePrompt(command) {
59
+ async handlePrompt(sessionId, command) {
83
60
  if (!command.text || command.text.trim() === "") {
84
61
  notify("Prompt Error", "Empty prompt text");
85
62
  return;
86
63
  }
87
- // Get session ID - use provided one or fall back to current session
88
- const sessionId = command.session_id || this.state.getCurrentSessionId();
89
- if (!sessionId) {
64
+ // Use provided session ID or fall back to current
65
+ const targetSessionId = sessionId || this.state.getCurrentSessionId();
66
+ if (!targetSessionId) {
90
67
  notify("Prompt Error", "No active session");
91
68
  return;
92
69
  }
93
70
  const agentInfo = command.agent ? ` [${command.agent}]` : "";
94
- notify("Prompt Received", command.text.substring(0, 50) + (command.text.length > 50 ? "..." : "") + agentInfo);
71
+ notify("Prompt Received", command.text.substring(0, 50) +
72
+ (command.text.length > 50 ? "..." : "") +
73
+ agentInfo);
95
74
  try {
96
75
  await this.client.session.prompt({
97
- path: { id: sessionId },
76
+ path: { id: targetSessionId },
98
77
  body: {
99
78
  agent: command.agent,
100
79
  parts: [{ type: "text", text: command.text }],
@@ -104,92 +83,57 @@ export class CommandHandler {
104
83
  catch (err) {
105
84
  const errorMsg = err instanceof Error ? err.message : "Unknown error";
106
85
  notify("Prompt Failed", errorMsg);
107
- console.error("[ha-opencode] Failed to send prompt:", err);
108
86
  }
109
87
  }
110
- async handleGetAgents(command) {
88
+ async handleGetAgents(sessionId, command) {
111
89
  try {
112
90
  const result = await this.client.app.agents();
113
91
  if (!result.data) {
114
- notify("Agents Error", "No agents data returned");
115
92
  return;
116
93
  }
117
- const agents = result.data.map(agent => ({
94
+ const agents = result.data.map((agent) => ({
118
95
  name: agent.name,
119
96
  description: agent.description,
120
97
  mode: agent.mode,
121
98
  }));
122
- const response = {
123
- type: "agents",
124
- request_id: command.request_id,
99
+ const responseData = {
100
+ session_id: sessionId || this.state.getCurrentSessionId() || "",
125
101
  agents,
126
- };
127
- await this.mqtt.publish(this.discovery.getResponseTopic(), response, false);
128
- // Skip notification - agents requests are frequent and noisy
129
- }
130
- catch (err) {
131
- // Only log, don't notify - agents requests are frequent
132
- console.error("[ha-opencode] Failed to fetch agents:", err);
133
- }
134
- }
135
- async handleGetHistory(command) {
136
- const sessionId = command.session_id || this.state.getCurrentSessionId();
137
- if (!sessionId) {
138
- // Skip notification - history requests are frequent and noisy
139
- console.warn("[ha-opencode] History request with no active session");
140
- return;
141
- }
142
- try {
143
- const history = await this.fetchSessionHistory(sessionId);
144
- const response = {
145
- type: "history",
146
102
  request_id: command.request_id,
147
- session_id: sessionId,
148
- session_title: history.title,
149
- messages: history.messages,
150
- fetched_at: new Date().toISOString(),
151
103
  };
152
- await this.mqtt.publish(this.discovery.getResponseTopic(), response, false);
153
- // Skip notification - history requests are frequent and noisy
104
+ await this.wsClient.sendAgentsResponse(this.instanceToken, responseData);
154
105
  }
155
- catch (err) {
156
- // Only log, don't notify - history requests are frequent
157
- console.error("[ha-opencode] Failed to fetch history:", err);
106
+ catch {
107
+ // Silent failure
158
108
  }
159
109
  }
160
- async handleGetHistorySince(command) {
161
- const sessionId = command.session_id || this.state.getCurrentSessionId();
162
- if (!sessionId) {
163
- // Skip notification - history requests are frequent and noisy
164
- console.warn("[ha-opencode] History since request with no active session");
165
- return;
166
- }
167
- if (!command.since) {
168
- console.warn("[ha-opencode] History since request missing 'since' timestamp");
169
- return;
170
- }
171
- const sinceDate = new Date(command.since);
172
- if (isNaN(sinceDate.getTime())) {
173
- console.warn("[ha-opencode] History since request with invalid 'since' timestamp:", command.since);
110
+ async handleGetHistory(sessionId, command) {
111
+ const targetSessionId = sessionId || this.state.getCurrentSessionId();
112
+ if (!targetSessionId) {
174
113
  return;
175
114
  }
176
115
  try {
177
- const history = await this.fetchSessionHistory(sessionId, sinceDate);
178
- const response = {
179
- type: "history",
180
- request_id: command.request_id,
181
- session_id: sessionId,
116
+ // Parse optional since parameter
117
+ let sinceDate;
118
+ if (command.since) {
119
+ sinceDate = new Date(command.since);
120
+ if (isNaN(sinceDate.getTime())) {
121
+ sinceDate = undefined;
122
+ }
123
+ }
124
+ const history = await this.fetchSessionHistory(targetSessionId, sinceDate);
125
+ const responseData = {
126
+ session_id: targetSessionId,
182
127
  session_title: history.title,
183
128
  messages: history.messages,
184
129
  fetched_at: new Date().toISOString(),
185
130
  since: command.since,
131
+ request_id: command.request_id,
186
132
  };
187
- await this.mqtt.publish(this.discovery.getResponseTopic(), response, false);
188
- // Skip notification - history requests are frequent and noisy
133
+ await this.wsClient.sendHistoryResponse(this.instanceToken, responseData);
189
134
  }
190
- catch (err) {
191
- // Only log, don't notify - history requests are frequent
192
- console.error("[ha-opencode] Failed to fetch history:", err);
135
+ catch {
136
+ // Silent failure
193
137
  }
194
138
  }
195
139
  async fetchSessionHistory(sessionId, since) {
@@ -208,7 +152,9 @@ export class CommandHandler {
208
152
  const parts = msg.parts || [];
209
153
  // Get timestamp from the message - time.created is a Unix timestamp in milliseconds
210
154
  const createdMs = info.time?.created;
211
- const timestamp = createdMs ? new Date(createdMs).toISOString() : new Date().toISOString();
155
+ const timestamp = createdMs
156
+ ? new Date(createdMs).toISOString()
157
+ : new Date().toISOString();
212
158
  const msgDate = new Date(timestamp);
213
159
  // Filter by since date if provided
214
160
  if (since && msgDate <= since) {
@@ -258,22 +204,27 @@ export class CommandHandler {
258
204
  if (info.role === "assistant") {
259
205
  historyMsg.model = info.modelID;
260
206
  historyMsg.provider = info.providerID;
261
- historyMsg.tokens_input = info.tokens?.input ? Number(info.tokens.input) : undefined;
262
- historyMsg.tokens_output = info.tokens?.output ? Number(info.tokens.output) : undefined;
207
+ historyMsg.tokens_input = info.tokens?.input
208
+ ? Number(info.tokens.input)
209
+ : undefined;
210
+ historyMsg.tokens_output = info.tokens?.output
211
+ ? Number(info.tokens.output)
212
+ : undefined;
263
213
  historyMsg.cost = info.cost ? Number(info.cost) : undefined;
264
214
  }
265
215
  messages.push(historyMsg);
266
216
  }
267
217
  return { title: sessionTitle, messages };
268
218
  }
269
- async handlePermissionResponse(command) {
219
+ async handlePermissionResponse(_sessionId, command) {
270
220
  const pendingPermission = this.state.getPendingPermission();
271
221
  if (!pendingPermission) {
272
222
  notify("Permission Error", "No pending permission");
273
223
  return;
274
224
  }
275
225
  // Validate permission ID matches
276
- if (command.permission_id && command.permission_id !== pendingPermission.id) {
226
+ if (command.permission_id &&
227
+ command.permission_id !== pendingPermission.id) {
277
228
  notify("Permission Error", "Permission ID mismatch");
278
229
  return;
279
230
  }
@@ -286,7 +237,7 @@ export class CommandHandler {
286
237
  try {
287
238
  await this.client.postSessionIdPermissionsPermissionId({
288
239
  path: {
289
- id: pendingPermission.sessionID,
240
+ id: pendingPermission.session_id,
290
241
  permissionID: pendingPermission.id,
291
242
  },
292
243
  body: {
@@ -294,15 +245,16 @@ export class CommandHandler {
294
245
  },
295
246
  });
296
247
  // Notify user of successful permission response
297
- const responseLabel = command.response === "once" ? "Approved (once)"
298
- : command.response === "always" ? "Approved (always)"
248
+ const responseLabel = command.response === "once"
249
+ ? "Approved (once)"
250
+ : command.response === "always"
251
+ ? "Approved (always)"
299
252
  : "Rejected";
300
253
  notify("Permission Response", responseLabel);
301
254
  await this.state.clearPermission();
302
255
  }
303
- catch (err) {
256
+ catch {
304
257
  notify("Permission Error", "Failed to send response");
305
- console.error("[ha-opencode] Failed to send permission response:", err);
306
258
  }
307
259
  }
308
260
  }
@@ -1 +1 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Home Assistant connection configuration management.
3
+ *
4
+ * Stores and retrieves the HA connection info (URL, instance token) that is
5
+ * established during pairing. This is stored in a local file so the plugin
6
+ * can automatically reconnect on restart.
7
+ */
8
+ export interface HAConnectionConfig {
9
+ url: string;
10
+ accessToken: string;
11
+ instanceToken: string;
12
+ instanceId: string;
13
+ pairedAt: string;
14
+ }
15
+ /**
16
+ * Load saved HA connection configuration.
17
+ * Returns null if no configuration exists.
18
+ */
19
+ export declare function loadHAConnectionConfig(): Promise<HAConnectionConfig | null>;
20
+ /**
21
+ * Save HA connection configuration.
22
+ */
23
+ export declare function saveHAConnectionConfig(config: HAConnectionConfig): Promise<void>;
24
+ /**
25
+ * Clear saved HA connection configuration.
26
+ * Called when unpairing or when the connection becomes invalid.
27
+ */
28
+ export declare function clearHAConnectionConfig(): Promise<void>;
29
+ /**
30
+ * Check if HA connection is configured.
31
+ */
32
+ export declare function isHAConfigured(): boolean;
33
+ /**
34
+ * Build WebSocket URL from user-provided Home Assistant URL.
35
+ * Handles various input formats:
36
+ * - http://homeassistant.local:8123 -> ws://homeassistant.local:8123/api/websocket
37
+ * - https://ha.example.com -> wss://ha.example.com/api/websocket
38
+ * - homeassistant.local:8123 -> ws://homeassistant.local:8123/api/websocket
39
+ * - ws://homeassistant.local:8123/api/websocket -> unchanged
40
+ */
41
+ export declare function buildWebSocketUrl(input: string): string;
42
+ //# sourceMappingURL=ha-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ha-config.d.ts","sourceRoot":"","sources":["../src/ha-config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD;;;GAGG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkBjF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAWtF;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,IAAI,CAAC,CAS7D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA0BvD"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Home Assistant connection configuration management.
3
+ *
4
+ * Stores and retrieves the HA connection info (URL, instance token) that is
5
+ * established during pairing. This is stored in a local file so the plugin
6
+ * can automatically reconnect on restart.
7
+ */
8
+ import { readFile, writeFile, mkdir } from "fs/promises";
9
+ import { existsSync } from "fs";
10
+ import { join } from "path";
11
+ import { homedir } from "os";
12
+ const CONFIG_DIR = join(homedir(), ".config", "opencode");
13
+ const CONFIG_FILE = join(CONFIG_DIR, "ha-connection.json");
14
+ /**
15
+ * Load saved HA connection configuration.
16
+ * Returns null if no configuration exists.
17
+ */
18
+ export async function loadHAConnectionConfig() {
19
+ try {
20
+ if (!existsSync(CONFIG_FILE)) {
21
+ return null;
22
+ }
23
+ const content = await readFile(CONFIG_FILE, "utf-8");
24
+ const config = JSON.parse(content);
25
+ // Validate required fields
26
+ if (!config.url || !config.accessToken || !config.instanceToken || !config.instanceId) {
27
+ return null;
28
+ }
29
+ return config;
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ }
35
+ /**
36
+ * Save HA connection configuration.
37
+ */
38
+ export async function saveHAConnectionConfig(config) {
39
+ try {
40
+ // Ensure config directory exists
41
+ if (!existsSync(CONFIG_DIR)) {
42
+ await mkdir(CONFIG_DIR, { recursive: true });
43
+ }
44
+ await writeFile(CONFIG_FILE, JSON.stringify(config, null, 2), "utf-8");
45
+ }
46
+ catch (err) {
47
+ throw err;
48
+ }
49
+ }
50
+ /**
51
+ * Clear saved HA connection configuration.
52
+ * Called when unpairing or when the connection becomes invalid.
53
+ */
54
+ export async function clearHAConnectionConfig() {
55
+ try {
56
+ if (existsSync(CONFIG_FILE)) {
57
+ const { unlink } = await import("fs/promises");
58
+ await unlink(CONFIG_FILE);
59
+ }
60
+ }
61
+ catch {
62
+ // Silent failure
63
+ }
64
+ }
65
+ /**
66
+ * Check if HA connection is configured.
67
+ */
68
+ export function isHAConfigured() {
69
+ return existsSync(CONFIG_FILE);
70
+ }
71
+ /**
72
+ * Build WebSocket URL from user-provided Home Assistant URL.
73
+ * Handles various input formats:
74
+ * - http://homeassistant.local:8123 -> ws://homeassistant.local:8123/api/websocket
75
+ * - https://ha.example.com -> wss://ha.example.com/api/websocket
76
+ * - homeassistant.local:8123 -> ws://homeassistant.local:8123/api/websocket
77
+ * - ws://homeassistant.local:8123/api/websocket -> unchanged
78
+ */
79
+ export function buildWebSocketUrl(input) {
80
+ let url = input.trim();
81
+ // Already a websocket URL
82
+ if (url.startsWith("ws://") || url.startsWith("wss://")) {
83
+ // Ensure it ends with the correct path
84
+ if (!url.includes("/api/websocket")) {
85
+ url = url.replace(/\/$/, "") + "/api/websocket";
86
+ }
87
+ return url;
88
+ }
89
+ // HTTP URL
90
+ if (url.startsWith("http://")) {
91
+ url = "ws://" + url.slice(7);
92
+ }
93
+ else if (url.startsWith("https://")) {
94
+ url = "wss://" + url.slice(8);
95
+ }
96
+ else {
97
+ // Plain hostname:port, assume ws://
98
+ url = "ws://" + url;
99
+ }
100
+ // Remove trailing slash and add websocket path
101
+ url = url.replace(/\/$/, "") + "/api/websocket";
102
+ return url;
103
+ }
104
+ //# sourceMappingURL=ha-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ha-config.js","sourceRoot":"","sources":["../src/ha-config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import "source-map-support/register.js";
2
- import type { Plugin } from "@opencode-ai/plugin";
2
+ import { type Plugin } from "@opencode-ai/plugin";
3
3
  export declare const HomeAssistantPlugin: Plugin;
4
4
  export default HomeAssistantPlugin;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAkBlD,eAAO,MAAM,mBAAmB,EAAE,MA4LjC,CAAC;AAGF,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAExC,OAAO,EAAE,KAAK,MAAM,EAAQ,MAAM,qBAAqB,CAAC;AA0BxD,eAAO,MAAM,mBAAmB,EAAE,MA6YjC,CAAC;AAGF,eAAe,mBAAmB,CAAC"}