@agent-wire/terminal 1.6.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/README.md +353 -0
- package/dist/api.d.ts +660 -0
- package/dist/api.js +1157 -0
- package/dist/api.js.map +1 -0
- package/dist/background-worker.d.ts +6 -0
- package/dist/background-worker.js +101 -0
- package/dist/background-worker.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +940 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +17 -0
- package/dist/config.js +36 -0
- package/dist/config.js.map +1 -0
- package/dist/help-pointer.d.ts +11 -0
- package/dist/help-pointer.js +10 -0
- package/dist/help-pointer.js.map +1 -0
- package/dist/identity.d.ts +40 -0
- package/dist/identity.js +193 -0
- package/dist/identity.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/local-pull.d.ts +45 -0
- package/dist/local-pull.js +173 -0
- package/dist/local-pull.js.map +1 -0
- package/dist/lockfile.d.ts +16 -0
- package/dist/lockfile.js +78 -0
- package/dist/lockfile.js.map +1 -0
- package/dist/mcp-server.d.ts +43 -0
- package/dist/mcp-server.js +3159 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/response-shaper.d.ts +60 -0
- package/dist/response-shaper.js +893 -0
- package/dist/response-shaper.js.map +1 -0
- package/dist/slots.d.ts +65 -0
- package/dist/slots.js +128 -0
- package/dist/slots.js.map +1 -0
- package/dist/sync/diff.d.ts +17 -0
- package/dist/sync/diff.js +152 -0
- package/dist/sync/diff.js.map +1 -0
- package/dist/sync/hash.d.ts +11 -0
- package/dist/sync/hash.js +18 -0
- package/dist/sync/hash.js.map +1 -0
- package/dist/sync/index.d.ts +24 -0
- package/dist/sync/index.js +22 -0
- package/dist/sync/index.js.map +1 -0
- package/dist/sync/manifest.d.ts +29 -0
- package/dist/sync/manifest.js +59 -0
- package/dist/sync/manifest.js.map +1 -0
- package/dist/sync/match.d.ts +29 -0
- package/dist/sync/match.js +153 -0
- package/dist/sync/match.js.map +1 -0
- package/dist/sync/paginate.d.ts +16 -0
- package/dist/sync/paginate.js +34 -0
- package/dist/sync/paginate.js.map +1 -0
- package/dist/sync/preview.d.ts +16 -0
- package/dist/sync/preview.js +179 -0
- package/dist/sync/preview.js.map +1 -0
- package/dist/sync/pull.d.ts +23 -0
- package/dist/sync/pull.js +126 -0
- package/dist/sync/pull.js.map +1 -0
- package/dist/sync/push.d.ts +27 -0
- package/dist/sync/push.js +116 -0
- package/dist/sync/push.js.map +1 -0
- package/dist/sync/resolve.d.ts +19 -0
- package/dist/sync/resolve.js +42 -0
- package/dist/sync/resolve.js.map +1 -0
- package/dist/sync/types.d.ts +70 -0
- package/dist/sync/types.js +6 -0
- package/dist/sync/types.js.map +1 -0
- package/dist/sync/walk.d.ts +12 -0
- package/dist/sync/walk.js +155 -0
- package/dist/sync/walk.js.map +1 -0
- package/dist/wait-cli.d.ts +46 -0
- package/dist/wait-cli.js +280 -0
- package/dist/wait-cli.js.map +1 -0
- package/dist/worker.d.ts +14 -0
- package/dist/worker.js +252 -0
- package/dist/worker.js.map +1 -0
- package/package.json +58 -0
package/dist/wait-cli.js
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
|
2
|
+
import { basename, join } from 'path';
|
|
3
|
+
import { WireAPI } from './api.js';
|
|
4
|
+
import { CONFIG_DIR, loadConfig } from './config.js';
|
|
5
|
+
import { loadAgentIdentity } from './identity.js';
|
|
6
|
+
export class WaitCliUsageError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = 'WaitCliUsageError';
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class WaitCliHelp extends Error {
|
|
13
|
+
constructor() {
|
|
14
|
+
super('');
|
|
15
|
+
this.name = 'WaitCliHelp';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const DEFAULT_TIMEOUT_SECONDS = 600;
|
|
19
|
+
const MAX_TIMEOUT_SECONDS = 600;
|
|
20
|
+
const DEFAULT_LIMIT = 1;
|
|
21
|
+
const MAX_LIMIT = 200;
|
|
22
|
+
const RECONNECT_DELAY_MS = 1_000;
|
|
23
|
+
function readRequiredValue(argv, index, flag) {
|
|
24
|
+
const value = argv[index + 1];
|
|
25
|
+
if (!value || value.startsWith('--')) {
|
|
26
|
+
throw new WaitCliUsageError(`${flag} requires a value`);
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
function parseBoundedInteger(value, flag, min, max) {
|
|
31
|
+
const parsed = Number(value);
|
|
32
|
+
if (!Number.isFinite(parsed)) {
|
|
33
|
+
throw new WaitCliUsageError(`${flag} must be a number`);
|
|
34
|
+
}
|
|
35
|
+
const integer = Math.floor(parsed);
|
|
36
|
+
if (integer < min) {
|
|
37
|
+
throw new WaitCliUsageError(`${flag} must be >= ${min}`);
|
|
38
|
+
}
|
|
39
|
+
return Math.min(integer, max);
|
|
40
|
+
}
|
|
41
|
+
export function parseWaitArgs(argv) {
|
|
42
|
+
const options = {
|
|
43
|
+
filters: {},
|
|
44
|
+
timeoutSeconds: DEFAULT_TIMEOUT_SECONDS,
|
|
45
|
+
limit: DEFAULT_LIMIT,
|
|
46
|
+
};
|
|
47
|
+
for (let i = 0; i < argv.length; i++) {
|
|
48
|
+
const arg = argv[i];
|
|
49
|
+
if (arg === '--triggers') {
|
|
50
|
+
const value = readRequiredValue(argv, i, arg);
|
|
51
|
+
const triggers = value.split(',').map((part) => part.trim()).filter(Boolean);
|
|
52
|
+
if (triggers.length === 0)
|
|
53
|
+
throw new WaitCliUsageError('--triggers must include at least one trigger');
|
|
54
|
+
options.triggers = triggers;
|
|
55
|
+
i++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
if (arg === '--cursor') {
|
|
59
|
+
options.cursor = readRequiredValue(argv, i, arg);
|
|
60
|
+
i++;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (arg === '--filter') {
|
|
64
|
+
const value = readRequiredValue(argv, i, arg);
|
|
65
|
+
const eqIndex = value.indexOf('=');
|
|
66
|
+
if (eqIndex <= 0)
|
|
67
|
+
throw new WaitCliUsageError('--filter must be in k=v form');
|
|
68
|
+
const key = value.slice(0, eqIndex).trim();
|
|
69
|
+
const filterValue = value.slice(eqIndex + 1).trim();
|
|
70
|
+
if (!key)
|
|
71
|
+
throw new WaitCliUsageError('--filter key cannot be empty');
|
|
72
|
+
options.filters[key] = filterValue;
|
|
73
|
+
i++;
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
if (arg === '--timeout-seconds') {
|
|
77
|
+
options.timeoutSeconds = parseBoundedInteger(readRequiredValue(argv, i, arg), arg, 0, MAX_TIMEOUT_SECONDS);
|
|
78
|
+
i++;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (arg === '--limit') {
|
|
82
|
+
options.limit = parseBoundedInteger(readRequiredValue(argv, i, arg), arg, 1, MAX_LIMIT);
|
|
83
|
+
i++;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
if (arg === '--name') {
|
|
87
|
+
options.name = readRequiredValue(argv, i, arg);
|
|
88
|
+
i++;
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
if (arg === '--help' || arg === '-h') {
|
|
92
|
+
throw new WaitCliHelp();
|
|
93
|
+
}
|
|
94
|
+
throw new WaitCliUsageError(`Unknown wait argument: ${arg}`);
|
|
95
|
+
}
|
|
96
|
+
return options;
|
|
97
|
+
}
|
|
98
|
+
function loadCachedIdentities() {
|
|
99
|
+
const agentsDir = join(CONFIG_DIR, 'agents');
|
|
100
|
+
if (!existsSync(agentsDir))
|
|
101
|
+
return [];
|
|
102
|
+
const identities = [];
|
|
103
|
+
for (const filename of readdirSync(agentsDir)) {
|
|
104
|
+
if (!filename.endsWith('.json'))
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
const raw = readFileSync(join(agentsDir, filename), 'utf-8');
|
|
108
|
+
const identity = JSON.parse(raw);
|
|
109
|
+
if (!identity.apiToken || !identity.agentId || !identity.pseudoId || !identity.operatorEmail)
|
|
110
|
+
continue;
|
|
111
|
+
identities.push({ name: basename(filename, '.json'), identity });
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
// Ignore corrupt local identity cache files; explicit --name still fails loudly.
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return identities;
|
|
118
|
+
}
|
|
119
|
+
export function resolveWaitIdentity(name) {
|
|
120
|
+
if (name) {
|
|
121
|
+
const identity = loadAgentIdentity(name);
|
|
122
|
+
if (!identity)
|
|
123
|
+
throw new WaitCliUsageError(`No cached Wire identity found for --name ${name}`);
|
|
124
|
+
return identity;
|
|
125
|
+
}
|
|
126
|
+
const identities = loadCachedIdentities();
|
|
127
|
+
if (identities.length === 0) {
|
|
128
|
+
throw new WaitCliUsageError('No cached Wire identity found. Run wire_identify through MCP or pass --name for an existing identity.');
|
|
129
|
+
}
|
|
130
|
+
if (identities.length > 1) {
|
|
131
|
+
throw new WaitCliUsageError(`Multiple cached Wire identities found (${identities.map((entry) => entry.name).join(', ')}). Pass --name.`);
|
|
132
|
+
}
|
|
133
|
+
return identities[0].identity;
|
|
134
|
+
}
|
|
135
|
+
function isAbortError(err) {
|
|
136
|
+
return err?.name === 'AbortError';
|
|
137
|
+
}
|
|
138
|
+
function sleepWithAbort(ms, signal) {
|
|
139
|
+
if (ms <= 0)
|
|
140
|
+
return Promise.resolve();
|
|
141
|
+
if (signal.aborted)
|
|
142
|
+
return Promise.reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
|
|
143
|
+
return new Promise((resolvePromise, reject) => {
|
|
144
|
+
const onAbort = () => {
|
|
145
|
+
clearTimeout(timer);
|
|
146
|
+
reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
|
|
147
|
+
};
|
|
148
|
+
const timer = setTimeout(() => {
|
|
149
|
+
signal.removeEventListener('abort', onAbort);
|
|
150
|
+
resolvePromise();
|
|
151
|
+
}, ms);
|
|
152
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
export function installWaitSignalHandlers(controller, processTarget = process) {
|
|
156
|
+
const onSignal = () => controller.abort();
|
|
157
|
+
processTarget.once('SIGINT', onSignal);
|
|
158
|
+
processTarget.once('SIGTERM', onSignal);
|
|
159
|
+
return () => {
|
|
160
|
+
const off = processTarget.off?.bind(processTarget) || processTarget.removeListener.bind(processTarget);
|
|
161
|
+
off('SIGINT', onSignal);
|
|
162
|
+
off('SIGTERM', onSignal);
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
export async function waitForMatchingEvents(api, options, signal) {
|
|
166
|
+
const events = [];
|
|
167
|
+
let nextCursor = options.cursor;
|
|
168
|
+
let timedOut = false;
|
|
169
|
+
const waitController = new AbortController();
|
|
170
|
+
const onCallerAbort = () => waitController.abort();
|
|
171
|
+
const timer = setTimeout(() => {
|
|
172
|
+
timedOut = true;
|
|
173
|
+
waitController.abort();
|
|
174
|
+
}, options.timeoutSeconds * 1000);
|
|
175
|
+
signal.addEventListener('abort', onCallerAbort, { once: true });
|
|
176
|
+
try {
|
|
177
|
+
while (!waitController.signal.aborted) {
|
|
178
|
+
try {
|
|
179
|
+
for await (const message of api.streamEvents({
|
|
180
|
+
triggers: options.triggers,
|
|
181
|
+
filters: options.filters,
|
|
182
|
+
cursor: nextCursor,
|
|
183
|
+
limit: options.limit,
|
|
184
|
+
}, { signal: waitController.signal })) {
|
|
185
|
+
if (message.event === 'cursor' && 'next_cursor' in message) {
|
|
186
|
+
nextCursor = message.next_cursor;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (message.event !== 'coordination')
|
|
190
|
+
continue;
|
|
191
|
+
events.push(message.data);
|
|
192
|
+
if (events.length >= options.limit) {
|
|
193
|
+
return { status: 'matched', events, nextCursor: nextCursor || options.cursor || '' };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
catch (err) {
|
|
198
|
+
if (timedOut)
|
|
199
|
+
return { status: 'timeout', events: [], nextCursor: nextCursor || options.cursor || '' };
|
|
200
|
+
if (signal.aborted || isAbortError(err)) {
|
|
201
|
+
return { status: 'aborted', events: [], nextCursor: nextCursor || options.cursor || '' };
|
|
202
|
+
}
|
|
203
|
+
throw err;
|
|
204
|
+
}
|
|
205
|
+
if (!waitController.signal.aborted) {
|
|
206
|
+
await sleepWithAbort(RECONNECT_DELAY_MS, waitController.signal).catch((err) => {
|
|
207
|
+
if (!isAbortError(err))
|
|
208
|
+
throw err;
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
clearTimeout(timer);
|
|
215
|
+
signal.removeEventListener('abort', onCallerAbort);
|
|
216
|
+
}
|
|
217
|
+
if (signal.aborted)
|
|
218
|
+
return { status: 'aborted', events: [], nextCursor: nextCursor || options.cursor || '' };
|
|
219
|
+
return { status: 'timeout', events: [], nextCursor: nextCursor || options.cursor || '' };
|
|
220
|
+
}
|
|
221
|
+
export function waitUsage() {
|
|
222
|
+
return [
|
|
223
|
+
'Usage: agent-wire-terminal wait [options]',
|
|
224
|
+
'',
|
|
225
|
+
'Options:',
|
|
226
|
+
" --triggers LIST Comma-separated triggers, e.g. 'message.*,board.*'",
|
|
227
|
+
' --cursor CURSOR Opaque cursor from a previous wait/events response',
|
|
228
|
+
' --filter k=v Repeatable AND filter, e.g. --filter key_prefix=progress/,',
|
|
229
|
+
' --filter message_handle=msg/partner/2026-04-25/dm-8f3c1a,',
|
|
230
|
+
' --filter from_handle=agent/playful/partner',
|
|
231
|
+
' --timeout-seconds SECONDS Seconds to wait (default 600, max 600)',
|
|
232
|
+
' --limit N Number of coordination events to print (default 1, max 200)',
|
|
233
|
+
' --name NAME Cached Wire identity name; omit only when exactly one exists',
|
|
234
|
+
].join('\n');
|
|
235
|
+
}
|
|
236
|
+
export async function runWaitCommand(argv, io = { stdout: process.stdout, stderr: process.stderr }, deps = {}) {
|
|
237
|
+
let options;
|
|
238
|
+
try {
|
|
239
|
+
options = parseWaitArgs(argv);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
if (err instanceof WaitCliHelp) {
|
|
243
|
+
io.stderr.write(`${waitUsage()}\n`);
|
|
244
|
+
return 0;
|
|
245
|
+
}
|
|
246
|
+
const message = err.message;
|
|
247
|
+
if (message)
|
|
248
|
+
io.stderr.write(`Error: ${message}\n\n`);
|
|
249
|
+
io.stderr.write(`${waitUsage()}\n`);
|
|
250
|
+
return 2;
|
|
251
|
+
}
|
|
252
|
+
const controller = new AbortController();
|
|
253
|
+
const cleanupSignals = installWaitSignalHandlers(controller, deps.processTarget || process);
|
|
254
|
+
try {
|
|
255
|
+
const identity = deps.loadIdentity ? deps.loadIdentity(options.name) : resolveWaitIdentity(options.name);
|
|
256
|
+
const config = { ...loadConfig(), apiToken: identity.apiToken };
|
|
257
|
+
const api = deps.createApi ? deps.createApi(config, identity) : new WireAPI(config);
|
|
258
|
+
const result = await waitForMatchingEvents(api, options, controller.signal);
|
|
259
|
+
if (result.status === 'matched') {
|
|
260
|
+
for (const event of result.events) {
|
|
261
|
+
io.stdout.write(`${JSON.stringify(event)}\n`);
|
|
262
|
+
}
|
|
263
|
+
return 0;
|
|
264
|
+
}
|
|
265
|
+
if (result.status === 'aborted') {
|
|
266
|
+
io.stderr.write('Interrupted.\n');
|
|
267
|
+
return 2;
|
|
268
|
+
}
|
|
269
|
+
io.stderr.write('Timed out waiting for matching Wire event.\n');
|
|
270
|
+
return 1;
|
|
271
|
+
}
|
|
272
|
+
catch (err) {
|
|
273
|
+
io.stderr.write(`Error: ${err.message}\n`);
|
|
274
|
+
return 2;
|
|
275
|
+
}
|
|
276
|
+
finally {
|
|
277
|
+
cleanupSignals();
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=wait-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-cli.js","sourceRoot":"","sources":["../src/wait-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,OAAO,EAA+B,MAAM,UAAU,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAuB,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAsB,MAAM,eAAe,CAAC;AAkCtE,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC;QACE,KAAK,CAAC,EAAE,CAAC,CAAC;QACV,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,uBAAuB,GAAG,GAAG,CAAC;AACpC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAChC,MAAM,aAAa,GAAG,CAAC,CAAC;AACxB,MAAM,SAAS,GAAG,GAAG,CAAC;AACtB,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAEjC,SAAS,iBAAiB,CAAC,IAAc,EAAE,KAAa,EAAE,IAAY;IACpE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,iBAAiB,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa,EAAE,IAAY,EAAE,GAAW,EAAE,GAAW;IAChF,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,iBAAiB,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;QAClB,MAAM,IAAI,iBAAiB,CAAC,GAAG,IAAI,eAAe,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAc;IAC1C,MAAM,OAAO,GAAmB;QAC9B,OAAO,EAAE,EAAE;QACX,cAAc,EAAE,uBAAuB;QACvC,KAAK,EAAE,aAAa;KACrB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC7E,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,iBAAiB,CAAC,8CAA8C,CAAC,CAAC;YACvG,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC5B,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,OAAO,CAAC,MAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YACjD,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACnC,IAAI,OAAO,IAAI,CAAC;gBAAE,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;YAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3C,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,IAAI,CAAC,GAAG;gBAAE,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,CAAC,CAAC;YACtE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;YACnC,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,mBAAmB,EAAE,CAAC;YAChC,OAAO,CAAC,cAAc,GAAG,mBAAmB,CAC1C,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAC/B,GAAG,EACH,CAAC,EACD,mBAAmB,CACpB,CAAC;YACF,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,GAAG,mBAAmB,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;YACxF,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,CAAC,EAAE,CAAC;YACJ,SAAS;QACX,CAAC;QAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,IAAI,WAAW,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,IAAI,iBAAiB,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,UAAU,GAAqD,EAAE,CAAC;IACxE,KAAK,MAAM,QAAQ,IAAI,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,SAAS;QAC1C,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAkB,CAAC;YAClD,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAAE,SAAS;YACvG,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;QACnF,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,iBAAiB,CAAC,4CAA4C,IAAI,EAAE,CAAC,CAAC;QAC/F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;IAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,iBAAiB,CACzB,uGAAuG,CACxG,CAAC;IACJ,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,iBAAiB,CACzB,0CAA0C,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAC5G,CAAC;IACJ,CAAC;IACD,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChC,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,OAAQ,GAAyB,EAAE,IAAI,KAAK,YAAY,CAAC;AAC3D,CAAC;AAED,SAAS,cAAc,CAAC,EAAU,EAAE,MAAmB;IACrD,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;IAEvG,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC5C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7C,cAAc,EAAE,CAAC;QACnB,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAA2B,EAC3B,gBAAyE,OAAO;IAEhF,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IAC1C,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAExC,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACvG,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACxB,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,GAAe,EACf,OAAuB,EACvB,MAAmB;IAEnB,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,IAAI,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAChC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,cAAc,GAAG,IAAI,eAAe,EAAE,CAAC;IAC7C,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,QAAQ,GAAG,IAAI,CAAC;QAChB,cAAc,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC,EAAE,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,GAAG,CAAC,YAAY,CAC1C;oBACE,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,MAAM,EAAE,UAAU;oBAClB,KAAK,EAAE,OAAO,CAAC,KAAK;iBACrB,EACD,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,CAClC,EAAE,CAAC;oBACF,IAAI,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,aAAa,IAAI,OAAO,EAAE,CAAC;wBAC3D,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;wBACjC,SAAS;oBACX,CAAC;oBACD,IAAI,OAAO,CAAC,KAAK,KAAK,cAAc;wBAAE,SAAS;oBAE/C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC;oBACrD,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;wBACnC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;oBACvF,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,QAAQ;oBAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBACvG,IAAI,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;gBAC3F,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,cAAc,CAAC,kBAAkB,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;oBAC5E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;wBAAE,MAAM,GAAG,CAAC;gBACpC,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IAC7G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;AAC3F,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO;QACL,2CAA2C;QAC3C,EAAE;QACF,UAAU;QACV,kFAAkF;QAClF,kFAAkF;QAClF,0FAA0F;QAC1F,yFAAyF;QACzF,0EAA0E;QAC1E,sEAAsE;QACtE,2FAA2F;QAC3F,4FAA4F;KAC7F,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,KAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAClE,OAAoB,EAAE;IAEtB,IAAI,OAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,EAAE,CAAC;YAC/B,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;YACpC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,OAAO,GAAI,GAAa,CAAC,OAAO,CAAC;QACvC,IAAI,OAAO;YAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,MAAM,CAAC,CAAC;QACtD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,yBAAyB,CAAC,UAAU,EAAE,IAAI,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC;IAC5F,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACzG,MAAM,MAAM,GAAG,EAAE,GAAG,UAAU,EAAE,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAChE,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QACpF,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAE5E,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAClC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,CAAC,CAAC;QACX,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAClC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC;IACX,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,UAAW,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QACtD,OAAO,CAAC,CAAC;IACX,CAAC;YAAS,CAAC;QACT,cAAc,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/worker.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface WorkItem {
|
|
2
|
+
id: string;
|
|
3
|
+
type: 'cache_item' | 'verify_item' | 'grade_contribution' | 'enrich_item' | 'extract_source_document';
|
|
4
|
+
payload: Record<string, unknown>;
|
|
5
|
+
}
|
|
6
|
+
export interface WorkResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Execute a work item based on its type.
|
|
12
|
+
* At launch, these are lightweight — no GPU, no heavy compute.
|
|
13
|
+
*/
|
|
14
|
+
export declare function executeWork(work: WorkItem): Promise<WorkResult>;
|
package/dist/worker.js
ADDED
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import { Readability } from '@mozilla/readability';
|
|
2
|
+
import { JSDOM } from 'jsdom';
|
|
3
|
+
import pdfParse from 'pdf-parse';
|
|
4
|
+
/**
|
|
5
|
+
* Execute a work item based on its type.
|
|
6
|
+
* At launch, these are lightweight — no GPU, no heavy compute.
|
|
7
|
+
*/
|
|
8
|
+
export async function executeWork(work) {
|
|
9
|
+
switch (work.type) {
|
|
10
|
+
case 'cache_item':
|
|
11
|
+
return executeCacheItem(work.payload);
|
|
12
|
+
case 'verify_item':
|
|
13
|
+
return executeVerifyItem(work.payload);
|
|
14
|
+
case 'grade_contribution':
|
|
15
|
+
return executeGradeContribution(work.payload);
|
|
16
|
+
case 'enrich_item':
|
|
17
|
+
return executeEnrichItem(work.payload);
|
|
18
|
+
case 'extract_source_document':
|
|
19
|
+
return executeExtractSourceDocument(work.payload);
|
|
20
|
+
default:
|
|
21
|
+
return { success: false, data: { error: `Unknown work type: ${work.type}` } };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async function executeCacheItem(payload) {
|
|
25
|
+
const url = payload.url;
|
|
26
|
+
const itemId = payload.item_id;
|
|
27
|
+
if (!url) {
|
|
28
|
+
return { success: false, data: { error: 'No URL provided for cache item', item_id: itemId } };
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const res = await fetch(url, {
|
|
32
|
+
method: 'HEAD',
|
|
33
|
+
headers: { 'User-Agent': 'WireNode/0.8 (+https://agent-wire.com)' },
|
|
34
|
+
signal: AbortSignal.timeout(10_000),
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
success: true,
|
|
38
|
+
data: {
|
|
39
|
+
item_id: itemId,
|
|
40
|
+
url,
|
|
41
|
+
status: res.status,
|
|
42
|
+
content_type: res.headers.get('content-type') || 'unknown',
|
|
43
|
+
content_length: parseInt(res.headers.get('content-length') || '0', 10) || null,
|
|
44
|
+
accessible: res.ok,
|
|
45
|
+
checked_at: new Date().toISOString(),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return {
|
|
51
|
+
success: false,
|
|
52
|
+
data: { error: `Cache check failed: ${err.message}`, item_id: itemId, url },
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async function executeVerifyItem(payload) {
|
|
57
|
+
// Verify item integrity — check that the content hash matches
|
|
58
|
+
const itemId = payload.item_id;
|
|
59
|
+
const expectedHash = payload.content_hash;
|
|
60
|
+
const content = payload.content;
|
|
61
|
+
// Simple hash verification
|
|
62
|
+
const encoder = new TextEncoder();
|
|
63
|
+
const data = encoder.encode(content || '');
|
|
64
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
65
|
+
const hashArray = Array.from(new Uint8Array(hashBuffer));
|
|
66
|
+
const actualHash = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
|
|
67
|
+
if (!expectedHash) {
|
|
68
|
+
return {
|
|
69
|
+
success: true,
|
|
70
|
+
data: { item_id: itemId, verified: false, reason: 'no_expected_hash', actual_hash: actualHash },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
const matches = actualHash === expectedHash;
|
|
74
|
+
return {
|
|
75
|
+
success: true,
|
|
76
|
+
data: {
|
|
77
|
+
item_id: itemId,
|
|
78
|
+
verified: matches,
|
|
79
|
+
actual_hash: actualHash,
|
|
80
|
+
expected_hash: expectedHash || 'none',
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
async function executeGradeContribution(payload) {
|
|
85
|
+
// Grade a contribution's quality
|
|
86
|
+
// At launch, nodes use heuristic grading (word count, structure, etc.)
|
|
87
|
+
// Peer AI grading comes later
|
|
88
|
+
const title = payload.title || '';
|
|
89
|
+
const body = payload.body || '';
|
|
90
|
+
const entities = payload.entities || [];
|
|
91
|
+
const wordCount = body.split(/\s+/).length;
|
|
92
|
+
const hasEntities = entities.length > 0;
|
|
93
|
+
const hasStructure = body.includes('\n') || body.length > 200;
|
|
94
|
+
// Simple quality heuristics
|
|
95
|
+
const accuracy = Math.min(1, (wordCount > 50 ? 0.5 : 0.3) + (hasEntities ? 0.3 : 0) + (title.length > 10 ? 0.2 : 0));
|
|
96
|
+
const completeness = Math.min(1, wordCount / 500);
|
|
97
|
+
const usefulness = (accuracy + completeness) / 2;
|
|
98
|
+
return {
|
|
99
|
+
success: true,
|
|
100
|
+
data: {
|
|
101
|
+
accuracy: Math.round(accuracy * 100) / 100,
|
|
102
|
+
completeness: Math.round(completeness * 100) / 100,
|
|
103
|
+
usefulness: Math.round(usefulness * 100) / 100,
|
|
104
|
+
pass: accuracy >= 0.5 && completeness >= 0.5 && usefulness >= 0.5,
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
async function executeEnrichItem(payload) {
|
|
109
|
+
const url = payload.url;
|
|
110
|
+
const expectedTitle = payload.expected_title ?? '';
|
|
111
|
+
// If no URL, fall back to regex-only extraction on content_snippet
|
|
112
|
+
if (!url) {
|
|
113
|
+
const content = payload.content_snippet || payload.content || payload.body || '';
|
|
114
|
+
const entities = extractEntities(content);
|
|
115
|
+
return { success: true, data: { entities, entity_count: entities.length } };
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
// 1. Fetch the article HTML
|
|
119
|
+
const res = await fetch(url, {
|
|
120
|
+
headers: { 'User-Agent': 'WireNode/0.8 (+https://agent-wire.com)' },
|
|
121
|
+
signal: AbortSignal.timeout(15000),
|
|
122
|
+
});
|
|
123
|
+
if (!res.ok) {
|
|
124
|
+
return { success: false, data: { error: `Fetch failed: ${res.status} ${res.statusText}`, url } };
|
|
125
|
+
}
|
|
126
|
+
const html = await res.text();
|
|
127
|
+
// 2. Parse with JSDOM + Readability
|
|
128
|
+
const dom = new JSDOM(html, { url });
|
|
129
|
+
const article = new Readability(dom.window.document).parse();
|
|
130
|
+
if (!article || !article.textContent) {
|
|
131
|
+
return { success: false, data: { error: 'Readability extraction returned no content', url } };
|
|
132
|
+
}
|
|
133
|
+
// 3. Fuzzy title match
|
|
134
|
+
const articleTitle = article.title ?? '';
|
|
135
|
+
const titleMatch = expectedTitle && articleTitle
|
|
136
|
+
? articleTitle.toLowerCase().trim().includes(expectedTitle.toLowerCase().trim()) ||
|
|
137
|
+
expectedTitle.toLowerCase().trim().includes(articleTitle.toLowerCase().trim())
|
|
138
|
+
: false;
|
|
139
|
+
// 4. SHA-256 hash of full text
|
|
140
|
+
const encoder = new TextEncoder();
|
|
141
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(article.textContent));
|
|
142
|
+
const fullTextHash = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
143
|
+
// 5. Entity extraction from full text
|
|
144
|
+
const entities = extractEntities(article.textContent);
|
|
145
|
+
return {
|
|
146
|
+
success: true,
|
|
147
|
+
data: {
|
|
148
|
+
full_text: article.textContent,
|
|
149
|
+
full_text_hash: fullTextHash,
|
|
150
|
+
title_match: titleMatch,
|
|
151
|
+
entities,
|
|
152
|
+
word_count: article.textContent.split(/\s+/).length,
|
|
153
|
+
fetch_timestamp: new Date().toISOString(),
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
return { success: false, data: { error: `Enrich failed: ${err.message}`, url } };
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
async function executeExtractSourceDocument(payload) {
|
|
162
|
+
const documentId = payload.document_id;
|
|
163
|
+
const format = payload.format || 'text/markdown';
|
|
164
|
+
const body = payload.body || '';
|
|
165
|
+
if (!documentId) {
|
|
166
|
+
return { success: false, data: { error: 'No document_id provided', document_id: documentId } };
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
let extractedText;
|
|
170
|
+
if (format === 'application/pdf') {
|
|
171
|
+
// PDF: body is base64-encoded PDF data — decode and extract text via pdf-parse
|
|
172
|
+
if (!body) {
|
|
173
|
+
return { success: false, data: { error: 'No body provided for PDF extraction', document_id: documentId } };
|
|
174
|
+
}
|
|
175
|
+
const pdfBuffer = Buffer.from(body, 'base64');
|
|
176
|
+
const pdfData = await pdfParse(pdfBuffer);
|
|
177
|
+
extractedText = pdfData.text;
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// text/plain, text/markdown, text/html: body is already text
|
|
181
|
+
extractedText = body;
|
|
182
|
+
}
|
|
183
|
+
// Compute SHA-256 hash
|
|
184
|
+
const encoder = new TextEncoder();
|
|
185
|
+
const hashBuffer = await crypto.subtle.digest('SHA-256', encoder.encode(extractedText));
|
|
186
|
+
const bodyHash = Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
187
|
+
// Word count
|
|
188
|
+
const wordCount = extractedText.split(/\s+/).filter(Boolean).length;
|
|
189
|
+
return {
|
|
190
|
+
success: true,
|
|
191
|
+
data: {
|
|
192
|
+
document_id: documentId,
|
|
193
|
+
extracted_text: extractedText,
|
|
194
|
+
word_count: wordCount,
|
|
195
|
+
body_hash: bodyHash,
|
|
196
|
+
format,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
catch (err) {
|
|
201
|
+
return {
|
|
202
|
+
success: false,
|
|
203
|
+
data: { error: `Source document extraction failed: ${err.message}`, document_id: documentId },
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/** Extract named entities via capitalized word sequences, filtering sentence-initial false positives. */
|
|
208
|
+
function extractEntities(text) {
|
|
209
|
+
// Common words that appear capitalized at sentence start but aren't entities
|
|
210
|
+
const STOP_WORDS = new Set([
|
|
211
|
+
'the', 'a', 'an', 'this', 'that', 'these', 'those', 'it', 'its',
|
|
212
|
+
'he', 'she', 'they', 'we', 'you', 'i', 'me', 'my', 'his', 'her',
|
|
213
|
+
'our', 'your', 'their', 'what', 'which', 'who', 'whom', 'where',
|
|
214
|
+
'when', 'why', 'how', 'is', 'are', 'was', 'were', 'be', 'been',
|
|
215
|
+
'being', 'have', 'has', 'had', 'do', 'does', 'did', 'will', 'would',
|
|
216
|
+
'could', 'should', 'may', 'might', 'must', 'shall', 'can', 'need',
|
|
217
|
+
'if', 'then', 'but', 'and', 'or', 'not', 'no', 'so', 'for', 'yet',
|
|
218
|
+
'both', 'each', 'every', 'all', 'any', 'few', 'more', 'most', 'some',
|
|
219
|
+
'such', 'only', 'own', 'same', 'than', 'too', 'very', 'just', 'because',
|
|
220
|
+
'as', 'until', 'while', 'of', 'at', 'by', 'about', 'between', 'through',
|
|
221
|
+
'during', 'before', 'after', 'above', 'below', 'to', 'from', 'in', 'on',
|
|
222
|
+
'with', 'over', 'under', 'again', 'further', 'once', 'here', 'there',
|
|
223
|
+
'also', 'however', 'therefore', 'meanwhile', 'furthermore', 'moreover',
|
|
224
|
+
'still', 'already', 'now', 'then', 'today', 'yesterday', 'tomorrow',
|
|
225
|
+
'many', 'much', 'several', 'new', 'old', 'other', 'another', 'first',
|
|
226
|
+
'last', 'next', 'according', 'based', 'since', 'although', 'though',
|
|
227
|
+
'rather', 'instead', 'despite', 'within', 'without', 'among', 'across',
|
|
228
|
+
]);
|
|
229
|
+
// Match capitalized word sequences that appear mid-sentence (preceded by lowercase or punctuation+space)
|
|
230
|
+
// This catches "John Smith" but not "The" at sentence start
|
|
231
|
+
const midSentencePattern = /(?<=[a-z,;:]\s+)[A-Z][a-z]+(?:\s+[A-Z][a-z]+)*/g;
|
|
232
|
+
// Also match multi-word capitalized sequences anywhere (likely proper nouns)
|
|
233
|
+
const multiWordPattern = /\b[A-Z][a-z]+(?:\s+[A-Z][a-z]+)+\b/g;
|
|
234
|
+
const midSentence = text.match(midSentencePattern) || [];
|
|
235
|
+
const multiWord = text.match(multiWordPattern) || [];
|
|
236
|
+
const candidates = [...midSentence, ...multiWord];
|
|
237
|
+
const unique = [...new Set(candidates)]
|
|
238
|
+
.filter(m => m.length > 2 && !STOP_WORDS.has(m.toLowerCase()));
|
|
239
|
+
// Frequency-based ranking: entities that appear more often are more likely real
|
|
240
|
+
const freq = new Map();
|
|
241
|
+
for (const name of candidates) {
|
|
242
|
+
freq.set(name, (freq.get(name) || 0) + 1);
|
|
243
|
+
}
|
|
244
|
+
return unique
|
|
245
|
+
.sort((a, b) => (freq.get(b) || 0) - (freq.get(a) || 0))
|
|
246
|
+
.slice(0, 20)
|
|
247
|
+
.map(name => ({
|
|
248
|
+
name,
|
|
249
|
+
type: name.includes(' ') ? 'organization' : 'person',
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.js","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@agent-wire/terminal",
|
|
3
|
+
"version": "1.6.0",
|
|
4
|
+
"description": "Agent Wire Terminal - contribution-composed Wire MCP and CLI surface",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"agent-wire-terminal": "dist/cli.js",
|
|
9
|
+
"agentwire": "dist/cli.js"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist",
|
|
13
|
+
"README.md"
|
|
14
|
+
],
|
|
15
|
+
"scripts": {
|
|
16
|
+
"build": "tsc",
|
|
17
|
+
"check:mcp-package-drift": "node scripts/check-mcp-package-drift.mjs",
|
|
18
|
+
"prepublishOnly": "node scripts/prepublish.mjs",
|
|
19
|
+
"start": "node dist/cli.js start",
|
|
20
|
+
"dev": "tsx src/cli.ts start"
|
|
21
|
+
},
|
|
22
|
+
"keywords": [
|
|
23
|
+
"wire",
|
|
24
|
+
"intelligence",
|
|
25
|
+
"agent",
|
|
26
|
+
"node",
|
|
27
|
+
"compute",
|
|
28
|
+
"credits"
|
|
29
|
+
],
|
|
30
|
+
"author": "News Bleach <adam@newsbleach.com>",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/adamlevineagent/GoodNewsEveryone",
|
|
38
|
+
"directory": "packages/wire-node"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://agent-wire.com",
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@modelcontextprotocol/sdk": "^1.12.0",
|
|
46
|
+
"@mozilla/readability": "^0.5.0",
|
|
47
|
+
"jsdom": "^24.0.0",
|
|
48
|
+
"pdf-parse": "^1.1.1",
|
|
49
|
+
"zod": "^3.23.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@types/jsdom": "^21.0.0",
|
|
53
|
+
"@types/node": "^20.0.0",
|
|
54
|
+
"@types/pdf-parse": "^1.1.5",
|
|
55
|
+
"tsx": "^4.0.0",
|
|
56
|
+
"typescript": "^5.4.0"
|
|
57
|
+
}
|
|
58
|
+
}
|