@commandgarden/cli 1.2.2 → 1.3.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 (52) hide show
  1. package/dist/main.js +8907 -8895
  2. package/node_modules/@commandgarden/app/dist/client/assets/index-B-_w54e9.css +1 -0
  3. package/node_modules/@commandgarden/app/dist/client/assets/index-Bb1BOK1E.js +252 -0
  4. package/node_modules/@commandgarden/app/dist/client/index.html +19 -19
  5. package/node_modules/@commandgarden/app/dist/server/daemon-client.test.js +47 -0
  6. package/node_modules/@commandgarden/app/dist/server/main.d.ts +1 -0
  7. package/node_modules/@commandgarden/app/dist/server/main.js +3 -3
  8. package/node_modules/@commandgarden/app/dist/server/routes/audit.d.ts +3 -0
  9. package/node_modules/@commandgarden/app/dist/server/routes/config.d.ts +3 -0
  10. package/node_modules/@commandgarden/app/dist/server/routes/connectors.d.ts +3 -0
  11. package/node_modules/@commandgarden/app/dist/server/routes/goals.d.ts +3 -0
  12. package/node_modules/@commandgarden/app/dist/server/routes/goals.js +31 -0
  13. package/node_modules/@commandgarden/app/dist/server/routes/index.d.ts +4 -0
  14. package/node_modules/@commandgarden/app/dist/server/routes/index.js +4 -0
  15. package/node_modules/@commandgarden/app/dist/server/routes/preferences.d.ts +3 -0
  16. package/node_modules/@commandgarden/app/dist/server/routes/routes.test.js +137 -0
  17. package/node_modules/@commandgarden/app/dist/server/routes/run.d.ts +3 -0
  18. package/node_modules/@commandgarden/app/dist/server/routes/status.d.ts +3 -0
  19. package/node_modules/@commandgarden/app/dist/server/routes/timetracking-cache.d.ts +3 -0
  20. package/node_modules/@commandgarden/app/dist/server/routes/timetracking-cache.js +35 -0
  21. package/node_modules/@commandgarden/app/dist/server/store.d.ts +47 -0
  22. package/node_modules/@commandgarden/app/dist/server/store.js +112 -10
  23. package/node_modules/@commandgarden/app/dist/server/store.test.js +59 -0
  24. package/node_modules/@commandgarden/app/package.json +42 -41
  25. package/node_modules/@commandgarden/daemon/connectors/lib/msal-token.js +20 -0
  26. package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.eval.js +341 -0
  27. package/node_modules/@commandgarden/daemon/connectors/teams-room-availability.yaml +46 -0
  28. package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.eval.js +52 -0
  29. package/node_modules/@commandgarden/daemon/connectors/timetracking-projects.yaml +42 -0
  30. package/node_modules/@commandgarden/daemon/connectors/timetracking-report.eval.js +81 -0
  31. package/node_modules/@commandgarden/daemon/connectors/timetracking-report.yaml +52 -0
  32. package/node_modules/@commandgarden/daemon/dist/audit-store.js +8 -8
  33. package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts +24 -0
  34. package/node_modules/@commandgarden/daemon/dist/cdp-client.d.ts.map +1 -0
  35. package/node_modules/@commandgarden/daemon/dist/cdp-client.js +150 -0
  36. package/node_modules/@commandgarden/daemon/dist/cdp-client.js.map +1 -0
  37. package/node_modules/@commandgarden/daemon/dist/config.d.ts.map +1 -1
  38. package/node_modules/@commandgarden/daemon/dist/config.js +5 -3
  39. package/node_modules/@commandgarden/daemon/dist/config.js.map +1 -1
  40. package/node_modules/@commandgarden/daemon/package.json +30 -29
  41. package/node_modules/@commandgarden/shared/dist/daemon-client.d.ts +19 -0
  42. package/node_modules/@commandgarden/shared/dist/daemon-client.d.ts.map +1 -0
  43. package/node_modules/@commandgarden/shared/dist/daemon-client.js +129 -0
  44. package/node_modules/@commandgarden/shared/dist/daemon-client.js.map +1 -0
  45. package/node_modules/@commandgarden/shared/dist/index.d.ts +1 -0
  46. package/node_modules/@commandgarden/shared/dist/index.d.ts.map +1 -1
  47. package/node_modules/@commandgarden/shared/dist/index.js +2 -0
  48. package/node_modules/@commandgarden/shared/dist/index.js.map +1 -1
  49. package/node_modules/@commandgarden/shared/package.json +32 -32
  50. package/package.json +55 -55
  51. package/node_modules/@commandgarden/app/dist/client/assets/index-58UrF1aG.js +0 -197
  52. package/node_modules/@commandgarden/app/dist/client/assets/index-DErcb2Kp.css +0 -1
@@ -0,0 +1,52 @@
1
+ site: timetracking
2
+ name: report
3
+ version: "1.0"
4
+ description: "MBTI Time Tracking monthly report — one row per booking line"
5
+ access: read
6
+
7
+ domains:
8
+ - "timetracking.mercedes-benz-techinnovation.com"
9
+ - "mbti-bam-wzde-prd-ejdchtb0g9afexhr.a01.azurefd.net"
10
+ capabilities:
11
+ - navigate
12
+ - js_evaluate
13
+
14
+ args:
15
+ - name: month
16
+ type: string
17
+ required: false
18
+ help: "Month in YYYY-MM format (default: current month)"
19
+ pattern: "^\\d{4}-\\d{2}$"
20
+
21
+ columns:
22
+ - name: month
23
+ type: string
24
+ - name: date
25
+ type: string
26
+ - name: projectId
27
+ type: string
28
+ - name: projectName
29
+ type: string
30
+ - name: category
31
+ type: string
32
+ - name: activity
33
+ type: string
34
+ - name: activityName
35
+ type: string
36
+ - name: hours
37
+ type: number
38
+ - name: status
39
+ type: string
40
+ - name: journalId
41
+ type: string
42
+ - name: lineNumber
43
+ type: number
44
+
45
+ pipeline:
46
+ - step: navigate
47
+ url: "https://timetracking.mercedes-benz-techinnovation.com/"
48
+ - step: wait
49
+ selector: "body"
50
+ timeout: 10000
51
+ - step: js_evaluate
52
+ file: timetracking-report.eval.js
@@ -19,11 +19,11 @@ export class AuditStore {
19
19
  else {
20
20
  db = new SQL.Database();
21
21
  }
22
- db.run(`CREATE TABLE IF NOT EXISTS audit_events (
23
- id TEXT PRIMARY KEY, timestamp TEXT NOT NULL, type TEXT NOT NULL,
24
- user TEXT NOT NULL, connector TEXT NOT NULL, args TEXT NOT NULL,
25
- domains TEXT NOT NULL, capabilities TEXT NOT NULL, row_count INTEGER,
26
- columns TEXT, duration_ms INTEGER NOT NULL, error TEXT, denial_reason TEXT
22
+ db.run(`CREATE TABLE IF NOT EXISTS audit_events (
23
+ id TEXT PRIMARY KEY, timestamp TEXT NOT NULL, type TEXT NOT NULL,
24
+ user TEXT NOT NULL, connector TEXT NOT NULL, args TEXT NOT NULL,
25
+ domains TEXT NOT NULL, capabilities TEXT NOT NULL, row_count INTEGER,
26
+ columns TEXT, duration_ms INTEGER NOT NULL, error TEXT, denial_reason TEXT
27
27
  )`);
28
28
  const store = new AuditStore(db, dbPath);
29
29
  store.migrate();
@@ -77,9 +77,9 @@ export class AuditStore {
77
77
  }
78
78
  }
79
79
  insert(event) {
80
- this.db.run(`INSERT INTO audit_events (id, timestamp, type, user, connector, args, domains,
81
- capabilities, row_count, columns, duration_ms, error, denial_reason,
82
- correlation_id, connector_hash, steps, source, previous_value, new_value)
80
+ this.db.run(`INSERT INTO audit_events (id, timestamp, type, user, connector, args, domains,
81
+ capabilities, row_count, columns, duration_ms, error, denial_reason,
82
+ correlation_id, connector_hash, steps, source, previous_value, new_value)
83
83
  VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`, [
84
84
  event.id, event.timestamp, event.type, event.user, event.connector,
85
85
  JSON.stringify(event.args), JSON.stringify(event.domains),
@@ -0,0 +1,24 @@
1
+ export declare class CdpClient {
2
+ private port;
3
+ private ws;
4
+ private msgId;
5
+ private pending;
6
+ private sessionIds;
7
+ constructor(port: number);
8
+ /** Connect to Chrome's browser-level CDP endpoint. */
9
+ connect(): Promise<void>;
10
+ /** Send a CDP command to the browser target. */
11
+ private send;
12
+ /** Send a CDP command to a specific session (tab). */
13
+ private sendToSession;
14
+ /**
15
+ * Enable Network domain on all matching tabs and future tabs.
16
+ * Uses Target.setAutoAttach to automatically attach to new targets
17
+ * (tabs created by the extension) and enable Network on them.
18
+ */
19
+ enableNetworkCapture(urlPattern?: string): Promise<void>;
20
+ /** Disconnect from CDP. */
21
+ disconnect(): void;
22
+ get connected(): boolean;
23
+ }
24
+ //# sourceMappingURL=cdp-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-client.d.ts","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"AA6BA,qBAAa,SAAS;IAMR,OAAO,CAAC,IAAI;IALxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,OAAO,CAAoF;IACnG,OAAO,CAAC,UAAU,CAAqB;gBAEnB,IAAI,EAAE,MAAM;IAEhC,sDAAsD;IAChD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD9B,gDAAgD;IAChD,OAAO,CAAC,IAAI;IAgBZ,sDAAsD;IACtD,OAAO,CAAC,aAAa;IAgBrB;;;;OAIG;IACG,oBAAoB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB9D,2BAA2B;IAC3B,UAAU,IAAI,IAAI;IAYlB,IAAI,SAAS,IAAI,OAAO,CAA6B;CACtD"}
@@ -0,0 +1,150 @@
1
+ // src/cdp-client.ts
2
+ //
3
+ // Lightweight CDP (Chrome DevTools Protocol) client that connects to Chrome's
4
+ // --remote-debugging-port and calls Network.enable on target tabs. This forces
5
+ // Chrome to route Service Worker-handled requests through the observable path,
6
+ // making them visible to window.fetch interceptors in the page context.
7
+ //
8
+ // Without Network.enable, OWA's getSchedule GraphQL call goes through the
9
+ // Service Worker's internal fetch — invisible to any page-level interception.
10
+ import { WebSocket } from 'ws';
11
+ export class CdpClient {
12
+ port;
13
+ ws = null;
14
+ msgId = 0;
15
+ pending = new Map();
16
+ sessionIds = new Set();
17
+ constructor(port) {
18
+ this.port = port;
19
+ }
20
+ /** Connect to Chrome's browser-level CDP endpoint. */
21
+ async connect() {
22
+ const versionUrl = `http://127.0.0.1:${this.port}/json/version`;
23
+ const resp = await fetch(versionUrl);
24
+ if (!resp.ok)
25
+ throw new Error(`CDP version endpoint returned ${resp.status}`);
26
+ const info = await resp.json();
27
+ const wsUrl = info.webSocketDebuggerUrl;
28
+ if (!wsUrl)
29
+ throw new Error('No webSocketDebuggerUrl in CDP version response');
30
+ return new Promise((resolve, reject) => {
31
+ const ws = new WebSocket(wsUrl);
32
+ const timeout = setTimeout(() => {
33
+ ws.close();
34
+ reject(new Error('CDP WebSocket connection timed out'));
35
+ }, 5000);
36
+ ws.on('open', () => {
37
+ clearTimeout(timeout);
38
+ this.ws = ws;
39
+ resolve();
40
+ });
41
+ ws.on('error', (err) => {
42
+ clearTimeout(timeout);
43
+ reject(new Error(`CDP WebSocket error: ${err.message}`));
44
+ });
45
+ ws.on('message', (data) => {
46
+ try {
47
+ const msg = JSON.parse(String(data));
48
+ // Handle responses to our commands
49
+ if (msg.id !== undefined) {
50
+ const entry = this.pending.get(msg.id);
51
+ if (entry) {
52
+ this.pending.delete(msg.id);
53
+ if (msg.error)
54
+ entry.reject(new Error(msg.error.message));
55
+ else
56
+ entry.resolve(msg.result);
57
+ }
58
+ }
59
+ // Handle Target.attachedToTarget — auto-enable Network on new sessions
60
+ if (msg.method === 'Target.attachedToTarget' && msg.params) {
61
+ const sessionId = msg.params.sessionId;
62
+ if (sessionId) {
63
+ this.sessionIds.add(sessionId);
64
+ this.sendToSession(sessionId, 'Network.enable', {}).catch(() => { });
65
+ }
66
+ }
67
+ }
68
+ catch { /* ignore parse errors */ }
69
+ });
70
+ ws.on('close', () => { this.ws = null; });
71
+ });
72
+ }
73
+ /** Send a CDP command to the browser target. */
74
+ send(method, params = {}) {
75
+ if (!this.ws)
76
+ return Promise.reject(new Error('CDP not connected'));
77
+ const id = ++this.msgId;
78
+ return new Promise((resolve, reject) => {
79
+ const timer = setTimeout(() => {
80
+ this.pending.delete(id);
81
+ reject(new Error(`CDP command ${method} timed out`));
82
+ }, 10000);
83
+ this.pending.set(id, {
84
+ resolve: (r) => { clearTimeout(timer); resolve(r); },
85
+ reject: (e) => { clearTimeout(timer); reject(e); },
86
+ });
87
+ this.ws.send(JSON.stringify({ id, method, params }));
88
+ });
89
+ }
90
+ /** Send a CDP command to a specific session (tab). */
91
+ sendToSession(sessionId, method, params = {}) {
92
+ if (!this.ws)
93
+ return Promise.reject(new Error('CDP not connected'));
94
+ const id = ++this.msgId;
95
+ return new Promise((resolve, reject) => {
96
+ const timer = setTimeout(() => {
97
+ this.pending.delete(id);
98
+ reject(new Error(`CDP command ${method} timed out`));
99
+ }, 10000);
100
+ this.pending.set(id, {
101
+ resolve: (r) => { clearTimeout(timer); resolve(r); },
102
+ reject: (e) => { clearTimeout(timer); reject(e); },
103
+ });
104
+ this.ws.send(JSON.stringify({ id, method, params, sessionId }));
105
+ });
106
+ }
107
+ /**
108
+ * Enable Network domain on all matching tabs and future tabs.
109
+ * Uses Target.setAutoAttach to automatically attach to new targets
110
+ * (tabs created by the extension) and enable Network on them.
111
+ */
112
+ async enableNetworkCapture(urlPattern) {
113
+ // Auto-attach to existing and new targets
114
+ await this.send('Target.setAutoAttach', {
115
+ autoAttach: true,
116
+ waitForDebuggerOnStart: false,
117
+ flatten: true,
118
+ filter: [{ type: 'page' }],
119
+ });
120
+ // Also manually attach to existing tabs matching the URL pattern
121
+ if (urlPattern) {
122
+ const resp = await fetch(`http://127.0.0.1:${this.port}/json`);
123
+ if (resp.ok) {
124
+ const targets = await resp.json();
125
+ for (const t of targets) {
126
+ if (t.type === 'page' && t.url.includes(urlPattern)) {
127
+ try {
128
+ await this.send('Target.attachToTarget', { targetId: t.id, flatten: true });
129
+ }
130
+ catch { /* may already be attached */ }
131
+ }
132
+ }
133
+ }
134
+ }
135
+ }
136
+ /** Disconnect from CDP. */
137
+ disconnect() {
138
+ this.sessionIds.clear();
139
+ for (const [, entry] of this.pending) {
140
+ entry.reject(new Error('CDP disconnected'));
141
+ }
142
+ this.pending.clear();
143
+ if (this.ws) {
144
+ this.ws.close();
145
+ this.ws = null;
146
+ }
147
+ }
148
+ get connected() { return this.ws !== null; }
149
+ }
150
+ //# sourceMappingURL=cdp-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdp-client.js","sourceRoot":"","sources":["../src/cdp-client.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAM5D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AASxB,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuBvB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CAAC;AAExD,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAM5D"}
@@ -2,11 +2,13 @@
2
2
  import { z } from 'zod';
3
3
  import { parse as parseYaml } from 'yaml';
4
4
  import { readFileSync, existsSync } from 'node:fs';
5
- import { join } from 'node:path';
5
+ import { join, dirname } from 'node:path';
6
6
  import { homedir } from 'node:os';
7
+ import { fileURLToPath } from 'node:url';
8
+ const BUNDLED_CONNECTORS_DIR = join(dirname(fileURLToPath(import.meta.url)), '../connectors');
7
9
  export const configSchema = z.object({
8
10
  daemon: z.object({
9
- port: z.number().int().min(1024).max(65535).default(19825),
11
+ port: z.number().int().min(1024).max(65535).default(9091),
10
12
  host: z.string().default('127.0.0.1'),
11
13
  }).default({}),
12
14
  security: z.object({
@@ -18,7 +20,7 @@ export const configSchema = z.object({
18
20
  approvalTimeoutMs: z.number().int().positive().default(120_000),
19
21
  }).default({}),
20
22
  connectors: z.object({
21
- paths: z.array(z.string()).default(['~/.commandgarden/connectors']),
23
+ paths: z.array(z.string()).default([BUNDLED_CONNECTORS_DIR, '~/.commandgarden/connectors']),
22
24
  }).default({}),
23
25
  audit: z.object({
24
26
  retentionDays: z.number().int().positive().default(90),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;AAE9F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;QACzD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC;KACtC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,oBAAoB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;QAClF,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,gBAAgB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACjD,qBAAqB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KAChE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,sBAAsB,EAAE,6BAA6B,CAAC,CAAC;KAC5F,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,2BAA2B,CAAC;KACxD,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,aAAa,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;KACjE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACf,CAAC,CAAC;AAIH,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAC;IAC5E,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC9B,OAAO,YAAY,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC"}
@@ -1,29 +1,30 @@
1
- {
2
- "name": "@commandgarden/daemon",
3
- "version": "0.1.0",
4
- "private": true,
5
- "type": "module",
6
- "main": "./dist/main.js",
7
- "files": [
8
- "dist"
9
- ],
10
- "scripts": {
11
- "build": "tsc",
12
- "start": "node dist/main.js",
13
- "test": "vitest run",
14
- "test:watch": "vitest"
15
- },
16
- "dependencies": {
17
- "@commandgarden/shared": "*",
18
- "sql.js": "^1.11.0",
19
- "fastify": "^5.0.0",
20
- "@fastify/websocket": "^11.0.0",
21
- "yaml": "^2.4.0"
22
- },
23
- "devDependencies": {
24
- "@types/node": "^22.0.0",
25
- "@types/ws": "^8.5.0",
26
- "typescript": "^5.4.0",
27
- "vitest": "^2.0.0"
28
- }
29
- }
1
+ {
2
+ "name": "@commandgarden/daemon",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/main.js",
7
+ "files": [
8
+ "dist",
9
+ "connectors"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc && node scripts/copy-connectors.mjs",
13
+ "start": "node dist/main.js",
14
+ "test": "vitest run",
15
+ "test:watch": "vitest"
16
+ },
17
+ "dependencies": {
18
+ "@commandgarden/shared": "*",
19
+ "sql.js": "^1.11.0",
20
+ "fastify": "^5.0.0",
21
+ "@fastify/websocket": "^11.0.0",
22
+ "yaml": "^2.4.0"
23
+ },
24
+ "devDependencies": {
25
+ "@types/node": "^22.0.0",
26
+ "@types/ws": "^8.5.0",
27
+ "typescript": "^5.4.0",
28
+ "vitest": "^2.0.0"
29
+ }
30
+ }
@@ -0,0 +1,19 @@
1
+ export declare function readToken(tokenPath: string): string | null;
2
+ export declare class DaemonClient {
3
+ private baseUrl;
4
+ private token;
5
+ constructor(baseUrl: string, token: string);
6
+ get<T = Record<string, unknown>>(path: string): Promise<T>;
7
+ post<T = Record<string, unknown>>(path: string, body: unknown): Promise<T>;
8
+ status(): Promise<{
9
+ ok: boolean;
10
+ extensionConnected: boolean;
11
+ connectorCount: number;
12
+ }>;
13
+ pipeRaw(path: string): Promise<Response>;
14
+ connectSSE(path: string, onEvent: (event: string, data: unknown) => void, signal?: AbortSignal): Promise<void>;
15
+ private sseHeaders;
16
+ private request;
17
+ private rawFetch;
18
+ }
19
+ //# sourceMappingURL=daemon-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.d.ts","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"AAEA,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM1D;AAED,qBAAa,YAAY;IAErB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,KAAK;gBADL,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM;IAGjB,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1D,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;IAI1E,MAAM,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,kBAAkB,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvF,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IASxC,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,EAC/C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,IAAI,CAAC;IAkDhB,OAAO,CAAC,UAAU;YAQJ,OAAO;IAuBrB,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,129 @@
1
+ import { readFileSync } from 'node:fs';
2
+ export function readToken(tokenPath) {
3
+ try {
4
+ return readFileSync(tokenPath, 'utf-8').trim();
5
+ }
6
+ catch {
7
+ return null;
8
+ }
9
+ }
10
+ export class DaemonClient {
11
+ baseUrl;
12
+ token;
13
+ constructor(baseUrl, token) {
14
+ this.baseUrl = baseUrl;
15
+ this.token = token;
16
+ }
17
+ async get(path) {
18
+ return this.request('GET', path);
19
+ }
20
+ async post(path, body) {
21
+ return this.request('POST', path, body);
22
+ }
23
+ async status() {
24
+ let resp;
25
+ try {
26
+ resp = await this.rawFetch('/api/status', { method: 'GET' });
27
+ }
28
+ catch {
29
+ throw new Error('Cannot connect to daemon. Is it running? Try: cg daemon start');
30
+ }
31
+ const data = await resp.json();
32
+ if (!resp.ok) {
33
+ throw new Error(data.error ?? `HTTP ${resp.status}`);
34
+ }
35
+ return data;
36
+ }
37
+ async pipeRaw(path) {
38
+ const resp = await this.rawFetch(path, {
39
+ method: 'GET',
40
+ headers: this.sseHeaders(),
41
+ });
42
+ if (!resp.ok)
43
+ throw new Error(`SSE connection failed: HTTP ${resp.status}`);
44
+ return resp;
45
+ }
46
+ async connectSSE(path, onEvent, signal) {
47
+ const resp = await this.rawFetch(path, {
48
+ method: 'GET',
49
+ headers: this.sseHeaders(),
50
+ signal,
51
+ });
52
+ if (!resp.ok || !resp.body) {
53
+ throw new Error(`SSE connection failed: HTTP ${resp.status}`);
54
+ }
55
+ const reader = resp.body.getReader();
56
+ const decoder = new TextDecoder();
57
+ let buffer = '';
58
+ try {
59
+ while (true) {
60
+ const { done, value } = await reader.read();
61
+ if (done)
62
+ break;
63
+ buffer += decoder.decode(value, { stream: true });
64
+ const lines = buffer.split('\n');
65
+ buffer = lines.pop() ?? '';
66
+ let currentEvent = 'message';
67
+ let currentData = '';
68
+ for (const line of lines) {
69
+ if (line.startsWith('event: ')) {
70
+ currentEvent = line.slice(7).trim();
71
+ }
72
+ else if (line.startsWith('data: ')) {
73
+ currentData = line.slice(6);
74
+ }
75
+ else if (line === '') {
76
+ if (currentData) {
77
+ try {
78
+ onEvent(currentEvent, JSON.parse(currentData));
79
+ }
80
+ catch {
81
+ onEvent(currentEvent, currentData);
82
+ }
83
+ currentData = '';
84
+ currentEvent = 'message';
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ catch (err) {
91
+ if (signal?.aborted)
92
+ return;
93
+ throw err;
94
+ }
95
+ }
96
+ sseHeaders() {
97
+ return {
98
+ 'Authorization': `Bearer ${this.token}`,
99
+ 'X-CommandGarden': '1',
100
+ 'Accept': 'text/event-stream',
101
+ };
102
+ }
103
+ async request(method, path, body) {
104
+ let resp;
105
+ try {
106
+ resp = await this.rawFetch(path, {
107
+ method,
108
+ headers: {
109
+ 'Authorization': `Bearer ${this.token}`,
110
+ 'X-CommandGarden': '1',
111
+ 'Content-Type': 'application/json',
112
+ },
113
+ body: body ? JSON.stringify(body) : undefined,
114
+ });
115
+ }
116
+ catch {
117
+ throw new Error('Cannot connect to daemon. Is it running? Try: cg daemon start');
118
+ }
119
+ const data = await resp.json();
120
+ if (!resp.ok) {
121
+ throw new Error(data.error ?? `HTTP ${resp.status}`);
122
+ }
123
+ return data;
124
+ }
125
+ rawFetch(path, init) {
126
+ return fetch(`${this.baseUrl}${path}`, init);
127
+ }
128
+ }
129
+ //# sourceMappingURL=daemon-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-client.js","sourceRoot":"","sources":["../src/daemon-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,YAAY;IAEb;IACA;IAFV,YACU,OAAe,EACf,KAAa;QADb,YAAO,GAAP,OAAO,CAAQ;QACf,UAAK,GAAL,KAAK,CAAQ;IACpB,CAAC;IAEJ,KAAK,CAAC,GAAG,CAA8B,IAAY;QACjD,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,IAAI,CAA8B,IAAY,EAAE,IAAa;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,MAAM;QACV,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAE,IAA+B,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAA4E,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC5E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,UAAU,CACd,IAAY,EACZ,OAA+C,EAC/C,MAAoB;QAEpB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;YACrC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE;YAC1B,MAAM;SACP,CAAC,CAAC;QAEH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,IAAI,CAAC;YACH,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC5C,IAAI,IAAI;oBAAE,MAAM;gBAChB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;gBAElD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;gBAE3B,IAAI,YAAY,GAAG,SAAS,CAAC;gBAC7B,IAAI,WAAW,GAAG,EAAE,CAAC;gBACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAC/B,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBACtC,CAAC;yBAAM,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACrC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;oBAC9B,CAAC;yBAAM,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;wBACvB,IAAI,WAAW,EAAE,CAAC;4BAChB,IAAI,CAAC;gCACH,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;4BACjD,CAAC;4BAAC,MAAM,CAAC;gCACP,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;4BACrC,CAAC;4BACD,WAAW,GAAG,EAAE,CAAC;4BACjB,YAAY,GAAG,SAAS,CAAC;wBAC3B,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,MAAM,EAAE,OAAO;gBAAE,OAAO;YAC5B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,OAAO;YACL,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;YACvC,iBAAiB,EAAE,GAAG;YACtB,QAAQ,EAAE,mBAAmB;SAC9B,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY,EAAE,IAAc;QACnE,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;gBAC/B,MAAM;gBACN,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE;oBACvC,iBAAiB,EAAE,GAAG;oBACtB,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAE,IAA+B,CAAC,KAAK,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,IAAS,CAAC;IACnB,CAAC;IAEO,QAAQ,CAAC,IAAY,EAAE,IAAiB;QAC9C,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/C,CAAC;CACF"}
@@ -5,4 +5,5 @@ export { parseConnectorYaml, validateConnectorSemantics, type LoadError, } from
5
5
  export { tokenize, parse, evaluate, interpolate, BUILT_IN_FILTERS, type Token, type TokenType, type Expr, type ExprContext, type FilterFn, } from './expression/index.js';
6
6
  export { type RunCommandRequest, type RunCommandResponse, type ApprovalConfig, type ExtensionRequest, type ExtensionResponse, type ApprovalRequest, type ApprovalResponse, isRunCommandRequest, isExtensionResponse, isApprovalRequest, isApprovalResponse, } from './protocol.js';
7
7
  export { AUDIT_EVENT_TYPES, type AuditEvent, type AuditEventType, type StepSummary, createAuditEvent, redactArgs, } from './events.js';
8
+ export { DaemonClient, readToken, } from './daemon-client.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,SAAS,EACd,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,EACZ,KAAK,UAAU,EACf,KAAK,SAAS,EACd,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,UAAU,EACf,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EACf,KAAK,OAAO,EACZ,KAAK,cAAc,GACpB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,KAAK,SAAS,GACf,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,EAChB,KAAK,KAAK,EACV,KAAK,SAAS,EACd,KAAK,IAAI,EACT,KAAK,WAAW,EAChB,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,iBAAiB,EACjB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC"}
@@ -12,4 +12,6 @@ export { tokenize, parse, evaluate, interpolate, BUILT_IN_FILTERS, } from './exp
12
12
  export { isRunCommandRequest, isExtensionResponse, isApprovalRequest, isApprovalResponse, } from './protocol.js';
13
13
  // Audit events
14
14
  export { AUDIT_EVENT_TYPES, createAuditEvent, redactArgs, } from './events.js';
15
+ // Daemon client
16
+ export { DaemonClient, readToken, } from './daemon-client.js';
15
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EACL,YAAY,EAGZ,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EACL,mBAAmB,EAEnB,mBAAmB,EACnB,kBAAkB,GAcnB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAE3B,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,GAMjB,MAAM,uBAAuB,CAAC;AAE/B,WAAW;AACX,OAAO,EAQL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EACL,iBAAiB,EAIjB,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EACL,YAAY,EAGZ,eAAe,EACf,sBAAsB,EACtB,YAAY,GACb,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EACL,mBAAmB,EAEnB,mBAAmB,EACnB,kBAAkB,GAcnB,MAAM,eAAe,CAAC;AAEvB,mBAAmB;AACnB,OAAO,EACL,eAAe,GAIhB,MAAM,gBAAgB,CAAC;AAExB,cAAc;AACd,OAAO,EACL,kBAAkB,EAClB,0BAA0B,GAE3B,MAAM,aAAa,CAAC;AAErB,oBAAoB;AACpB,OAAO,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,WAAW,EACX,gBAAgB,GAMjB,MAAM,uBAAuB,CAAC;AAE/B,WAAW;AACX,OAAO,EAQL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,eAAe;AACf,OAAO,EACL,iBAAiB,EAIjB,gBAAgB,EAChB,UAAU,GACX,MAAM,aAAa,CAAC;AAErB,gBAAgB;AAChB,OAAO,EACL,YAAY,EACZ,SAAS,GACV,MAAM,oBAAoB,CAAC"}
@@ -1,32 +1,32 @@
1
- {
2
- "name": "@commandgarden/shared",
3
- "version": "0.1.0",
4
- "description": "Shared types and utilities for CommandGarden",
5
- "private": true,
6
- "type": "module",
7
- "main": "./dist/index.js",
8
- "files": [
9
- "dist"
10
- ],
11
- "types": "./dist/index.d.ts",
12
- "exports": {
13
- ".": {
14
- "types": "./dist/index.d.ts",
15
- "import": "./dist/index.js"
16
- }
17
- },
18
- "scripts": {
19
- "build": "tsc",
20
- "test": "vitest run",
21
- "test:watch": "vitest"
22
- },
23
- "dependencies": {
24
- "yaml": "^2.4.0",
25
- "zod": "^3.23.0"
26
- },
27
- "devDependencies": {
28
- "@types/node": "^26.0.0",
29
- "typescript": "^5.4.0",
30
- "vitest": "^2.0.0"
31
- }
32
- }
1
+ {
2
+ "name": "@commandgarden/shared",
3
+ "version": "0.1.0",
4
+ "description": "Shared types and utilities for CommandGarden",
5
+ "private": true,
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "types": "./dist/index.d.ts",
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.d.ts",
15
+ "import": "./dist/index.js"
16
+ }
17
+ },
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest"
22
+ },
23
+ "dependencies": {
24
+ "yaml": "^2.4.0",
25
+ "zod": "^3.23.0"
26
+ },
27
+ "devDependencies": {
28
+ "@types/node": "^26.0.0",
29
+ "typescript": "^5.4.0",
30
+ "vitest": "^2.0.0"
31
+ }
32
+ }