ha-ai-mcp-server 0.3.9 → 0.5.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.
Files changed (58) hide show
  1. package/dist/adapters/addon/addon.adapter.d.ts +13 -2
  2. package/dist/adapters/addon/addon.adapter.d.ts.map +1 -1
  3. package/dist/adapters/addon/addon.adapter.js +86 -4
  4. package/dist/adapters/addon/addon.adapter.js.map +1 -1
  5. package/dist/adapters/ha/ha-rest.adapter.d.ts +3 -1
  6. package/dist/adapters/ha/ha-rest.adapter.d.ts.map +1 -1
  7. package/dist/adapters/ha/ha-rest.adapter.js +6 -2
  8. package/dist/adapters/ha/ha-rest.adapter.js.map +1 -1
  9. package/dist/cli/skills.d.ts.map +1 -1
  10. package/dist/cli/skills.js +29 -10
  11. package/dist/cli/skills.js.map +1 -1
  12. package/dist/core/config.d.ts +8 -0
  13. package/dist/core/config.d.ts.map +1 -1
  14. package/dist/core/config.js +6 -0
  15. package/dist/core/config.js.map +1 -1
  16. package/dist/domain/ports/addon-client.port.d.ts +71 -1
  17. package/dist/domain/ports/addon-client.port.d.ts.map +1 -1
  18. package/dist/domain/ports/ha-client.port.d.ts +3 -1
  19. package/dist/domain/ports/ha-client.port.d.ts.map +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +10 -1
  22. package/dist/index.js.map +1 -1
  23. package/dist/tools/agent.d.ts +18 -0
  24. package/dist/tools/agent.d.ts.map +1 -0
  25. package/dist/tools/agent.js +78 -0
  26. package/dist/tools/agent.js.map +1 -0
  27. package/dist/tools/audit.d.ts +21 -0
  28. package/dist/tools/audit.d.ts.map +1 -0
  29. package/dist/tools/audit.js +60 -0
  30. package/dist/tools/audit.js.map +1 -0
  31. package/dist/tools/automation.d.ts +2 -0
  32. package/dist/tools/automation.d.ts.map +1 -1
  33. package/dist/tools/automation.js +5 -0
  34. package/dist/tools/automation.js.map +1 -1
  35. package/dist/tools/dashboard.d.ts +2 -0
  36. package/dist/tools/dashboard.d.ts.map +1 -1
  37. package/dist/tools/dashboard.js +8 -0
  38. package/dist/tools/dashboard.js.map +1 -1
  39. package/dist/tools/system.d.ts +6 -0
  40. package/dist/tools/system.d.ts.map +1 -1
  41. package/dist/tools/system.js +16 -2
  42. package/dist/tools/system.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/adapters/addon/addon.adapter.ts +116 -10
  45. package/src/adapters/ha/ha-rest.adapter.ts +6 -2
  46. package/src/cli/skills.ts +30 -10
  47. package/src/core/config.ts +8 -0
  48. package/src/domain/ports/addon-client.port.ts +81 -2
  49. package/src/domain/ports/ha-client.port.ts +1 -1
  50. package/src/index.ts +10 -1
  51. package/src/tools/agent.ts +100 -0
  52. package/src/tools/audit.ts +77 -0
  53. package/src/tools/automation.ts +6 -1
  54. package/src/tools/dashboard.ts +9 -1
  55. package/src/tools/system.ts +19 -5
  56. package/tests/clients.test.ts +181 -2
  57. package/tests/e2e-smoke.test.ts +4 -1
  58. package/tests/tools.test.ts +49 -2
@@ -1,8 +1,10 @@
1
- import { AddonHealthResult, FileReadResult, FileWriteResult, IAddonClient } from "../../domain/ports/addon-client.port.js";
1
+ import { AddonHealthResult, AuditQueryParams, AuditQueryResponse, FileReadResult, FileWriteResult, IAddonClient, IssueTokenParams, IssueTokenResponse, PoliciesResponse } from "../../domain/ports/addon-client.port.js";
2
2
  import { BackupRestoreResult, LogsTailResult, SnapshotInfo } from "../../domain/models/system.js";
3
3
  export interface AddonClientOptions {
4
4
  addonUrl: string;
5
5
  addonKey: string;
6
+ agentKey?: string;
7
+ agentId?: string;
6
8
  timeoutMs?: number;
7
9
  }
8
10
  export declare class AddonAdapter implements IAddonClient {
@@ -13,10 +15,19 @@ export declare class AddonAdapter implements IAddonClient {
13
15
  writeFile(path: string, content: string, options?: {
14
16
  validateYaml?: boolean;
15
17
  label?: string;
18
+ rationale?: string;
16
19
  }): Promise<FileWriteResult>;
17
20
  listSnapshots(): Promise<SnapshotInfo[]>;
18
- restoreSnapshot(snapshotId: string): Promise<BackupRestoreResult>;
21
+ restoreSnapshot(snapshotId: string, options?: {
22
+ rationale?: string;
23
+ }): Promise<BackupRestoreResult>;
19
24
  getLogs(lines?: number): Promise<LogsTailResult>;
25
+ getAuditLogs(params?: AuditQueryParams): Promise<AuditQueryResponse>;
26
+ issueAgentToken(params: IssueTokenParams): Promise<IssueTokenResponse>;
27
+ getAgentPolicies(): Promise<PoliciesResponse>;
28
+ authorize(tool: string, target?: string, domain?: string, service?: string, options?: {
29
+ rationale?: string;
30
+ }): Promise<void>;
20
31
  }
21
32
  export { AddonAdapter as AddonClient };
22
33
  //# sourceMappingURL=addon.adapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addon.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/addon/addon.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,eAAe,EACf,YAAY,EACb,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,YAAW,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA0B7D,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS/C,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAO,GACvD,OAAO,CAAC,eAAe,CAAC;IAcrB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IASxC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAWjE,OAAO,CAAC,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,cAAc,CAAC;CAQ5D;AAGD,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,CAAC"}
1
+ {"version":3,"file":"addon.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/addon/addon.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAa,YAAW,YAAY;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,kBAAkB,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA0B7D,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC;IASzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS/C,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GAC3E,OAAO,CAAC,eAAe,CAAC;IAsBrB,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IASxC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAenG,OAAO,CAAC,KAAK,GAAE,MAAY,GAAG,OAAO,CAAC,cAAc,CAAC;IASrD,YAAY,CAAC,MAAM,GAAE,gBAAqB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAwBxE,eAAe,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAsBtE,gBAAgB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAS7C,SAAS,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/B,OAAO,CAAC,IAAI,CAAC;CAyBjB;AAGD,OAAO,EAAE,YAAY,IAAI,WAAW,EAAE,CAAC"}
@@ -12,7 +12,7 @@ export class AddonAdapter {
12
12
  }
13
13
  else {
14
14
  url = options.addonUrl;
15
- key = options.addonKey;
15
+ key = options.agentKey || options.addonKey;
16
16
  timeout = options.timeoutMs ?? 10000;
17
17
  }
18
18
  const cleanUrl = url.replace(/\/+$/, "");
@@ -45,12 +45,16 @@ export class AddonAdapter {
45
45
  }
46
46
  async writeFile(path, content, options = {}) {
47
47
  try {
48
+ const headers = {};
49
+ if (options.rationale) {
50
+ headers["X-Agent-Rationale"] = options.rationale;
51
+ }
48
52
  const resp = await this.client.post("/api/v1/file/write", {
49
53
  path,
50
54
  content,
51
55
  validate_yaml: options.validateYaml ?? true,
52
56
  label: options.label ?? "",
53
- });
57
+ }, { headers });
54
58
  return resp.data;
55
59
  }
56
60
  catch (err) {
@@ -66,11 +70,15 @@ export class AddonAdapter {
66
70
  throw new ClientError(`Addon listSnapshots failed: ${err.message}`, err.response?.status);
67
71
  }
68
72
  }
69
- async restoreSnapshot(snapshotId) {
73
+ async restoreSnapshot(snapshotId, options) {
70
74
  try {
75
+ const headers = {};
76
+ if (options?.rationale) {
77
+ headers["X-Agent-Rationale"] = options.rationale;
78
+ }
71
79
  const resp = await this.client.post("/api/v1/backup/restore", {
72
80
  snapshot_id: snapshotId,
73
- });
81
+ }, { headers });
74
82
  return resp.data;
75
83
  }
76
84
  catch (err) {
@@ -86,6 +94,80 @@ export class AddonAdapter {
86
94
  throw new ClientError(`Addon getLogs failed: ${err.message}`, err.response?.status);
87
95
  }
88
96
  }
97
+ async getAuditLogs(params = {}) {
98
+ try {
99
+ const queryParams = {};
100
+ if (params.agent_id !== undefined)
101
+ queryParams.agent_id = params.agent_id;
102
+ if (params.role !== undefined)
103
+ queryParams.role = params.role;
104
+ if (params.status !== undefined)
105
+ queryParams.status = params.status;
106
+ if (params.limit !== undefined)
107
+ queryParams.limit = params.limit;
108
+ if (params.since !== undefined)
109
+ queryParams.since = params.since;
110
+ const headers = {};
111
+ if (params.rationale) {
112
+ headers["X-Agent-Rationale"] = params.rationale;
113
+ }
114
+ const resp = await this.client.get("/api/v1/audit/logs", {
115
+ params: queryParams,
116
+ headers,
117
+ });
118
+ return resp.data;
119
+ }
120
+ catch (err) {
121
+ throw new ClientError(`Addon getAuditLogs failed: ${err.message}`, err.response?.status);
122
+ }
123
+ }
124
+ async issueAgentToken(params) {
125
+ try {
126
+ const headers = {};
127
+ if (params.rationale) {
128
+ headers["X-Agent-Rationale"] = params.rationale;
129
+ }
130
+ const resp = await this.client.post("/api/v1/agent/token", {
131
+ agent_id: params.agent_id,
132
+ role: params.role,
133
+ ttl_minutes: params.ttl_minutes ?? 60,
134
+ }, { headers });
135
+ return resp.data;
136
+ }
137
+ catch (err) {
138
+ throw new ClientError(`Addon issueAgentToken failed: ${err.message}`, err.response?.status);
139
+ }
140
+ }
141
+ async getAgentPolicies() {
142
+ try {
143
+ const resp = await this.client.get("/api/v1/agent/policies");
144
+ return resp.data;
145
+ }
146
+ catch (err) {
147
+ throw new ClientError(`Addon getAgentPolicies failed: ${err.message}`, err.response?.status);
148
+ }
149
+ }
150
+ async authorize(tool, target, domain, service, options) {
151
+ try {
152
+ const headers = {};
153
+ if (options?.rationale) {
154
+ headers["X-Agent-Rationale"] = options.rationale;
155
+ }
156
+ await this.client.post("/api/v1/audit/authorize", {
157
+ tool,
158
+ target,
159
+ domain,
160
+ service,
161
+ }, { headers });
162
+ }
163
+ catch (err) {
164
+ let errStr = err.message;
165
+ if (err.response?.data?.detail?.error) {
166
+ errStr = err.response.data.detail.error;
167
+ }
168
+ throw new Error(`Authorization denied for ${tool}: ${errStr}`);
169
+ }
170
+ }
89
171
  }
90
172
  // Backward-compatible alias
91
173
  export { AddonAdapter as AddonClient };
@@ -1 +1 @@
1
- {"version":3,"file":"addon.adapter.js","sourceRoot":"","sources":["../../../src/adapters/addon/addon.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"addon.adapter.js","sourceRoot":"","sources":["../../../src/adapters/addon/addon.adapter.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,9 @@ export declare class HARestAdapter implements IHARestClient {
12
12
  message: string;
13
13
  }>;
14
14
  getStates(): Promise<HAEntityState[]>;
15
- callService(domain: string, service: string, serviceData?: Record<string, any>): Promise<any>;
15
+ callService(domain: string, service: string, serviceData?: Record<string, any>, options?: {
16
+ rationale?: string;
17
+ }): Promise<any>;
16
18
  getSupervisorLogs(linesCount?: number): Promise<string[]>;
17
19
  }
18
20
  export { HARestAdapter as HARestClient };
@@ -1 +1 @@
1
- {"version":3,"file":"ha-rest.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/ha/ha-rest.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IA0BvD,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASxC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IASrC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IASjG,iBAAiB,CAAC,UAAU,SAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAW7D;AAGD,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,CAAC"}
1
+ {"version":3,"file":"ha-rest.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/ha/ha-rest.adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAG9D,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,aAAc,YAAW,aAAa;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,OAAO,EAAE,aAAa,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IA0BvD,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IASxC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IASrC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAM,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAanI,iBAAiB,CAAC,UAAU,SAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAW7D;AAGD,OAAO,EAAE,aAAa,IAAI,YAAY,EAAE,CAAC"}
@@ -43,9 +43,13 @@ export class HARestAdapter {
43
43
  throw new ClientError(`Failed to fetch HA states: ${err.message}`, err.response?.status);
44
44
  }
45
45
  }
46
- async callService(domain, service, serviceData = {}) {
46
+ async callService(domain, service, serviceData = {}, options) {
47
47
  try {
48
- const resp = await this.client.post(`/api/services/${domain}/${service}`, serviceData);
48
+ const headers = {};
49
+ if (options?.rationale) {
50
+ headers["X-Agent-Rationale"] = options.rationale;
51
+ }
52
+ const resp = await this.client.post(`/api/services/${domain}/${service}`, serviceData, { headers });
49
53
  return resp.data;
50
54
  }
51
55
  catch (err) {
@@ -1 +1 @@
1
- {"version":3,"file":"ha-rest.adapter.js","sourceRoot":"","sources":["../../../src/adapters/ha/ha-rest.adapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ha-rest.adapter.js","sourceRoot":"","sources":["../../../src/adapters/ha/ha-rest.adapter.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA6dlD,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CA6BvE;AAED,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAkC/G"}
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAwelD,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAsCvE;AAED,wBAAgB,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAkC/G"}
@@ -61,7 +61,8 @@ Invoke the service using \`ha_system_call_service\`.
61
61
  "service_data": {
62
62
  "entity_id": "light.office_light",
63
63
  "brightness": 200
64
- }
64
+ },
65
+ "rationale": "Turning on the lights as part of the morning routine."
65
66
  }
66
67
  \`\`\`
67
68
 
@@ -78,7 +79,7 @@ Confirm that the physical device or software entity acknowledged the command and
78
79
  | Tool | Purpose | Key Parameters |
79
80
  | :--- | :--- | :--- |
80
81
  | \`ha_system_list_entities\` | Discover entities and inspect live states | \`domain_filter\`, \`search_query\` |
81
- | \`ha_system_call_service\` | Call any Home Assistant domain service | \`domain\`, \`service\`, \`service_data\` |
82
+ | \`ha_system_call_service\` | Call any Home Assistant domain service | \`domain\`, \`service\`, \`service_data\`, \`rationale\` |
82
83
  | \`ha_system_get_logs\` | Inspect system error logs on failures | \`lines_count\`, \`source\` |
83
84
  | \`ha_system_health\` | Verify API and integration connectivity | *(none)* |
84
85
 
@@ -89,6 +90,7 @@ Confirm that the physical device or software entity acknowledged the command and
89
90
  1. **Verify Before Execution**: Always confirm entity identity with \`ha_system_list_entities\` before triggering destructive or high-energy actions (heaters, locks, garage doors).
90
91
  2. **Post-State Validation**: Never assume a service call succeeded solely based on HTTP 200; verify the entity \`state\` afterwards.
91
92
  3. **Graceful Error Handling**: If a device fails to respond, inspect \`ha_system_get_logs\` for Zigbee/Z-Wave/Wi-Fi timeout errors before retrying in a loop.
93
+ 4. **Sandboxed Roles & Audit Logs**: Always provide a descriptive \`rationale\` parameter when mutating state, as this is logged securely by the Audit service. Use ephemeral tokens via \`ha_agent_issue_token\` with narrow roles if delegating this task to a subagent.
92
94
  `,
93
95
  "ha-dashboard-designer": `---
94
96
  name: ha-dashboard-designer
@@ -165,7 +167,8 @@ Apply the updated dashboard configuration safely.
165
167
  {
166
168
  "dashboard_slug": "lovelace",
167
169
  "label": "Add living room climate tile and energy gauge",
168
- "config_yaml": "title: Home\\nviews:\\n - title: Main\\n path: main\\n cards:\\n - type: tile\\n entity: light.living_room\\n"
170
+ "config_yaml": "title: Home\\nviews:\\n - title: Main\\n path: main\\n cards:\\n - type: tile\\n entity: light.living_room\\n",
171
+ "rationale": "Adding climate and energy visualizations for better visibility."
169
172
  }
170
173
  \`\`\`
171
174
 
@@ -206,7 +209,7 @@ Analyze the captured screenshot image using multimodal vision inspection:
206
209
  | :--- | :--- | :--- |
207
210
  | \`ha_system_list_entities\` | Discover entities & states | \`domain_filter\`, \`search_query\` |
208
211
  | \`ha_dashboard_get_config\` | Fetch Lovelace dashboard YAML/JSON | \`dashboard_slug\` |
209
- | \`ha_dashboard_save_config\` | Snapshot, validate, and write dashboard | \`config_yaml\`, \`dashboard_slug\`, \`label\` |
212
+ | \`ha_dashboard_save_config\` | Snapshot, validate, and write dashboard | \`config_yaml\`, \`dashboard_slug\`, \`label\`, \`rationale\` |
210
213
  | \`ha_dashboard_render_screenshot\` | Headless Playwright visual capture | \`url_path\`, \`device_preset\`, \`dark_mode\`, \`element_selector\` |
211
214
 
212
215
  ---
@@ -217,6 +220,7 @@ Analyze the captured screenshot image using multimodal vision inspection:
217
220
  2. **Multi-Viewport Testing**: Every dashboard modification must be verified on both \`desktop\` and \`mobile\` presets before marking complete.
218
221
  3. **Graceful Entity Fallbacks**: Use conditional cards or friendly names so cards remain visually appealing even when sensors are temporarily unavailable.
219
222
  4. **Non-Destructive View Updates**: When adding new features, prefer creating dedicated views or sub-views rather than overwriting existing user dashboards without request.
223
+ 5. **Sandboxed Roles & Audit Logs**: Always provide a descriptive \`rationale\` parameter when saving config, as this is logged securely. If delegating to a UI subagent, invoke them with the restricted \`dashboard_designer\` role via \`ha_agent_issue_token\` to enforce scope safety.
220
224
  `,
221
225
  "ha-automation-builder": `---
222
226
  name: ha-automation-builder
@@ -327,7 +331,8 @@ Write the automation block to \`automations.yaml\` safely.
327
331
  {
328
332
  "automation_id": "auto_hallway_motion_light",
329
333
  "label": "Add hallway nightlight motion automation",
330
- "yaml_code": "- id: 'auto_hallway_motion_light'\\n alias: 'Hallway: Motion-Activated Nightlight'\\n mode: restart\\n trigger:\\n - platform: state\\n entity_id: binary_sensor.hallway_motion\\n to: 'on'\\n action:\\n - action: light.turn_on\\n target:\\n entity_id: light.hallway\\n"
334
+ "yaml_code": "- id: 'auto_hallway_motion_light'\\n alias: 'Hallway: Motion-Activated Nightlight'\\n mode: restart\\n trigger:\\n - platform: state\\n entity_id: binary_sensor.hallway_motion\\n to: 'on'\\n action:\\n - action: light.turn_on\\n target:\\n entity_id: light.hallway\\n",
335
+ "rationale": "Creating a safety light that triggers at night automatically."
331
336
  }
332
337
  \`\`\`
333
338
 
@@ -357,7 +362,7 @@ Validate that the newly registered automation triggers properly and executes its
357
362
  | \`ha_system_list_entities\` | Query entity IDs, states, attributes | \`domain_filter\`, \`search_query\` |
358
363
  | \`ha_automation_list\` | List automations, scripts, or scenes | \`domain\` |
359
364
  | \`ha_automation_read\` | Fetch YAML block of an automation | \`automation_id\` |
360
- | \`ha_automation_write\` | Validate, snapshot, write YAML & reload | \`automation_id\`, \`yaml_code\`, \`label\` |
365
+ | \`ha_automation_write\` | Validate, snapshot, write YAML & reload | \`automation_id\`, \`yaml_code\`, \`label\`, \`rationale\` |
361
366
  | \`ha_automation_trigger\` | Execute automation trigger manually | \`entity_id\` |
362
367
  | \`ha_system_get_logs\` | Retrieve sanitized core log lines | \`lines_count\` |
363
368
 
@@ -369,6 +374,7 @@ Validate that the newly registered automation triggers properly and executes its
369
374
  2. **Deterministic Reloading**: Never rely on full Home Assistant restarts for automation testing; use \`ha_automation_write\`'s built-in service reload.
370
375
  3. **Log Verification Gate**: Never declare an automation complete without checking \`ha_system_get_logs\` for template or service execution warnings.
371
376
  4. **Appropriate Mode Selection**: Use \`mode: restart\` for motion/timer automations and \`mode: single\` or \`mode: queued\` for security/alert automations.
377
+ 5. **Sandboxed Roles & Audit Logs**: Always provide a descriptive \`rationale\` parameter when deploying automations, as this is logged securely. If delegating to a coding subagent, invoke them with the restricted \`automation_builder\` role via \`ha_agent_issue_token\` to enforce scope safety.
372
378
  `,
373
379
  "ha-troubleshooter": `---
374
380
  name: ha-troubleshooter
@@ -431,12 +437,14 @@ When an edit, automation change, or dashboard update leads to instability, regre
431
437
  \`\`\`json
432
438
  // Example call: ha_system_create_backup
433
439
  {
434
- "label": "Pre-troubleshooting configuration checkpoint"
440
+ "label": "Pre-troubleshooting configuration checkpoint",
441
+ "rationale": "Saving state before attempting to fix syntax error in configuration.yaml"
435
442
  }
436
443
 
437
444
  // Example call: ha_system_restore_backup
438
445
  {
439
- "snapshot_id": "snap_20260831_093000_automations_yaml"
446
+ "snapshot_id": "snap_20260831_093000_automations_yaml",
447
+ "rationale": "Rolling back because the new automation caused a boot loop."
440
448
  }
441
449
  \`\`\`
442
450
 
@@ -444,6 +452,7 @@ When an edit, automation change, or dashboard update leads to instability, regre
444
452
  After executing a rollback or applying a corrective patch, verify that the system has returned to full operational capacity.
445
453
  - Re-run \`ha_system_health\` to verify that API and daemon health check reports are \`ok\`.
446
454
  - Tail recent logs with \`ha_system_get_logs\` to ensure error loops and exception tracebacks have cleared.
455
+ - Query \`ha_audit_get_logs\` to ensure no \`denied_policy\` or security alerts were triggered during the fault.
447
456
 
448
457
  \`\`\`json
449
458
  // Example call: ha_system_health
@@ -463,8 +472,9 @@ After executing a rollback or applying a corrective patch, verify that the syste
463
472
  | :--- | :--- | :--- |
464
473
  | \`ha_system_health\` | Query HA Core API & Addon daemon health | *(none)* |
465
474
  | \`ha_system_get_logs\` | Fetch sanitized tail of HA core & supervisor logs | \`lines_count\`, \`source\` |
466
- | \`ha_system_create_backup\` | Create named manual snapshot backup | \`label\` |
467
- | \`ha_system_restore_backup\` | Restore configuration from snapshot ID | \`snapshot_id\` |
475
+ | \`ha_system_create_backup\` | Create named manual snapshot backup | \`label\`, \`rationale\` |
476
+ | \`ha_system_restore_backup\` | Restore configuration from snapshot ID | \`snapshot_id\`, \`rationale\` |
477
+ | \`ha_audit_get_logs\` | Query audit logs for recent system changes | \`limit\`, \`status\` |
468
478
 
469
479
  ---
470
480
 
@@ -474,6 +484,7 @@ After executing a rollback or applying a corrective patch, verify that the syste
474
484
  2. **Sanitized Output Awareness**: \`ha_system_get_logs\` redacts secrets; never attempt to bypass log sanitization to inspect raw credentials.
475
485
  3. **Rollback Over Patching Broken States**: When an unverified configuration breaks critical automations, roll back to the last known good snapshot before attempting redesigns.
476
486
  4. **Mandatory Post-Restore Verification**: Always verify both \`ha_system_health\` and \`ha_system_get_logs\` after any restore or configuration repair.
487
+ 5. **Sandboxed Roles & Audit Logs**: Always provide a descriptive \`rationale\` parameter when backing up or restoring configurations, as this is logged securely. If delegating to a diagnostics subagent, invoke them with the restricted \`diagnostics\` role via \`ha_agent_issue_token\` to enforce scope safety.
477
488
  `
478
489
  };
479
490
  export function getTargetSkillsDirectories(customDir) {
@@ -498,6 +509,14 @@ export function getTargetSkillsDirectories(customDir) {
498
509
  if (candidates.length === 0) {
499
510
  candidates.push(geminiSkills);
500
511
  }
512
+ // Always include the local repository skills path for checked-in files
513
+ const __dirname = path.dirname(new URL(import.meta.url).pathname);
514
+ // Fix for Windows paths starting with /C:/
515
+ const normalizedDirname = os.platform() === 'win32' && __dirname.startsWith('/') ? __dirname.slice(1) : __dirname;
516
+ const localRepoSkills = path.resolve(normalizedDirname, "..", "..", "..", "skills");
517
+ if (fs.existsSync(localRepoSkills)) {
518
+ candidates.push(localRepoSkills);
519
+ }
501
520
  return candidates;
502
521
  }
503
522
  export function syncSkills(customDir, silent = false) {
@@ -1 +1 @@
1
- {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/cli/skills.ts"],"names":[],"mappings":"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"}
@@ -4,18 +4,24 @@ export declare const ConfigSchema: z.ZodObject<{
4
4
  HA_TOKEN: z.ZodDefault<z.ZodString>;
5
5
  ADDON_URL: z.ZodDefault<z.ZodString>;
6
6
  ADDON_KEY: z.ZodDefault<z.ZodString>;
7
+ AGENT_KEY: z.ZodDefault<z.ZodOptional<z.ZodString>>;
8
+ AGENT_ID: z.ZodDefault<z.ZodOptional<z.ZodString>>;
7
9
  BROWSER_STATE_DIR: z.ZodDefault<z.ZodString>;
8
10
  }, "strip", z.ZodTypeAny, {
9
11
  HA_URL: string;
10
12
  HA_TOKEN: string;
11
13
  ADDON_URL: string;
12
14
  ADDON_KEY: string;
15
+ AGENT_KEY: string;
16
+ AGENT_ID: string;
13
17
  BROWSER_STATE_DIR: string;
14
18
  }, {
15
19
  HA_URL?: string | undefined;
16
20
  HA_TOKEN?: string | undefined;
17
21
  ADDON_URL?: string | undefined;
18
22
  ADDON_KEY?: string | undefined;
23
+ AGENT_KEY?: string | undefined;
24
+ AGENT_ID?: string | undefined;
19
25
  BROWSER_STATE_DIR?: string | undefined;
20
26
  }>;
21
27
  export type RawConfig = z.infer<typeof ConfigSchema>;
@@ -24,6 +30,8 @@ export interface AppConfig {
24
30
  haToken: string;
25
31
  addonUrl: string;
26
32
  addonKey: string;
33
+ agentKey: string;
34
+ agentId: string;
27
35
  browserStateDir: string;
28
36
  }
29
37
  export declare function loadConfig(env?: NodeJS.ProcessEnv): AppConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;EAMvB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAgB1E"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;EAQvB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,CAoB1E"}
@@ -6,6 +6,8 @@ export const ConfigSchema = z.object({
6
6
  HA_TOKEN: z.string().default(""),
7
7
  ADDON_URL: z.string().url().default("http://localhost:8099"),
8
8
  ADDON_KEY: z.string().default(""),
9
+ AGENT_KEY: z.string().optional().default(""),
10
+ AGENT_ID: z.string().optional().default(""),
9
11
  BROWSER_STATE_DIR: z.string().default(() => path.join(os.homedir(), ".ha-ai")),
10
12
  });
11
13
  export function loadConfig(env = process.env) {
@@ -14,6 +16,8 @@ export function loadConfig(env = process.env) {
14
16
  HA_TOKEN: env.HA_TOKEN,
15
17
  ADDON_URL: env.ADDON_URL,
16
18
  ADDON_KEY: env.ADDON_KEY,
19
+ AGENT_KEY: env.AGENT_KEY,
20
+ AGENT_ID: env.AGENT_ID,
17
21
  BROWSER_STATE_DIR: env.BROWSER_STATE_DIR,
18
22
  });
19
23
  return {
@@ -21,6 +25,8 @@ export function loadConfig(env = process.env) {
21
25
  haToken: parsed.HA_TOKEN,
22
26
  addonUrl: parsed.ADDON_URL.replace(/\/+$/, ""),
23
27
  addonKey: parsed.ADDON_KEY,
28
+ agentKey: parsed.AGENT_KEY,
29
+ agentId: parsed.AGENT_ID,
24
30
  browserStateDir: parsed.BROWSER_STATE_DIR,
25
31
  };
26
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjC,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;CAC/E,CAAC,CAAC;AAYH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,eAAe,EAAE,MAAM,CAAC,iBAAiB;KAC1C,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAChC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IAC5D,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC5C,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,CAAC,CAAC;CAC/E,CAAC,CAAC;AAcH,MAAM,UAAU,UAAU,CAAC,MAAyB,OAAO,CAAC,GAAG;IAC7D,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC;QAChC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,SAAS,EAAE,GAAG,CAAC,SAAS;QACxB,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,iBAAiB,EAAE,GAAG,CAAC,iBAAiB;KACzC,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,QAAQ,EAAE,MAAM,CAAC,SAAS;QAC1B,OAAO,EAAE,MAAM,CAAC,QAAQ;QACxB,eAAe,EAAE,MAAM,CAAC,iBAAiB;KAC1C,CAAC;AACJ,CAAC"}
@@ -17,15 +17,85 @@ export interface AddonHealthResult {
17
17
  snapshots_count: number;
18
18
  memory_mb: number;
19
19
  }
20
+ export interface AuditEvent {
21
+ id: string;
22
+ timestamp: string;
23
+ agent_id: string;
24
+ role: string;
25
+ action: string;
26
+ tool?: string;
27
+ target?: string;
28
+ status: "allowed" | "denied_policy" | "denied_security" | string;
29
+ reason?: string;
30
+ diff_summary?: string;
31
+ snapshot_id?: string;
32
+ rationale?: string;
33
+ client_ip?: string;
34
+ }
35
+ export interface AuditQueryParams {
36
+ agent_id?: string;
37
+ role?: string;
38
+ status?: string;
39
+ limit?: number;
40
+ since?: string;
41
+ rationale?: string;
42
+ }
43
+ export interface AuditQueryResponse {
44
+ total_events: number;
45
+ events: AuditEvent[];
46
+ }
47
+ export interface IssueTokenParams {
48
+ agent_id: string;
49
+ role: string;
50
+ ttl_minutes?: number;
51
+ rationale?: string;
52
+ }
53
+ export interface IssueTokenResponse {
54
+ agent_id: string;
55
+ role: string;
56
+ token: string;
57
+ expires_at: string;
58
+ }
59
+ export interface RoleDefinition {
60
+ description?: string;
61
+ allow_tools?: string[];
62
+ deny_tools?: string[];
63
+ allow_paths?: string[];
64
+ deny_paths?: string[];
65
+ read_only_paths?: string[];
66
+ allow_services?: string[];
67
+ deny_services?: string[];
68
+ }
69
+ export interface AgentSummary {
70
+ role: string;
71
+ description?: string;
72
+ }
73
+ export interface PoliciesResponse {
74
+ roles: Record<string, RoleDefinition>;
75
+ agents: Record<string, AgentSummary>;
76
+ }
20
77
  export interface IAddonClient {
21
78
  checkHealth(): Promise<AddonHealthResult>;
22
79
  readFile(path: string): Promise<FileReadResult>;
23
80
  writeFile(path: string, content: string, options?: {
24
81
  validateYaml?: boolean;
25
82
  label?: string;
83
+ rationale?: string;
26
84
  }): Promise<FileWriteResult>;
27
85
  listSnapshots(): Promise<SnapshotInfo[]>;
28
- restoreSnapshot(snapshotId: string): Promise<BackupRestoreResult>;
86
+ restoreSnapshot(snapshotId: string, options?: {
87
+ rationale?: string;
88
+ }): Promise<BackupRestoreResult>;
29
89
  getLogs(lines?: number): Promise<LogsTailResult>;
90
+ getAuditLogs(params?: AuditQueryParams): Promise<AuditQueryResponse>;
91
+ issueAgentToken(params: IssueTokenParams): Promise<IssueTokenResponse>;
92
+ getAgentPolicies(): Promise<PoliciesResponse>;
93
+ /**
94
+ * Request authorization from the policy engine before making direct mutations.
95
+ * Resolves if authorized, throws if denied by policy.
96
+ */
97
+ authorize(tool: string, target?: string, domain?: string, service?: string, options?: {
98
+ rationale?: string;
99
+ }): Promise<void>;
30
100
  }
31
101
  //# sourceMappingURL=addon-client.port.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addon-client.port.d.ts","sourceRoot":"","sources":["../../../src/domain/ports/addon-client.port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExF,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,WAAW,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,SAAS,CACP,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACnD,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5B,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IACzC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClE,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CAClD"}
1
+ {"version":3,"file":"addon-client.port.d.ts","sourceRoot":"","sources":["../../../src/domain/ports/addon-client.port.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ export interface IHARestClient {
4
4
  message: string;
5
5
  }>;
6
6
  getStates(): Promise<HAEntityState[]>;
7
- callService(domain: string, service: string, serviceData?: Record<string, any>): Promise<any>;
7
+ callService(domain: string, service: string, serviceData?: Record<string, any>, options?: {
8
+ rationale?: string;
9
+ }): Promise<any>;
8
10
  getSupervisorLogs(linesCount?: number): Promise<string[]>;
9
11
  }
10
12
  export interface IHAWsClient {
@@ -1 +1 @@
1
- {"version":3,"file":"ha-client.port.d.ts","sourceRoot":"","sources":["../../../src/domain/ports/ha-client.port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACtC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9F,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACvF,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CACzC"}
1
+ {"version":3,"file":"ha-client.port.d.ts","sourceRoot":"","sources":["../../../src/domain/ports/ha-client.port.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC5B,QAAQ,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACzC,SAAS,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACtC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAChI,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC3D;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,iBAAiB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;IACzE,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACvF,WAAW,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CACzC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAcpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,wBAAgB,aAAa,IAAI,WAAW,CAY3C;AAED,wBAAgB,YAAY,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG;IAC3D,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;CACtB,CAaA;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAgBpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,wBAAgB,aAAa,IAAI,WAAW,CAiB3C;AAED,wBAAgB,YAAY,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG;IAC3D,MAAM,EAAE,SAAS,CAAC;IAClB,OAAO,EAAE,WAAW,CAAC;CACtB,CAeA;AAED,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -12,11 +12,18 @@ import { PlaywrightDashboardAdapter } from "./adapters/browser/playwright.adapte
12
12
  import { registerDashboardTools } from "./tools/dashboard.js";
13
13
  import { registerAutomationTools } from "./tools/automation.js";
14
14
  import { registerSystemTools } from "./tools/system.js";
15
+ import { registerAuditTools } from "./tools/audit.js";
16
+ import { registerAgentTools } from "./tools/agent.js";
15
17
  export function createClients() {
16
18
  const config = loadConfig();
17
19
  const restClient = new HARestAdapter({ haUrl: config.haUrl, haToken: config.haToken });
18
20
  const wsClient = new HAWsAdapter({ haUrl: config.haUrl, haToken: config.haToken });
19
- const addonClient = new AddonAdapter({ addonUrl: config.addonUrl, addonKey: config.addonKey });
21
+ const addonClient = new AddonAdapter({
22
+ addonUrl: config.addonUrl,
23
+ addonKey: config.addonKey,
24
+ agentKey: config.agentKey,
25
+ agentId: config.agentId,
26
+ });
20
27
  const renderer = new PlaywrightDashboardAdapter({
21
28
  haUrl: config.haUrl,
22
29
  haToken: config.haToken,
@@ -33,6 +40,8 @@ export function createServer(providedClients) {
33
40
  registerDashboardTools(server, clients);
34
41
  registerAutomationTools(server, clients);
35
42
  registerSystemTools(server, clients);
43
+ registerAuditTools(server, clients);
44
+ registerAgentTools(server, clients);
36
45
  return { server, clients };
37
46
  }
38
47
  import { syncSkills } from "./cli/skills.js";