archer-wizard 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/daemon/client.d.ts +4 -0
- package/dist/daemon/client.d.ts.map +1 -0
- package/dist/daemon/client.js +44 -0
- package/dist/daemon/client.js.map +1 -0
- package/dist/daemon/lifecycle.d.ts +9 -0
- package/dist/daemon/lifecycle.d.ts.map +1 -0
- package/dist/daemon/lifecycle.js +118 -0
- package/dist/daemon/lifecycle.js.map +1 -0
- package/dist/daemon/process.d.ts +2 -0
- package/dist/daemon/process.d.ts.map +1 -0
- package/dist/daemon/process.js +171 -0
- package/dist/daemon/process.js.map +1 -0
- package/dist/daemon/run.d.ts +2 -0
- package/dist/daemon/run.d.ts.map +1 -0
- package/dist/daemon/run.js +5 -0
- package/dist/daemon/run.js.map +1 -0
- package/dist/daemon/store.d.ts +9 -0
- package/dist/daemon/store.d.ts.map +1 -0
- package/dist/daemon/store.js +53 -0
- package/dist/daemon/store.js.map +1 -0
- package/dist/daemon/types.d.ts +47 -0
- package/dist/daemon/types.d.ts.map +1 -0
- package/dist/daemon/types.js +10 -0
- package/dist/daemon/types.js.map +1 -0
- package/dist/index.js +105 -21
- package/dist/index.js.map +1 -1
- package/dist/lib/ascii.d.ts.map +1 -1
- package/dist/lib/ascii.js +9 -41
- package/dist/lib/ascii.js.map +1 -1
- package/dist/tools/unwatch.d.ts +7 -0
- package/dist/tools/unwatch.d.ts.map +1 -0
- package/dist/tools/unwatch.js +20 -0
- package/dist/tools/unwatch.js.map +1 -0
- package/dist/tools/watch.d.ts +14 -34
- package/dist/tools/watch.d.ts.map +1 -1
- package/dist/tools/watch.js +36 -170
- package/dist/tools/watch.js.map +1 -1
- package/dist/tools/watches.d.ts +2 -0
- package/dist/tools/watches.d.ts.map +1 -0
- package/dist/tools/watches.js +33 -0
- package/dist/tools/watches.js.map +1 -0
- package/package.json +2 -1
- package/src/daemon/client.ts +50 -0
- package/src/daemon/lifecycle.ts +126 -0
- package/src/daemon/process.ts +207 -0
- package/src/daemon/run.ts +6 -0
- package/src/daemon/store.ts +60 -0
- package/src/daemon/types.ts +41 -0
- package/src/index.ts +111 -22
- package/src/lib/ascii.ts +9 -44
- package/src/tools/unwatch.ts +26 -0
- package/src/tools/watch.ts +46 -212
- package/src/tools/watches.ts +37 -0
package/dist/index.js
CHANGED
|
@@ -2,16 +2,81 @@
|
|
|
2
2
|
import 'dotenv/config';
|
|
3
3
|
// ─── Mode Detection ─────────────────────────────────────────
|
|
4
4
|
const isMcpMode = process.argv.includes('--mcp');
|
|
5
|
-
|
|
5
|
+
const isDaemonMode = process.argv.includes('--daemon');
|
|
6
|
+
if (isDaemonMode) {
|
|
7
|
+
// ─── Daemon Mode ──────────────────────────────────────────
|
|
8
|
+
const { startDaemonProcess } = await import('./daemon/process.js');
|
|
9
|
+
startDaemonProcess();
|
|
10
|
+
}
|
|
11
|
+
else if (isMcpMode) {
|
|
6
12
|
// ─── MCP Server Mode ─────────────────────────────────────
|
|
7
13
|
const { Server } = await import('@modelcontextprotocol/sdk/server/index.js');
|
|
8
14
|
const { StdioServerTransport } = await import('@modelcontextprotocol/sdk/server/stdio.js');
|
|
9
15
|
const { CallToolRequestSchema, ListToolsRequestSchema, } = await import('@modelcontextprotocol/sdk/types.js');
|
|
10
|
-
const { executeWatch,
|
|
16
|
+
const { executeWatch, WatchInputSchema } = await import('./tools/watch.js');
|
|
17
|
+
const { executeUnwatch, UnwatchInputSchema } = await import('./tools/unwatch.js');
|
|
18
|
+
const { executeListWatches } = await import('./tools/watches.js');
|
|
19
|
+
const { ensureDaemon } = await import('./daemon/lifecycle.js');
|
|
11
20
|
const { stderrReady, stderrError } = await import('./lib/ascii.js');
|
|
21
|
+
// Auto-start daemon if not running
|
|
22
|
+
try {
|
|
23
|
+
const { pid } = await ensureDaemon();
|
|
24
|
+
stderrReady(`daemon running (pid ${pid})`);
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
stderrError('warning: could not start daemon — watches will fail');
|
|
28
|
+
}
|
|
29
|
+
// Read credentials from environment
|
|
30
|
+
const supabaseUrl = process.env.SUPABASE_URL ?? '';
|
|
31
|
+
const serviceRoleKey = process.env.SUPABASE_SERVICE_ROLE_KEY ?? '';
|
|
32
|
+
// ─── Tool Definitions ──────────────────────────────────────
|
|
33
|
+
const WATCH_TOOL = {
|
|
34
|
+
name: 'archer_watch',
|
|
35
|
+
description: 'Create a persistent real-time watch on a Supabase table. The watch survives agent session restarts. Delivers changes to a webhook URL.',
|
|
36
|
+
inputSchema: {
|
|
37
|
+
type: 'object',
|
|
38
|
+
properties: {
|
|
39
|
+
table: { type: 'string', description: 'Supabase table name to watch' },
|
|
40
|
+
event: {
|
|
41
|
+
type: 'string',
|
|
42
|
+
enum: ['INSERT', 'UPDATE', 'DELETE', '*'],
|
|
43
|
+
description: 'Database event to listen for (default: *)',
|
|
44
|
+
default: '*',
|
|
45
|
+
},
|
|
46
|
+
filter: {
|
|
47
|
+
type: 'string',
|
|
48
|
+
description: 'Optional Postgres filter e.g. "status=eq.active"',
|
|
49
|
+
},
|
|
50
|
+
webhookUrl: {
|
|
51
|
+
type: 'string',
|
|
52
|
+
description: 'URL to receive webhook POST when event fires',
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
required: ['table'],
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const UNWATCH_TOOL = {
|
|
59
|
+
name: 'archer_unwatch',
|
|
60
|
+
description: 'Remove an active watch by its ID. The watch will stop listening and be deleted from persistent storage.',
|
|
61
|
+
inputSchema: {
|
|
62
|
+
type: 'object',
|
|
63
|
+
properties: {
|
|
64
|
+
watchId: { type: 'string', description: 'The watch ID returned by archer_watch' },
|
|
65
|
+
},
|
|
66
|
+
required: ['watchId'],
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
const WATCHES_TOOL = {
|
|
70
|
+
name: 'archer_watches',
|
|
71
|
+
description: 'List all active watches managed by the archer daemon, including their IDs, tables, events, and webhook URLs.',
|
|
72
|
+
inputSchema: {
|
|
73
|
+
type: 'object',
|
|
74
|
+
properties: {},
|
|
75
|
+
},
|
|
76
|
+
};
|
|
12
77
|
const server = new Server({
|
|
13
78
|
name: 'archer',
|
|
14
|
-
version: '0.
|
|
79
|
+
version: '0.2.0',
|
|
15
80
|
}, {
|
|
16
81
|
capabilities: {
|
|
17
82
|
tools: {},
|
|
@@ -20,32 +85,51 @@ if (isMcpMode) {
|
|
|
20
85
|
// Register tool listing
|
|
21
86
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
22
87
|
return {
|
|
23
|
-
tools: [
|
|
88
|
+
tools: [WATCH_TOOL, UNWATCH_TOOL, WATCHES_TOOL],
|
|
24
89
|
};
|
|
25
90
|
});
|
|
26
91
|
// Register tool execution
|
|
27
92
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
28
93
|
const { name, arguments: args } = request.params;
|
|
29
|
-
|
|
30
|
-
|
|
94
|
+
try {
|
|
95
|
+
let resultText;
|
|
96
|
+
switch (name) {
|
|
97
|
+
case 'archer_watch': {
|
|
98
|
+
const input = WatchInputSchema.parse(args);
|
|
99
|
+
resultText = await executeWatch(input, supabaseUrl, serviceRoleKey);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'archer_unwatch': {
|
|
103
|
+
const input = UnwatchInputSchema.parse(args);
|
|
104
|
+
resultText = await executeUnwatch(input);
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case 'archer_watches': {
|
|
108
|
+
resultText = await executeListWatches();
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
default:
|
|
112
|
+
return {
|
|
113
|
+
content: [
|
|
114
|
+
{
|
|
115
|
+
type: 'text',
|
|
116
|
+
text: JSON.stringify({ error: `unknown tool: ${name}` }),
|
|
117
|
+
},
|
|
118
|
+
],
|
|
119
|
+
isError: true,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
31
122
|
return {
|
|
32
|
-
content: [
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
123
|
+
content: [{ type: 'text', text: resultText }],
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (err) {
|
|
127
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
128
|
+
return {
|
|
129
|
+
content: [{ type: 'text', text: `❌ Error: ${message}` }],
|
|
130
|
+
isError: true,
|
|
38
131
|
};
|
|
39
132
|
}
|
|
40
|
-
return {
|
|
41
|
-
content: [
|
|
42
|
-
{
|
|
43
|
-
type: 'text',
|
|
44
|
-
text: JSON.stringify({ error: `unknown tool: ${name}` }),
|
|
45
|
-
},
|
|
46
|
-
],
|
|
47
|
-
isError: true,
|
|
48
|
-
};
|
|
49
133
|
});
|
|
50
134
|
// Start server
|
|
51
135
|
try {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,eAAe,CAAC;AAEvB,+DAA+D;AAE/D,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/ascii.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ascii.d.ts","sourceRoot":"","sources":["../../src/lib/ascii.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"ascii.d.ts","sourceRoot":"","sources":["../../src/lib/ascii.ts"],"names":[],"mappings":"AAWA,wBAAgB,YAAY,IAAI,IAAI,CAenC;AAID,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE9C;AAID,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKpD;AAID,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAqBvD;AAID,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEnD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
package/dist/lib/ascii.js
CHANGED
|
@@ -7,50 +7,18 @@ const emeraldDim = colors.dim;
|
|
|
7
7
|
// ─── ASCII Art ──────────────────────────────────────────────
|
|
8
8
|
export function showAsciiArt() {
|
|
9
9
|
const lines = [
|
|
10
|
-
'
|
|
11
|
-
'
|
|
12
|
-
'
|
|
13
|
-
'
|
|
14
|
-
'
|
|
15
|
-
'
|
|
10
|
+
'',
|
|
11
|
+
' █████╗ ██████╗ ██████╗██╗ ██╗███████╗██████╗ ',
|
|
12
|
+
' ██╔══██╗██╔══██╗██╔════╝██║ ██║██╔════╝██╔══██╗',
|
|
13
|
+
' ███████║██████╔╝██║ ███████║█████╗ ██████╔╝',
|
|
14
|
+
' ██╔══██║██╔══██╗██║ ██╔══██║██╔══╝ ██╔══██╗',
|
|
15
|
+
' ██║ ██║██║ ██║╚██████╗██║ ██║███████╗██║ ██║',
|
|
16
|
+
' ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝',
|
|
17
|
+
'',
|
|
16
18
|
];
|
|
17
|
-
// Column boundaries for coloring:
|
|
18
|
-
// A: cols 0-5, R: 6-13, C: 14-21, H: 22-29, E: 30-37, R: 38-45
|
|
19
|
-
// ARCH = white, ER = emerald green
|
|
20
|
-
const archEnd = 30; // columns 0-29 are A R C H
|
|
21
|
-
const erEnd = 46; // columns 30-45 are E R
|
|
22
19
|
for (const line of lines) {
|
|
23
|
-
|
|
24
|
-
const erPart = line.slice(archEnd, erEnd);
|
|
25
|
-
const rest = line.slice(erEnd);
|
|
26
|
-
process.stdout.write(colors.white(archPart) + emerald(erPart) + rest + '\n');
|
|
20
|
+
console.log(emerald(line));
|
|
27
21
|
}
|
|
28
|
-
// Pixel art bow and arrow (emerald green)
|
|
29
|
-
const bowArrow = [
|
|
30
|
-
` ${emerald('╭───╮')}`,
|
|
31
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
32
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
33
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
34
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
35
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
36
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
37
|
-
` ${emerald('╱')} ${emerald('╲')}`,
|
|
38
|
-
`${emerald('╱')} ${emerald('╲')}`,
|
|
39
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
40
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
41
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
42
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
43
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
44
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
45
|
-
` ${emerald('╲')} ${emerald('╱')}`,
|
|
46
|
-
` ${emerald('╰───╯')}`,
|
|
47
|
-
` ${emerald('───►')}`,
|
|
48
|
-
];
|
|
49
|
-
console.log();
|
|
50
|
-
bowArrow.forEach(line => console.log(line));
|
|
51
|
-
console.log();
|
|
52
|
-
console.log(emeraldDim(' v0.1.0 · event intelligence for AI agents'));
|
|
53
|
-
console.log();
|
|
54
22
|
}
|
|
55
23
|
// ─── Status Logger ──────────────────────────────────────────
|
|
56
24
|
export function logAction(message) {
|
package/dist/lib/ascii.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ascii.js","sourceRoot":"","sources":["../../src/lib/ascii.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,qCAAqC;AACrC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAErC,yDAAyD;AACzD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;AAE9B,+DAA+D;AAE/D,MAAM,UAAU,YAAY;IAC1B,MAAM,KAAK,GAAG;QACZ,
|
|
1
|
+
{"version":3,"file":"ascii.js","sourceRoot":"","sources":["../../src/lib/ascii.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const UnwatchInputSchema: z.ZodObject<{
|
|
3
|
+
watchId: z.ZodString;
|
|
4
|
+
}, z.core.$strip>;
|
|
5
|
+
export type UnwatchInput = z.infer<typeof UnwatchInputSchema>;
|
|
6
|
+
export declare function executeUnwatch(input: UnwatchInput): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=unwatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unwatch.d.ts","sourceRoot":"","sources":["../../src/tools/unwatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,kBAAkB;;iBAE7B,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAI9D,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAYzE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { sendCommand } from '../daemon/client.js';
|
|
3
|
+
// ─── Input Schema ───────────────────────────────────────────
|
|
4
|
+
export const UnwatchInputSchema = z.object({
|
|
5
|
+
watchId: z.string().min(1, 'watchId is required'),
|
|
6
|
+
});
|
|
7
|
+
// ─── Execute Unwatch (via daemon IPC) ───────────────────────
|
|
8
|
+
export async function executeUnwatch(input) {
|
|
9
|
+
try {
|
|
10
|
+
const res = await sendCommand({ type: 'remove_watch', watchId: input.watchId });
|
|
11
|
+
if (!res.ok) {
|
|
12
|
+
return `❌ Failed to remove watch: ${res.error}`;
|
|
13
|
+
}
|
|
14
|
+
return `✅ Watch removed: ${input.watchId}`;
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return `❌ Daemon error: ${err instanceof Error ? err.message : String(err)}\n\nIs the archer daemon running?`;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=unwatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unwatch.js","sourceRoot":"","sources":["../../src/tools/unwatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,+DAA+D;AAE/D,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,qBAAqB,CAAC;CAClD,CAAC,CAAC;AAIH,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,KAAmB;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAEhF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,6BAA6B,GAAG,CAAC,KAAK,EAAE,CAAC;QAClD,CAAC;QAED,OAAO,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,mCAAmC,CAAC;IAChH,CAAC;AACH,CAAC"}
|
package/dist/tools/watch.d.ts
CHANGED
|
@@ -1,35 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
type: "string";
|
|
16
|
-
enum: string[];
|
|
17
|
-
description: string;
|
|
18
|
-
};
|
|
19
|
-
table: {
|
|
20
|
-
type: "string";
|
|
21
|
-
description: string;
|
|
22
|
-
};
|
|
23
|
-
condition: {
|
|
24
|
-
type: "string";
|
|
25
|
-
description: string;
|
|
26
|
-
};
|
|
27
|
-
webhookUrl: {
|
|
28
|
-
type: "string";
|
|
29
|
-
description: string;
|
|
30
|
-
};
|
|
31
|
-
};
|
|
32
|
-
required: string[];
|
|
33
|
-
};
|
|
34
|
-
};
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const WatchInputSchema: z.ZodObject<{
|
|
3
|
+
table: z.ZodString;
|
|
4
|
+
event: z.ZodDefault<z.ZodEnum<{
|
|
5
|
+
INSERT: "INSERT";
|
|
6
|
+
UPDATE: "UPDATE";
|
|
7
|
+
DELETE: "DELETE";
|
|
8
|
+
"*": "*";
|
|
9
|
+
}>>;
|
|
10
|
+
filter: z.ZodOptional<z.ZodString>;
|
|
11
|
+
webhookUrl: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, z.core.$strip>;
|
|
13
|
+
export type WatchInput = z.infer<typeof WatchInputSchema>;
|
|
14
|
+
export declare function executeWatch(input: WatchInput, supabaseUrl: string, serviceRoleKey: string): Promise<string>;
|
|
35
15
|
//# sourceMappingURL=watch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/tools/watch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/tools/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,gBAAgB;;;;;;;;;;iBAK3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAI1D,wBAAsB,YAAY,CAChC,KAAK,EAAE,UAAU,EACjB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAmCjB"}
|
package/dist/tools/watch.js
CHANGED
|
@@ -1,178 +1,44 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
if (!matchedOperator || splitIndex === -1) {
|
|
24
|
-
stderrError(`unknown condition format: "${condition}"`);
|
|
25
|
-
return true; // Pass through if condition can't be parsed
|
|
26
|
-
}
|
|
27
|
-
const field = condition.slice(0, splitIndex).trim();
|
|
28
|
-
const value = condition.slice(splitIndex + matchedOperator.length).trim();
|
|
29
|
-
const fieldValue = String(data[field] ?? '');
|
|
30
|
-
switch (matchedOperator) {
|
|
31
|
-
case 'ends with':
|
|
32
|
-
return fieldValue.endsWith(value);
|
|
33
|
-
case 'starts with':
|
|
34
|
-
return fieldValue.startsWith(value);
|
|
35
|
-
case 'contains':
|
|
36
|
-
return fieldValue.includes(value);
|
|
37
|
-
case 'equals':
|
|
38
|
-
return fieldValue === value;
|
|
39
|
-
default:
|
|
40
|
-
return true;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// ─── Map Event To Postgres Event ────────────────────────────
|
|
44
|
-
function toPostgresEvent(event) {
|
|
45
|
-
switch (event) {
|
|
46
|
-
case 'table.insert': return 'INSERT';
|
|
47
|
-
case 'table.update': return 'UPDATE';
|
|
48
|
-
case 'table.delete': return 'DELETE';
|
|
49
|
-
default: return 'INSERT';
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// ─── Event Handler ──────────────────────────────────────────
|
|
53
|
-
function createEventHandler(watch) {
|
|
54
|
-
return async (data) => {
|
|
55
|
-
stderrAction(`event received → ${watch.event}${watch.table ? ` on ${watch.table}` : ''}`);
|
|
56
|
-
// Apply condition filter
|
|
57
|
-
if (watch.condition && !evaluateCondition(data, watch.condition)) {
|
|
58
|
-
stderrAction(`condition not met → "${watch.condition}", skipping`);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
// Build and fire webhook
|
|
62
|
-
const payload = buildWebhookPayload(watch.watchId, watch.event, data);
|
|
63
|
-
await fireWebhook({
|
|
64
|
-
url: watch.webhookUrl,
|
|
65
|
-
payload,
|
|
66
|
-
event: watch.event,
|
|
67
|
-
});
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { sendCommand } from '../daemon/client.js';
|
|
3
|
+
// ─── Input Schema ───────────────────────────────────────────
|
|
4
|
+
export const WatchInputSchema = z.object({
|
|
5
|
+
table: z.string().min(1, 'table name is required'),
|
|
6
|
+
event: z.enum(['INSERT', 'UPDATE', 'DELETE', '*']).default('*'),
|
|
7
|
+
filter: z.string().optional(),
|
|
8
|
+
webhookUrl: z.string().url().optional(),
|
|
9
|
+
});
|
|
10
|
+
// ─── Execute Watch (via daemon IPC) ─────────────────────────
|
|
11
|
+
export async function executeWatch(input, supabaseUrl, serviceRoleKey) {
|
|
12
|
+
const watchId = `watch-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
13
|
+
const watch = {
|
|
14
|
+
id: watchId,
|
|
15
|
+
table: input.table,
|
|
16
|
+
event: input.event,
|
|
17
|
+
filter: input.filter,
|
|
18
|
+
webhookUrl: input.webhookUrl,
|
|
19
|
+
createdAt: new Date().toISOString(),
|
|
20
|
+
supabaseUrl,
|
|
21
|
+
supabaseKey: serviceRoleKey,
|
|
68
22
|
};
|
|
69
|
-
}
|
|
70
|
-
// ─── Main Watch Implementation ──────────────────────────────
|
|
71
|
-
export function executeWatch(rawInput) {
|
|
72
|
-
// Validate input
|
|
73
|
-
const parseResult = WatchInputSchema.safeParse(rawInput);
|
|
74
|
-
if (!parseResult.success) {
|
|
75
|
-
const errors = parseResult.error.issues.map((e) => e.message).join(', ');
|
|
76
|
-
return {
|
|
77
|
-
success: false,
|
|
78
|
-
watchId: '',
|
|
79
|
-
message: `validation failed: ${errors}`,
|
|
80
|
-
condition: null,
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
const input = parseResult.data;
|
|
84
|
-
const watchId = `watch_${crypto.randomUUID().slice(0, 8)}`;
|
|
85
|
-
stderrAction(`creating watch ${watchId} for ${input.event}`);
|
|
86
23
|
try {
|
|
87
|
-
|
|
88
|
-
if (
|
|
89
|
-
|
|
90
|
-
const handler = createEventHandler({
|
|
91
|
-
watchId,
|
|
92
|
-
channel: null,
|
|
93
|
-
event: input.event,
|
|
94
|
-
condition: input.condition,
|
|
95
|
-
webhookUrl: input.webhookUrl,
|
|
96
|
-
});
|
|
97
|
-
channel = createAuthChannel(watchId, handler);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
// Table events → watch specific table
|
|
101
|
-
const table = input.table;
|
|
102
|
-
const pgEvent = toPostgresEvent(input.event);
|
|
103
|
-
const handler = createEventHandler({
|
|
104
|
-
watchId,
|
|
105
|
-
channel: null,
|
|
106
|
-
event: input.event,
|
|
107
|
-
table,
|
|
108
|
-
condition: input.condition,
|
|
109
|
-
webhookUrl: input.webhookUrl,
|
|
110
|
-
});
|
|
111
|
-
channel = createTableChannel(watchId, table, pgEvent, handler);
|
|
24
|
+
const res = await sendCommand({ type: 'add_watch', watch });
|
|
25
|
+
if (!res.ok) {
|
|
26
|
+
return `❌ Failed to add watch: ${res.error}`;
|
|
112
27
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
const conditionInfo = input.condition ? ` where ${input.condition}` : '';
|
|
125
|
-
const message = `watching ${input.event}${tableInfo}${conditionInfo} → ${input.webhookUrl}`;
|
|
126
|
-
stderrSuccess(message);
|
|
127
|
-
return {
|
|
128
|
-
success: true,
|
|
129
|
-
watchId,
|
|
130
|
-
message,
|
|
131
|
-
condition: input.condition ?? null,
|
|
132
|
-
};
|
|
28
|
+
const parts = [
|
|
29
|
+
`✅ Watch created: ${watchId}`,
|
|
30
|
+
` table: ${input.table}`,
|
|
31
|
+
` event: ${input.event}`,
|
|
32
|
+
];
|
|
33
|
+
if (input.filter)
|
|
34
|
+
parts.push(` filter: ${input.filter}`);
|
|
35
|
+
if (input.webhookUrl)
|
|
36
|
+
parts.push(` webhook: ${input.webhookUrl}`);
|
|
37
|
+
parts.push(` status: subscribed via daemon (persistent)`);
|
|
38
|
+
return parts.join('\n');
|
|
133
39
|
}
|
|
134
40
|
catch (err) {
|
|
135
|
-
|
|
136
|
-
stderrError(`watch failed: ${message}`);
|
|
137
|
-
return {
|
|
138
|
-
success: false,
|
|
139
|
-
watchId,
|
|
140
|
-
message: `watch failed: ${message}`,
|
|
141
|
-
condition: input.condition ?? null,
|
|
142
|
-
};
|
|
41
|
+
return `❌ Daemon error: ${err instanceof Error ? err.message : String(err)}\n\nIs the archer daemon running? Try restarting with: npx archer-wizard@latest --daemon`;
|
|
143
42
|
}
|
|
144
43
|
}
|
|
145
|
-
// ─── Tool Schema (for MCP registration) ─────────────────────
|
|
146
|
-
export const WATCH_TOOL_SCHEMA = {
|
|
147
|
-
name: 'archer_watch',
|
|
148
|
-
description: 'Archer is the event intelligence layer for AI agents. Watch real-time events from data sources. Monitors auth signups, table inserts, updates, and deletes. Fires a webhook when conditions are met. Agents stop waiting for you to talk to them and start acting on their own when the world moves.',
|
|
149
|
-
inputSchema: {
|
|
150
|
-
type: 'object',
|
|
151
|
-
properties: {
|
|
152
|
-
source: {
|
|
153
|
-
type: 'string',
|
|
154
|
-
enum: ['supabase'],
|
|
155
|
-
description: 'Event source (currently only "supabase")',
|
|
156
|
-
},
|
|
157
|
-
event: {
|
|
158
|
-
type: 'string',
|
|
159
|
-
enum: ['auth.signup', 'table.insert', 'table.update', 'table.delete'],
|
|
160
|
-
description: 'Event type to watch for',
|
|
161
|
-
},
|
|
162
|
-
table: {
|
|
163
|
-
type: 'string',
|
|
164
|
-
description: 'Table name (required for table.* events)',
|
|
165
|
-
},
|
|
166
|
-
condition: {
|
|
167
|
-
type: 'string',
|
|
168
|
-
description: 'Optional filter like "email ends with @gmail.com". Supports: ends with, starts with, contains, equals',
|
|
169
|
-
},
|
|
170
|
-
webhookUrl: {
|
|
171
|
-
type: 'string',
|
|
172
|
-
description: 'URL to receive POST notifications when events match',
|
|
173
|
-
},
|
|
174
|
-
},
|
|
175
|
-
required: ['source', 'event', 'webhookUrl'],
|
|
176
|
-
},
|
|
177
|
-
};
|
|
178
44
|
//# sourceMappingURL=watch.js.map
|
package/dist/tools/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/tools/watch.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../../src/tools/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGlD,+DAA+D;AAE/D,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;IAClD,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;IAC/D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;CACxC,CAAC,CAAC;AAIH,+DAA+D;AAE/D,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,KAAiB,EACjB,WAAmB,EACnB,cAAsB;IAEtB,MAAM,OAAO,GAAG,SAAS,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAEhF,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,OAAO;QACX,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW;QACX,WAAW,EAAE,cAAc;KAC5B,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAE5D,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,0BAA0B,GAAG,CAAC,KAAK,EAAE,CAAC;QAC/C,CAAC;QAED,MAAM,KAAK,GAAG;YACZ,oBAAoB,OAAO,EAAE;YAC7B,aAAa,KAAK,CAAC,KAAK,EAAE;YAC1B,aAAa,KAAK,CAAC,KAAK,EAAE;SAC3B,CAAC;QAEF,IAAI,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,KAAK,CAAC,UAAU;YAAE,KAAK,CAAC,IAAI,CAAC,eAAe,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;QACpE,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAE5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,0FAA0F,CAAC;IACvK,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watches.d.ts","sourceRoot":"","sources":["../../src/tools/watches.ts"],"names":[],"mappings":"AAIA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAgC1D"}
|