@bbyqtbean/taco-helper 0.1.3 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-inject.d.ts +17 -0
- package/dist/auto-inject.d.ts.map +1 -0
- package/dist/auto-inject.js +88 -0
- package/dist/auto-inject.js.map +1 -0
- package/dist/cli.d.ts +3 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +45 -2
- package/dist/cli.js.map +1 -1
- package/dist/daemon.d.ts +14 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +221 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +15 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +27 -16
- package/dist/index.js.map +1 -1
- package/dist/ipc-server.d.ts +31 -0
- package/dist/ipc-server.d.ts.map +1 -0
- package/dist/ipc-server.js +210 -0
- package/dist/ipc-server.js.map +1 -0
- package/dist/ipc.d.ts +55 -0
- package/dist/ipc.d.ts.map +1 -0
- package/dist/ipc.js +43 -0
- package/dist/ipc.js.map +1 -0
- package/dist/launchd.d.ts +23 -0
- package/dist/launchd.d.ts.map +1 -0
- package/dist/launchd.js +102 -0
- package/dist/launchd.js.map +1 -0
- package/dist/mcp-shim.d.ts +15 -0
- package/dist/mcp-shim.d.ts.map +1 -0
- package/dist/mcp-shim.js +477 -0
- package/dist/mcp-shim.js.map +1 -0
- package/dist/project-registry.d.ts +43 -0
- package/dist/project-registry.d.ts.map +1 -0
- package/dist/project-registry.js +87 -0
- package/dist/project-registry.js.map +1 -0
- package/dist/sqlite-store.d.ts +77 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +139 -0
- package/dist/sqlite-store.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC server — Unix socket interface for MCP shims.
|
|
3
|
+
*
|
|
4
|
+
* The daemon listens on ~/.taco/daemon.sock.
|
|
5
|
+
* Each shim connects, registers its CWD, and proxies tool calls.
|
|
6
|
+
*
|
|
7
|
+
* Protocol: newline-delimited JSON.
|
|
8
|
+
*
|
|
9
|
+
* See: daemon-mcp-strategy.md §IPC Protocol
|
|
10
|
+
*/
|
|
11
|
+
import { createServer } from 'net';
|
|
12
|
+
import { existsSync, unlinkSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { randomBytes } from 'crypto';
|
|
15
|
+
import { TACO_DIR } from './sqlite-store.js';
|
|
16
|
+
import { getPortForWorkspace, listProjects } from './project-registry.js';
|
|
17
|
+
const SOCKET_PATH = join(TACO_DIR, 'daemon.sock');
|
|
18
|
+
/** Active shim connections */
|
|
19
|
+
const shims = new Map();
|
|
20
|
+
/**
|
|
21
|
+
* Handle an incoming IPC message from a shim.
|
|
22
|
+
*/
|
|
23
|
+
function handleMessage(raw, socket, store, onBroadcast) {
|
|
24
|
+
let msg;
|
|
25
|
+
try {
|
|
26
|
+
msg = JSON.parse(raw);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
socket.write(JSON.stringify({ event: 'error', message: 'Invalid JSON' }) + '\n');
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const event = msg.event;
|
|
33
|
+
// ── connect: shim registers itself ─────────────────────────
|
|
34
|
+
if (event === 'connect') {
|
|
35
|
+
const shimId = randomBytes(6).toString('hex');
|
|
36
|
+
const conn = {
|
|
37
|
+
shimId,
|
|
38
|
+
cwd: msg.cwd ?? process.cwd(),
|
|
39
|
+
pid: msg.pid ?? 0,
|
|
40
|
+
agent: msg.agent ?? 'unknown',
|
|
41
|
+
socket,
|
|
42
|
+
};
|
|
43
|
+
shims.set(shimId, conn);
|
|
44
|
+
// Store shimId on the socket for disconnect cleanup
|
|
45
|
+
socket.__shimId = shimId;
|
|
46
|
+
console.error(`🌮 [IPC] Shim connected: ${shimId} (cwd: ${conn.cwd}, agent: ${conn.agent})`);
|
|
47
|
+
socket.write(JSON.stringify({ event: 'connected', shimId }) + '\n');
|
|
48
|
+
// Broadcast updated workspace list to SSE clients (for onboarding project cards)
|
|
49
|
+
onBroadcast('workspace-list', { workspaces: listProjects() });
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
// ── tool_call: shim proxies a tool call ────────────────────
|
|
53
|
+
if (event === 'tool_call') {
|
|
54
|
+
const shimId = msg.shimId;
|
|
55
|
+
const conn = shims.get(shimId);
|
|
56
|
+
if (!conn) {
|
|
57
|
+
socket.write(JSON.stringify({
|
|
58
|
+
event: 'tool_result',
|
|
59
|
+
shimId,
|
|
60
|
+
error: 'Unknown shimId. Send a connect event first.',
|
|
61
|
+
}) + '\n');
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const tool = msg.tool;
|
|
65
|
+
const args = msg.args ?? {};
|
|
66
|
+
let result;
|
|
67
|
+
try {
|
|
68
|
+
switch (tool) {
|
|
69
|
+
case 'get_comments': {
|
|
70
|
+
const port = getPortForWorkspace(conn.cwd);
|
|
71
|
+
if (port === undefined) {
|
|
72
|
+
result = {
|
|
73
|
+
comments: [],
|
|
74
|
+
note: 'No project registered for this workspace. Run taco-helper setup first.',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
result = { comments: store.getComments({ port, includeResolved: false }) };
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case 'get_all_comments': {
|
|
83
|
+
const port = getPortForWorkspace(conn.cwd);
|
|
84
|
+
const includeResolved = args.include_resolved ?? true;
|
|
85
|
+
if (port === undefined) {
|
|
86
|
+
result = {
|
|
87
|
+
comments: [],
|
|
88
|
+
note: 'No project registered for this workspace. Run taco-helper setup first.',
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
result = { comments: store.getComments({ port, includeResolved }) };
|
|
93
|
+
}
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
case 'resolve_comment': {
|
|
97
|
+
const success = store.markResolved(args.id);
|
|
98
|
+
result = success
|
|
99
|
+
? { success: true, message: `Comment ${args.id} marked as resolved.` }
|
|
100
|
+
: { success: false, message: `Comment ${args.id} not found.` };
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'action_comment': {
|
|
104
|
+
const success = store.markActioned(args.id);
|
|
105
|
+
result = success
|
|
106
|
+
? { success: true, message: `Comment ${args.id} marked as actioned.` }
|
|
107
|
+
: { success: false, message: `Comment ${args.id} not found.` };
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
case 'list_projects': {
|
|
111
|
+
result = { projects: listProjects() };
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
default:
|
|
115
|
+
result = { error: `Unknown tool: ${tool}` };
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
result = { error: err.message ?? 'Internal error' };
|
|
120
|
+
}
|
|
121
|
+
socket.write(JSON.stringify({ event: 'tool_result', shimId, result }) + '\n');
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
// ── disconnect: shim is shutting down ──────────────────────
|
|
125
|
+
if (event === 'disconnect') {
|
|
126
|
+
const shimId = msg.shimId;
|
|
127
|
+
if (shims.has(shimId)) {
|
|
128
|
+
console.error(`🌮 [IPC] Shim disconnected: ${shimId}`);
|
|
129
|
+
shims.delete(shimId);
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
// Unknown event
|
|
134
|
+
socket.write(JSON.stringify({ event: 'error', message: `Unknown event: ${event}` }) + '\n');
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Start the IPC server on the Unix socket.
|
|
138
|
+
* Returns the server instance for cleanup.
|
|
139
|
+
*/
|
|
140
|
+
export function startIpcServer(store, onBroadcast) {
|
|
141
|
+
// Remove stale socket file
|
|
142
|
+
if (existsSync(SOCKET_PATH)) {
|
|
143
|
+
try {
|
|
144
|
+
unlinkSync(SOCKET_PATH);
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
// ignore
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const server = createServer((socket) => {
|
|
151
|
+
let buffer = '';
|
|
152
|
+
socket.on('data', (data) => {
|
|
153
|
+
buffer += data.toString();
|
|
154
|
+
// Process complete newline-delimited messages
|
|
155
|
+
let newlineIdx;
|
|
156
|
+
while ((newlineIdx = buffer.indexOf('\n')) !== -1) {
|
|
157
|
+
const line = buffer.slice(0, newlineIdx).trim();
|
|
158
|
+
buffer = buffer.slice(newlineIdx + 1);
|
|
159
|
+
if (line.length > 0) {
|
|
160
|
+
handleMessage(line, socket, store, onBroadcast);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
socket.on('close', () => {
|
|
165
|
+
// Clean up shim connection on socket close
|
|
166
|
+
const shimId = socket.__shimId;
|
|
167
|
+
if (shimId && shims.has(shimId)) {
|
|
168
|
+
console.error(`🌮 [IPC] Shim disconnected (socket closed): ${shimId}`);
|
|
169
|
+
shims.delete(shimId);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
socket.on('error', (err) => {
|
|
173
|
+
console.error('🌮 [IPC] Socket error:', err.message);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
server.listen(SOCKET_PATH, () => {
|
|
177
|
+
console.error(`🌮 [IPC] Listening on ${SOCKET_PATH}`);
|
|
178
|
+
});
|
|
179
|
+
server.on('error', (err) => {
|
|
180
|
+
console.error('🌮 [IPC] Server error:', err);
|
|
181
|
+
});
|
|
182
|
+
return server;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Send a message to a specific shim by shimId.
|
|
186
|
+
* Used for daemon-initiated messages (e.g. sampling trigger).
|
|
187
|
+
*/
|
|
188
|
+
export function sendToShim(shimId, message) {
|
|
189
|
+
const conn = shims.get(shimId);
|
|
190
|
+
if (!conn)
|
|
191
|
+
return false;
|
|
192
|
+
conn.socket.write(JSON.stringify(message) + '\n');
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Send a message to all connected shims.
|
|
197
|
+
*/
|
|
198
|
+
export function broadcastToShims(message) {
|
|
199
|
+
const data = JSON.stringify(message) + '\n';
|
|
200
|
+
for (const conn of shims.values()) {
|
|
201
|
+
conn.socket.write(data);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get a list of all connected shim IDs.
|
|
206
|
+
*/
|
|
207
|
+
export function getConnectedShims() {
|
|
208
|
+
return Array.from(shims.keys());
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=ipc-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc-server.js","sourceRoot":"","sources":["../src/ipc-server.ts"],"names":[],"mappings":"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"}
|
package/dist/ipc.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Protocol — shared types for shim ↔ daemon communication.
|
|
3
|
+
* Messages are newline-delimited JSON over a Unix socket at ~/.taco/daemon.sock.
|
|
4
|
+
*
|
|
5
|
+
* See daemon-mcp-strategy.md (IPC Protocol section) for the full spec.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TACO_DIR: string;
|
|
8
|
+
export declare const SOCKET_PATH: string;
|
|
9
|
+
export declare const LOCK_PATH: string;
|
|
10
|
+
export declare const PROJECTS_PATH: string;
|
|
11
|
+
export declare const CONFIG_PATH: string;
|
|
12
|
+
export declare const DB_PATH: string;
|
|
13
|
+
export interface ConnectMessage {
|
|
14
|
+
event: 'connect';
|
|
15
|
+
cwd: string;
|
|
16
|
+
pid: number;
|
|
17
|
+
agent: string;
|
|
18
|
+
}
|
|
19
|
+
export interface DisconnectMessage {
|
|
20
|
+
event: 'disconnect';
|
|
21
|
+
shimId: string;
|
|
22
|
+
}
|
|
23
|
+
export interface ToolCallMessage {
|
|
24
|
+
event: 'tool_call';
|
|
25
|
+
shimId: string;
|
|
26
|
+
tool: string;
|
|
27
|
+
args: Record<string, unknown>;
|
|
28
|
+
}
|
|
29
|
+
export type ShimToDaemonMessage = ConnectMessage | DisconnectMessage | ToolCallMessage;
|
|
30
|
+
export interface ConnectedMessage {
|
|
31
|
+
event: 'connected';
|
|
32
|
+
shimId: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ToolResultMessage {
|
|
35
|
+
event: 'tool_result';
|
|
36
|
+
shimId: string;
|
|
37
|
+
result: unknown;
|
|
38
|
+
error?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface SampleMessage {
|
|
41
|
+
event: 'sample';
|
|
42
|
+
}
|
|
43
|
+
export type DaemonToShimMessage = ConnectedMessage | ToolResultMessage | SampleMessage;
|
|
44
|
+
/**
|
|
45
|
+
* Encode a message as newline-delimited JSON.
|
|
46
|
+
*/
|
|
47
|
+
export declare function encodeMessage(msg: unknown): string;
|
|
48
|
+
/**
|
|
49
|
+
* Parse newline-delimited JSON buffer. Returns parsed messages and any remaining partial data.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseMessages(buffer: string): {
|
|
52
|
+
messages: any[];
|
|
53
|
+
remainder: string;
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=ipc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.d.ts","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,eAAO,MAAM,QAAQ,QAA2B,CAAC;AACjD,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,SAAS,QAAgC,CAAC;AACvD,eAAO,MAAM,aAAa,QAAkC,CAAC;AAC7D,eAAO,MAAM,WAAW,QAAgC,CAAC;AACzD,eAAO,MAAM,OAAO,QAAgC,CAAC;AAIrD,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACjC;AAED,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,iBAAiB,GAAG,eAAe,CAAC;AAIvF,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE,QAAQ,CAAC;CACnB;AAED,MAAM,MAAM,mBAAmB,GAAG,gBAAgB,GAAG,iBAAiB,GAAG,aAAa,CAAC;AAIvF;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAgBpF"}
|
package/dist/ipc.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IPC Protocol — shared types for shim ↔ daemon communication.
|
|
3
|
+
* Messages are newline-delimited JSON over a Unix socket at ~/.taco/daemon.sock.
|
|
4
|
+
*
|
|
5
|
+
* See daemon-mcp-strategy.md (IPC Protocol section) for the full spec.
|
|
6
|
+
*/
|
|
7
|
+
import { join } from 'path';
|
|
8
|
+
import { homedir } from 'os';
|
|
9
|
+
// ─── Paths ──────────────────────────────────────────────────────────
|
|
10
|
+
export const TACO_DIR = join(homedir(), '.taco');
|
|
11
|
+
export const SOCKET_PATH = join(TACO_DIR, 'daemon.sock');
|
|
12
|
+
export const LOCK_PATH = join(TACO_DIR, 'daemon.lock');
|
|
13
|
+
export const PROJECTS_PATH = join(TACO_DIR, 'projects.json');
|
|
14
|
+
export const CONFIG_PATH = join(TACO_DIR, 'config.json');
|
|
15
|
+
export const DB_PATH = join(TACO_DIR, 'comments.db');
|
|
16
|
+
// ─── Helpers ────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Encode a message as newline-delimited JSON.
|
|
19
|
+
*/
|
|
20
|
+
export function encodeMessage(msg) {
|
|
21
|
+
return JSON.stringify(msg) + '\n';
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Parse newline-delimited JSON buffer. Returns parsed messages and any remaining partial data.
|
|
25
|
+
*/
|
|
26
|
+
export function parseMessages(buffer) {
|
|
27
|
+
const messages = [];
|
|
28
|
+
const lines = buffer.split('\n');
|
|
29
|
+
const remainder = lines.pop() ?? ''; // last element is either empty or partial
|
|
30
|
+
for (const line of lines) {
|
|
31
|
+
const trimmed = line.trim();
|
|
32
|
+
if (!trimmed)
|
|
33
|
+
continue;
|
|
34
|
+
try {
|
|
35
|
+
messages.push(JSON.parse(trimmed));
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
console.error('🌮 [IPC] Failed to parse message:', trimmed);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { messages, remainder };
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=ipc.js.map
|
package/dist/ipc.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipc.js","sourceRoot":"","sources":["../src/ipc.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,uEAAuE;AAEvE,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACvD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;AA6CrD,uEAAuE;AAEvE;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACtC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IACxC,MAAM,QAAQ,GAAU,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,0CAA0C;IAE/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* launchd integration — macOS daemon persistence.
|
|
3
|
+
*
|
|
4
|
+
* Registers the taco daemon with launchd so it auto-starts on login
|
|
5
|
+
* and restarts if it crashes.
|
|
6
|
+
*
|
|
7
|
+
* See: daemon-mcp-strategy.md §launchd, taco-helper-package-spec.md §CLI
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Register the daemon with launchd.
|
|
11
|
+
* Writes the plist file and loads it.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerLaunchd(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Unregister the daemon from launchd.
|
|
16
|
+
* Unloads and removes the plist file.
|
|
17
|
+
*/
|
|
18
|
+
export declare function unregisterLaunchd(): void;
|
|
19
|
+
/**
|
|
20
|
+
* Check if the daemon is registered with launchd.
|
|
21
|
+
*/
|
|
22
|
+
export declare function isLaunchdRegistered(): boolean;
|
|
23
|
+
//# sourceMappingURL=launchd.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.d.ts","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8CH;;;GAGG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAiBtC;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAkBxC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C"}
|
package/dist/launchd.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* launchd integration — macOS daemon persistence.
|
|
3
|
+
*
|
|
4
|
+
* Registers the taco daemon with launchd so it auto-starts on login
|
|
5
|
+
* and restarts if it crashes.
|
|
6
|
+
*
|
|
7
|
+
* See: daemon-mcp-strategy.md §launchd, taco-helper-package-spec.md §CLI
|
|
8
|
+
*/
|
|
9
|
+
import { writeFileSync, existsSync, unlinkSync } from 'fs';
|
|
10
|
+
import { join } from 'path';
|
|
11
|
+
import { homedir } from 'os';
|
|
12
|
+
import { execSync } from 'child_process';
|
|
13
|
+
const PLIST_NAME = 'com.taco.daemon.plist';
|
|
14
|
+
const LAUNCH_AGENTS_DIR = join(homedir(), 'Library', 'LaunchAgents');
|
|
15
|
+
const PLIST_PATH = join(LAUNCH_AGENTS_DIR, PLIST_NAME);
|
|
16
|
+
/**
|
|
17
|
+
* Generate the launchd plist XML.
|
|
18
|
+
* Uses npx to run the daemon, so it always uses the latest version.
|
|
19
|
+
*/
|
|
20
|
+
function generatePlist() {
|
|
21
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
22
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
23
|
+
<plist version="1.0">
|
|
24
|
+
<dict>
|
|
25
|
+
<key>Label</key>
|
|
26
|
+
<string>com.taco.daemon</string>
|
|
27
|
+
|
|
28
|
+
<key>ProgramArguments</key>
|
|
29
|
+
<array>
|
|
30
|
+
<string>npx</string>
|
|
31
|
+
<string>-y</string>
|
|
32
|
+
<string>@bbyqtbean/taco-helper@latest</string>
|
|
33
|
+
<string>daemon</string>
|
|
34
|
+
</array>
|
|
35
|
+
|
|
36
|
+
<key>RunAtLoad</key>
|
|
37
|
+
<true/>
|
|
38
|
+
|
|
39
|
+
<key>KeepAlive</key>
|
|
40
|
+
<true/>
|
|
41
|
+
|
|
42
|
+
<key>StandardErrorPath</key>
|
|
43
|
+
<string>${join(homedir(), '.taco', 'daemon.log')}</string>
|
|
44
|
+
|
|
45
|
+
<key>StandardOutPath</key>
|
|
46
|
+
<string>${join(homedir(), '.taco', 'daemon.log')}</string>
|
|
47
|
+
</dict>
|
|
48
|
+
</plist>`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Register the daemon with launchd.
|
|
52
|
+
* Writes the plist file and loads it.
|
|
53
|
+
*/
|
|
54
|
+
export function registerLaunchd() {
|
|
55
|
+
// Write plist
|
|
56
|
+
writeFileSync(PLIST_PATH, generatePlist(), 'utf-8');
|
|
57
|
+
console.error(`🌮 Wrote launchd plist: ${PLIST_PATH}`);
|
|
58
|
+
// Load it
|
|
59
|
+
try {
|
|
60
|
+
execSync(`launchctl load ${PLIST_PATH}`, { stdio: 'pipe' });
|
|
61
|
+
console.error('🌮 Registered daemon with launchd');
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
// Already loaded is fine
|
|
65
|
+
if (err?.stderr?.toString()?.includes('already loaded')) {
|
|
66
|
+
console.error('🌮 Daemon already registered with launchd');
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
throw err;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Unregister the daemon from launchd.
|
|
75
|
+
* Unloads and removes the plist file.
|
|
76
|
+
*/
|
|
77
|
+
export function unregisterLaunchd() {
|
|
78
|
+
if (!existsSync(PLIST_PATH)) {
|
|
79
|
+
console.error('🌮 No launchd plist found — nothing to unregister');
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
execSync(`launchctl unload ${PLIST_PATH}`, { stdio: 'pipe' });
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// May not be loaded — that's fine
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
unlinkSync(PLIST_PATH);
|
|
90
|
+
console.error(`🌮 Removed launchd plist: ${PLIST_PATH}`);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
// File may not exist — that's fine
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if the daemon is registered with launchd.
|
|
98
|
+
*/
|
|
99
|
+
export function isLaunchdRegistered() {
|
|
100
|
+
return existsSync(PLIST_PATH);
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=launchd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launchd.js","sourceRoot":"","sources":["../src/launchd.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,UAAU,GAAG,uBAAuB,CAAC;AAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;AACrE,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;AAEvD;;;GAGG;AACH,SAAS,aAAa;IAClB,OAAO;;;;;;;;;;;;;;;;;;;;;;cAsBG,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC;;;cAGtC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,YAAY,CAAC;;SAE3C,CAAC;AACV,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC3B,cAAc;IACd,aAAa,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC,CAAC;IACpD,OAAO,CAAC,KAAK,CAAC,2BAA2B,UAAU,EAAE,CAAC,CAAC;IAEvD,UAAU;IACV,IAAI,CAAC;QACD,QAAQ,CAAC,kBAAkB,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5D,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAChB,yBAAyB;QACzB,IAAI,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACJ,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC7B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACnE,OAAO;IACX,CAAC;IAED,IAAI,CAAC;QACD,QAAQ,CAAC,oBAAoB,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACL,kCAAkC;IACtC,CAAC;IAED,IAAI,CAAC;QACD,UAAU,CAAC,UAAU,CAAC,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACL,mCAAmC;IACvC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAC/B,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Shim — lightweight proxy between the AI agent and the daemon.
|
|
3
|
+
*
|
|
4
|
+
* Speaks MCP stdio to the agent, proxies tool calls to the daemon
|
|
5
|
+
* over a Unix socket (~/.taco/daemon.sock).
|
|
6
|
+
*
|
|
7
|
+
* See: taco-helper-package-spec.md §MCP Shim, §D, §E
|
|
8
|
+
* See: daemon-mcp-strategy.md §2 (MCP Shim)
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Start the MCP shim.
|
|
12
|
+
* This is the main entry point for `npx taco-helper mcp`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function startMcpShim(): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=mcp-shim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-shim.d.ts","sourceRoot":"","sources":["../src/mcp-shim.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2QH;;;GAGG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAiQlD"}
|