@sensigo/realm-cli 0.6.4 → 0.7.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/commands/listen.d.ts +92 -0
- package/dist/commands/listen.d.ts.map +1 -0
- package/dist/commands/listen.js +558 -0
- package/dist/commands/listen.js.map +1 -0
- package/dist/commands/webhook.d.ts +0 -48
- package/dist/commands/webhook.d.ts.map +1 -1
- package/dist/commands/webhook.js +17 -223
- package/dist/commands/webhook.js.map +1 -1
- package/dist/commands-registry.d.ts.map +1 -1
- package/dist/commands-registry.js +8 -1
- package/dist/commands-registry.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/lib/dedup-store.d.ts +41 -0
- package/dist/lib/dedup-store.d.ts.map +1 -0
- package/dist/lib/dedup-store.js +122 -0
- package/dist/lib/dedup-store.js.map +1 -0
- package/dist/lib/webhook-params.d.ts +34 -0
- package/dist/lib/webhook-params.d.ts.map +1 -0
- package/dist/lib/webhook-params.js +74 -0
- package/dist/lib/webhook-params.js.map +1 -0
- package/dist/lib/webhook-verifiers.d.ts +33 -0
- package/dist/lib/webhook-verifiers.d.ts.map +1 -0
- package/dist/lib/webhook-verifiers.js +160 -0
- package/dist/lib/webhook-verifiers.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/commands/listen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,51 +1,3 @@
|
|
|
1
|
-
import { type Server } from 'node:http';
|
|
2
|
-
import { spawn as nodeSpawn } from 'node:child_process';
|
|
3
1
|
import { Command } from 'commander';
|
|
4
|
-
import type { WorkflowDefinition, WorkflowRegistrar, RunStore } from '@sensigo/realm';
|
|
5
|
-
/**
|
|
6
|
-
* Checks a GitHub webhook HMAC-SHA256 signature using timing-safe comparison.
|
|
7
|
-
* Returns true only if the header is present, uses the sha256= prefix, and
|
|
8
|
-
* the HMAC matches byte-for-byte. Pads both buffers to equal length before
|
|
9
|
-
* comparison to avoid length-based timing leaks.
|
|
10
|
-
*/
|
|
11
|
-
export declare function checkWebhookSignature(rawBody: Buffer, signatureHeader: string | undefined, secret: string): boolean;
|
|
12
|
-
/**
|
|
13
|
-
* Checks whether a delivery ID is a duplicate within the TTL window.
|
|
14
|
-
* Evicts stale entries and enforces a capacity cap on each call.
|
|
15
|
-
* Returns true if the delivery was already seen; records it and returns false otherwise.
|
|
16
|
-
*/
|
|
17
|
-
export declare function isDuplicate(deliveryCache: Map<string, number>, deliveryId: string): boolean;
|
|
18
|
-
/** An event:action pair used to filter incoming webhook deliveries. */
|
|
19
|
-
export interface EventFilter {
|
|
20
|
-
event: string;
|
|
21
|
-
action: string;
|
|
22
|
-
}
|
|
23
|
-
/** Options for startWebhookServer — all I/O dependencies are injectable for testing. */
|
|
24
|
-
export interface StartWebhookServerOptions {
|
|
25
|
-
port: number;
|
|
26
|
-
secret: string;
|
|
27
|
-
definition: WorkflowDefinition;
|
|
28
|
-
events: EventFilter[];
|
|
29
|
-
provider?: string;
|
|
30
|
-
model?: string;
|
|
31
|
-
/** Custom run store — avoids writing to disk in tests. */
|
|
32
|
-
runStore?: RunStore;
|
|
33
|
-
/** Custom workflow registrar — avoids writing to disk in tests. */
|
|
34
|
-
workflowStore?: WorkflowRegistrar;
|
|
35
|
-
/** Override spawn — injectable for test isolation. */
|
|
36
|
-
spawnFn?: typeof nodeSpawn;
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Creates and starts the webhook HTTP server. Resolves once the server is listening.
|
|
40
|
-
* The caller is responsible for calling server.close() when done.
|
|
41
|
-
*
|
|
42
|
-
* Security-first request handling order:
|
|
43
|
-
* 1. Buffer body 2. Verify HMAC 3. Filter event/action 4. Dedup 5. Create run 6. Spawn agent
|
|
44
|
-
*/
|
|
45
|
-
export declare function startWebhookServer(options: StartWebhookServerOptions): Promise<Server>;
|
|
46
|
-
/**
|
|
47
|
-
* `realm webhook` — starts an HTTP server that creates runs from GitHub webhook deliveries.
|
|
48
|
-
* Verifies HMAC-SHA256 signatures, deduplicates deliveries, and spawns realm agent children.
|
|
49
|
-
*/
|
|
50
2
|
export declare const webhookCommand: Command;
|
|
51
3
|
//# sourceMappingURL=webhook.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,eAAO,MAAM,cAAc,SAUvB,CAAC"}
|
package/dist/commands/webhook.js
CHANGED
|
@@ -1,227 +1,21 @@
|
|
|
1
|
-
// webhook.ts — realm webhook
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// realm
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
// webhook.ts — `realm webhook` (REMOVED).
|
|
2
|
+
//
|
|
3
|
+
// The legacy GitHub-only webhook server (HMAC verify → dedup → spawn) has been replaced by the
|
|
4
|
+
// general `realm listen` server. The GitHub PR flow it served is now expressed as a workflow
|
|
5
|
+
// `trigger:` block (`auth: { mode: github }` + a `params_map` of the PR dot-paths), proven
|
|
6
|
+
// byte-parity-equivalent to the old hardcoded mapping in listen-github-parity.test.ts. The duplicate
|
|
7
|
+
// `checkWebhookSignature` is gone — `realm listen` uses the shared `verifyGithub` verifier.
|
|
8
|
+
//
|
|
9
|
+
// This thin alias remains only so `realm webhook` returns a helpful migration error instead of an
|
|
10
|
+
// "unknown command".
|
|
9
11
|
import { Command } from 'commander';
|
|
10
|
-
import { loadWorkflowFromFile, JsonFileStore, JsonWorkflowStore } from '@sensigo/realm';
|
|
11
|
-
const DEDUP_TTL_MS = 10 * 60 * 1000; // 10 minutes
|
|
12
|
-
const CACHE_MAX_SIZE = 1000;
|
|
13
|
-
/**
|
|
14
|
-
* Checks a GitHub webhook HMAC-SHA256 signature using timing-safe comparison.
|
|
15
|
-
* Returns true only if the header is present, uses the sha256= prefix, and
|
|
16
|
-
* the HMAC matches byte-for-byte. Pads both buffers to equal length before
|
|
17
|
-
* comparison to avoid length-based timing leaks.
|
|
18
|
-
*/
|
|
19
|
-
export function checkWebhookSignature(rawBody, signatureHeader, secret) {
|
|
20
|
-
if (!signatureHeader?.startsWith('sha256='))
|
|
21
|
-
return false;
|
|
22
|
-
const provided = signatureHeader.slice(7);
|
|
23
|
-
const expected = createHmac('sha256', secret).update(rawBody).digest('hex');
|
|
24
|
-
const a = Buffer.from(provided, 'utf8');
|
|
25
|
-
const b = Buffer.from(expected, 'utf8');
|
|
26
|
-
const maxLen = Math.max(a.length, b.length);
|
|
27
|
-
const aa = Buffer.alloc(maxLen);
|
|
28
|
-
const bb = Buffer.alloc(maxLen);
|
|
29
|
-
a.copy(aa);
|
|
30
|
-
b.copy(bb);
|
|
31
|
-
// Compare in constant time AND require equal length — pads prevent length-leak
|
|
32
|
-
// from short-circuiting timingSafeEqual, but lengths must still match for validity.
|
|
33
|
-
return timingSafeEqual(aa, bb) && a.length === b.length;
|
|
34
|
-
}
|
|
35
|
-
/**
|
|
36
|
-
* Checks whether a delivery ID is a duplicate within the TTL window.
|
|
37
|
-
* Evicts stale entries and enforces a capacity cap on each call.
|
|
38
|
-
* Returns true if the delivery was already seen; records it and returns false otherwise.
|
|
39
|
-
*/
|
|
40
|
-
export function isDuplicate(deliveryCache, deliveryId) {
|
|
41
|
-
const now = Date.now();
|
|
42
|
-
// Evict stale entries on every request
|
|
43
|
-
for (const [id, ts] of deliveryCache) {
|
|
44
|
-
if (now - ts > DEDUP_TTL_MS)
|
|
45
|
-
deliveryCache.delete(id);
|
|
46
|
-
}
|
|
47
|
-
// Enforce capacity cap — evict oldest entry when at limit
|
|
48
|
-
if (deliveryCache.size >= CACHE_MAX_SIZE) {
|
|
49
|
-
const oldest = [...deliveryCache.entries()].sort((a, b) => a[1] - b[1])[0];
|
|
50
|
-
deliveryCache.delete(oldest[0]);
|
|
51
|
-
}
|
|
52
|
-
if (deliveryCache.has(deliveryId) && now - deliveryCache.get(deliveryId) < DEDUP_TTL_MS) {
|
|
53
|
-
return true;
|
|
54
|
-
}
|
|
55
|
-
deliveryCache.set(deliveryId, now);
|
|
56
|
-
return false;
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Creates and starts the webhook HTTP server. Resolves once the server is listening.
|
|
60
|
-
* The caller is responsible for calling server.close() when done.
|
|
61
|
-
*
|
|
62
|
-
* Security-first request handling order:
|
|
63
|
-
* 1. Buffer body 2. Verify HMAC 3. Filter event/action 4. Dedup 5. Create run 6. Spawn agent
|
|
64
|
-
*/
|
|
65
|
-
export async function startWebhookServer(options) {
|
|
66
|
-
const runStore = options.runStore ?? new JsonFileStore();
|
|
67
|
-
const workflowStore = options.workflowStore ?? new JsonWorkflowStore();
|
|
68
|
-
const spawnFn = options.spawnFn ?? nodeSpawn;
|
|
69
|
-
const deliveryCache = new Map();
|
|
70
|
-
const server = createServer(async (req, res) => {
|
|
71
|
-
// 1. Buffer raw body before any other logic
|
|
72
|
-
const chunks = [];
|
|
73
|
-
for await (const chunk of req)
|
|
74
|
-
chunks.push(chunk);
|
|
75
|
-
const rawBody = Buffer.concat(chunks);
|
|
76
|
-
// 2. HMAC signature check — mandatory before any event filtering (oracle-attack prevention)
|
|
77
|
-
const sigHeader = req.headers['x-hub-signature-256'];
|
|
78
|
-
if (!checkWebhookSignature(rawBody, sigHeader, options.secret)) {
|
|
79
|
-
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
80
|
-
res.end(JSON.stringify({ error: 'Invalid signature' }));
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
// 3. Parse JSON body
|
|
84
|
-
let payload;
|
|
85
|
-
try {
|
|
86
|
-
payload = JSON.parse(rawBody.toString('utf-8'));
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
90
|
-
res.end(JSON.stringify({ error: 'Invalid JSON' }));
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
// 4. Check X-Github-Event header against configured event types
|
|
94
|
-
const githubEvent = req.headers['x-github-event'];
|
|
95
|
-
const matchingEvents = options.events.filter((e) => e.event === githubEvent);
|
|
96
|
-
if (matchingEvents.length === 0) {
|
|
97
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
98
|
-
res.end(JSON.stringify({ ok: true, skipped: 'event' }));
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
// 5. Check payload.action against configured action types
|
|
102
|
-
const payloadAction = payload.action;
|
|
103
|
-
const matchingActions = matchingEvents.filter((e) => e.action === payloadAction);
|
|
104
|
-
if (matchingActions.length === 0) {
|
|
105
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
106
|
-
res.end(JSON.stringify({ ok: true, skipped: 'action' }));
|
|
107
|
-
return;
|
|
108
|
-
}
|
|
109
|
-
// 6. Deduplication check — returns 200 to prevent GitHub retries on ignores
|
|
110
|
-
const deliveryId = req.headers['x-github-delivery'];
|
|
111
|
-
if (deliveryId !== undefined && isDuplicate(deliveryCache, deliveryId)) {
|
|
112
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
113
|
-
res.end(JSON.stringify({ ok: true, skipped: 'duplicate' }));
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
// 7. Extract params from payload using the standard PR event field mapping
|
|
117
|
-
const pr = payload.pull_request ?? {};
|
|
118
|
-
const repo = payload.repository ?? {};
|
|
119
|
-
const sender = payload.sender ?? {};
|
|
120
|
-
const prBase = pr.base ?? {};
|
|
121
|
-
const prHead = pr.head ?? {};
|
|
122
|
-
const repoOwner = repo.owner ?? {};
|
|
123
|
-
const params = {
|
|
124
|
-
pr_number: pr.number,
|
|
125
|
-
pr_url: pr.html_url,
|
|
126
|
-
repo: repo.full_name,
|
|
127
|
-
repo_owner: repoOwner.login,
|
|
128
|
-
repo_name: repo.name,
|
|
129
|
-
pr_title: pr.title,
|
|
130
|
-
base_sha: prBase.sha,
|
|
131
|
-
head_sha: prHead.sha,
|
|
132
|
-
author: sender.login,
|
|
133
|
-
pr_action: payload['action'],
|
|
134
|
-
github_delivery_id: deliveryId,
|
|
135
|
-
};
|
|
136
|
-
// 8. Register workflow definition with the store
|
|
137
|
-
await workflowStore.register(options.definition);
|
|
138
|
-
// 9. Create run record
|
|
139
|
-
const run = await runStore.create({
|
|
140
|
-
workflowId: options.definition.id,
|
|
141
|
-
workflowVersion: options.definition.version,
|
|
142
|
-
params,
|
|
143
|
-
});
|
|
144
|
-
// 10. Spawn realm agent as detached child — inherits full env (API keys, tokens, etc.)
|
|
145
|
-
const realmBin = process.argv[1];
|
|
146
|
-
const providerArgs = [];
|
|
147
|
-
if (options.provider !== undefined)
|
|
148
|
-
providerArgs.push('--provider', options.provider);
|
|
149
|
-
if (options.model !== undefined)
|
|
150
|
-
providerArgs.push('--model', options.model);
|
|
151
|
-
const child = spawnFn(process.execPath, [realmBin, 'agent', '--run-id', run.id, ...providerArgs], { detached: true, stdio: 'inherit' });
|
|
152
|
-
child.unref();
|
|
153
|
-
// 11. Log spawn event for visibility in server logs
|
|
154
|
-
console.log(`realm agent spawned for run ${run.id} (pid: ${child.pid ?? 'unknown'})`);
|
|
155
|
-
// 12. Respond 202 Accepted — run is created, agent is running in background
|
|
156
|
-
res.writeHead(202, { 'Content-Type': 'application/json' });
|
|
157
|
-
res.end(JSON.stringify({ ok: true, run_id: run.id }));
|
|
158
|
-
});
|
|
159
|
-
return new Promise((resolve, reject) => {
|
|
160
|
-
let isListening = false;
|
|
161
|
-
server.on('error', (err) => {
|
|
162
|
-
if (!isListening) {
|
|
163
|
-
reject(err);
|
|
164
|
-
}
|
|
165
|
-
else {
|
|
166
|
-
console.error('Realm webhook server error:', err);
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
server.listen(options.port, () => {
|
|
170
|
-
isListening = true;
|
|
171
|
-
resolve(server);
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* `realm webhook` — starts an HTTP server that creates runs from GitHub webhook deliveries.
|
|
177
|
-
* Verifies HMAC-SHA256 signatures, deduplicates deliveries, and spawns realm agent children.
|
|
178
|
-
*/
|
|
179
12
|
export const webhookCommand = new Command('webhook')
|
|
180
|
-
.description('
|
|
181
|
-
.
|
|
182
|
-
.
|
|
183
|
-
.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
.
|
|
187
|
-
.action(async (opts) => {
|
|
188
|
-
// 1. Resolve secret — CLI flag overrides env var; refuse to start if neither set
|
|
189
|
-
const secret = opts.secret ?? process.env['GITHUB_WEBHOOK_SECRET'];
|
|
190
|
-
if (!secret) {
|
|
191
|
-
console.error('Error: webhook secret is required. Pass --secret or set GITHUB_WEBHOOK_SECRET.');
|
|
192
|
-
process.exit(1);
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
// 2. Load and validate workflow before binding the port
|
|
196
|
-
const inputPath = opts.workflow;
|
|
197
|
-
const filePath = inputPath.endsWith('.yaml') || inputPath.endsWith('.yml')
|
|
198
|
-
? inputPath
|
|
199
|
-
: join(inputPath, 'workflow.yaml');
|
|
200
|
-
let definition;
|
|
201
|
-
try {
|
|
202
|
-
definition = loadWorkflowFromFile(filePath);
|
|
203
|
-
}
|
|
204
|
-
catch (err) {
|
|
205
|
-
console.error(`Error: failed to load workflow: ${err instanceof Error ? err.message : String(err)}`);
|
|
206
|
-
process.exit(1);
|
|
207
|
-
return;
|
|
208
|
-
}
|
|
209
|
-
// 3. Parse event filters from comma-separated event:action string
|
|
210
|
-
const events = opts.event.split(',').map((token) => {
|
|
211
|
-
const [event, action] = token.trim().split(':');
|
|
212
|
-
return { event: event ?? '', action: action ?? '' };
|
|
213
|
-
});
|
|
214
|
-
// 4. Start server — only reached after secret and workflow are validated
|
|
215
|
-
const port = parseInt(opts.port, 10);
|
|
216
|
-
const server = await startWebhookServer({
|
|
217
|
-
port,
|
|
218
|
-
secret,
|
|
219
|
-
definition,
|
|
220
|
-
events,
|
|
221
|
-
...(opts.provider !== undefined ? { provider: opts.provider } : {}),
|
|
222
|
-
...(opts.model !== undefined ? { model: opts.model } : {}),
|
|
223
|
-
});
|
|
224
|
-
const addr = server.address();
|
|
225
|
-
console.log(`Realm webhook server listening on port ${addr.port}`);
|
|
13
|
+
.description('[removed] use `realm listen` with a workflow trigger: block (auth.mode: github)')
|
|
14
|
+
.allowUnknownOption(true)
|
|
15
|
+
.action(() => {
|
|
16
|
+
console.error('`realm webhook` has been removed. Use `realm listen` with a `trigger:` block ' +
|
|
17
|
+
'(auth.mode: github + a params_map for the PR fields) in your workflow instead. ' +
|
|
18
|
+
'See `realm listen --help`.');
|
|
19
|
+
process.exit(1);
|
|
226
20
|
});
|
|
227
21
|
//# sourceMappingURL=webhook.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/commands/webhook.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,+FAA+F;AAC/F,6FAA6F;AAC7F,2FAA2F;AAC3F,qGAAqG;AACrG,4FAA4F;AAC5F,EAAE;AACF,kGAAkG;AAClG,qBAAqB;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;KACjD,WAAW,CAAC,iFAAiF,CAAC;KAC9F,kBAAkB,CAAC,IAAI,CAAC;KACxB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,KAAK,CACX,+EAA+E;QAC7E,iFAAiF;QACjF,4BAA4B,CAC/B,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commands-registry.d.ts","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAuBA,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,+BAQ5B,CAAC;AAEF,gEAAgE;AAChE,eAAO,MAAM,WAAW,+BAQvB,CAAC;AAEF,sDAAsD;AACtD,eAAO,MAAM,gBAAgB,+BAM5B,CAAC"}
|
|
@@ -19,6 +19,7 @@ import { serveCommand } from './commands/serve.js';
|
|
|
19
19
|
import { migrateCommand } from './commands/migrate.js';
|
|
20
20
|
import { agentCommand } from './commands/agent.js';
|
|
21
21
|
import { webhookCommand } from './commands/webhook.js';
|
|
22
|
+
import { listenCommand } from './commands/listen.js';
|
|
22
23
|
/** Commands that operate on workflow definitions (realm workflow <cmd>). */
|
|
23
24
|
export const workflowCommands = [
|
|
24
25
|
initCommand,
|
|
@@ -40,5 +41,11 @@ export const runCommands = [
|
|
|
40
41
|
cleanupCommand,
|
|
41
42
|
];
|
|
42
43
|
/** Top-level commands not nested under a subgroup. */
|
|
43
|
-
export const topLevelCommands = [
|
|
44
|
+
export const topLevelCommands = [
|
|
45
|
+
mcpCommand,
|
|
46
|
+
serveCommand,
|
|
47
|
+
agentCommand,
|
|
48
|
+
webhookCommand,
|
|
49
|
+
listenCommand,
|
|
50
|
+
];
|
|
44
51
|
//# sourceMappingURL=commands-registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"commands-registry.js","sourceRoot":"","sources":["../src/commands-registry.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,+EAA+E;AAC/E,6CAA6C;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,WAAW;IACX,eAAe;IACf,eAAe;IACf,YAAY;IACZ,UAAU;IACV,WAAW;IACX,cAAc;CACf,CAAC;AAEF,gEAAgE;AAChE,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,WAAW;IACX,cAAc;IACd,aAAa;IACb,WAAW;IACX,aAAa;IACb,cAAc;IACd,cAAc;CACf,CAAC;AAEF,sDAAsD;AACtD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU;IACV,YAAY;IACZ,YAAY;IACZ,cAAc;IACd,aAAa;CACd,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,7 +4,7 @@ import 'dotenv/config';
|
|
|
4
4
|
import { Command } from 'commander';
|
|
5
5
|
import { workflowCommands, runCommands, topLevelCommands } from './commands-registry.js';
|
|
6
6
|
const program = new Command();
|
|
7
|
-
program.name('realm').description('Realm workflow engine CLI').version('0.
|
|
7
|
+
program.name('realm').description('Realm workflow engine CLI').version('0.7.0');
|
|
8
8
|
// realm workflow — operations on workflow definitions
|
|
9
9
|
const workflowCmd = new Command('workflow').description('Manage workflow definitions');
|
|
10
10
|
for (const cmd of workflowCommands)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface DedupStore {
|
|
2
|
+
/**
|
|
3
|
+
* Returns true if the key has been seen within its TTL window.
|
|
4
|
+
* `ttlMs` is required by FileDedupStore (it determines how many hour-buckets to
|
|
5
|
+
* scan back); InMemoryDedupStore ignores it because expiry is stored at record
|
|
6
|
+
* time. It is typed optional here so both implementations satisfy this contract.
|
|
7
|
+
*/
|
|
8
|
+
check(key: string, ttlMs?: number): boolean;
|
|
9
|
+
/** Records the key as seen for the given TTL. */
|
|
10
|
+
record(key: string, ttlMs: number): void;
|
|
11
|
+
/** Removes entries older than maxAgeMs. For InMemoryDedupStore, evicts expired entries. */
|
|
12
|
+
cleanup(maxAgeMs: number): void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* File-backed dedup store. Records are empty files whose mtime is the only data.
|
|
16
|
+
* Layout: <baseDir>/<workflowId>/<YYYYMMDDHH>/<sha256(key)[:32]>.
|
|
17
|
+
*
|
|
18
|
+
* Safe across concurrent `realm listen` processes via O_EXCL (openSync 'wx').
|
|
19
|
+
*
|
|
20
|
+
* Note: `check` requires `ttlMs` in practice — it scans floor(ttlMs/3_600_000)+2
|
|
21
|
+
* hour buckets. It is declared with a default of 0 only to satisfy the DedupStore
|
|
22
|
+
* interface (which types ttlMs as optional); real callers always pass the TTL.
|
|
23
|
+
*/
|
|
24
|
+
export declare class FileDedupStore implements DedupStore {
|
|
25
|
+
private readonly dir;
|
|
26
|
+
private lastCleanupErrorAt;
|
|
27
|
+
constructor(baseDir: string, workflowId: string);
|
|
28
|
+
private hashKey;
|
|
29
|
+
private bucketName;
|
|
30
|
+
check(key: string, ttlMs?: number): boolean;
|
|
31
|
+
record(key: string, _ttlMs: number): void;
|
|
32
|
+
cleanup(maxAgeMs: number): void;
|
|
33
|
+
}
|
|
34
|
+
export declare class InMemoryDedupStore implements DedupStore {
|
|
35
|
+
private map;
|
|
36
|
+
check(key: string): boolean;
|
|
37
|
+
record(key: string, ttlMs: number): void;
|
|
38
|
+
cleanup(_maxAgeMs: number): void;
|
|
39
|
+
private evictExpired;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=dedup-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-store.d.ts","sourceRoot":"","sources":["../../src/lib/dedup-store.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5C,iDAAiD;IACjD,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACzC,2FAA2F;IAC3F,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAID;;;;;;;;;GASG;AACH,qBAAa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,kBAAkB,CAAK;gBAEnB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAI/C,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,UAAU;IASlB,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAI,GAAG,OAAO;IAetC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAiBzC,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAiChC;AAED,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,GAAG,CAAkC;IAE7C,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAM3B,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAIhC,OAAO,CAAC,YAAY;CAMrB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Dedup stores — at-least-once duplicate suppression for webhook events.
|
|
2
|
+
// FileDedupStore survives process restarts; InMemoryDedupStore does not.
|
|
3
|
+
import { createHash } from 'node:crypto';
|
|
4
|
+
import { mkdirSync, openSync, closeSync, statSync, readdirSync, rmSync } from 'node:fs';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
const ONE_HOUR_MS = 3_600_000;
|
|
7
|
+
/**
|
|
8
|
+
* File-backed dedup store. Records are empty files whose mtime is the only data.
|
|
9
|
+
* Layout: <baseDir>/<workflowId>/<YYYYMMDDHH>/<sha256(key)[:32]>.
|
|
10
|
+
*
|
|
11
|
+
* Safe across concurrent `realm listen` processes via O_EXCL (openSync 'wx').
|
|
12
|
+
*
|
|
13
|
+
* Note: `check` requires `ttlMs` in practice — it scans floor(ttlMs/3_600_000)+2
|
|
14
|
+
* hour buckets. It is declared with a default of 0 only to satisfy the DedupStore
|
|
15
|
+
* interface (which types ttlMs as optional); real callers always pass the TTL.
|
|
16
|
+
*/
|
|
17
|
+
export class FileDedupStore {
|
|
18
|
+
dir;
|
|
19
|
+
lastCleanupErrorAt = 0;
|
|
20
|
+
constructor(baseDir, workflowId) {
|
|
21
|
+
this.dir = join(baseDir, workflowId);
|
|
22
|
+
}
|
|
23
|
+
hashKey(key) {
|
|
24
|
+
return createHash('sha256').update(key).digest('hex').slice(0, 32);
|
|
25
|
+
}
|
|
26
|
+
bucketName(ms) {
|
|
27
|
+
const d = new Date(ms);
|
|
28
|
+
const year = String(d.getUTCFullYear()).padStart(4, '0');
|
|
29
|
+
const month = String(d.getUTCMonth() + 1).padStart(2, '0');
|
|
30
|
+
const day = String(d.getUTCDate()).padStart(2, '0');
|
|
31
|
+
const hour = String(d.getUTCHours()).padStart(2, '0');
|
|
32
|
+
return `${year}${month}${day}${hour}`;
|
|
33
|
+
}
|
|
34
|
+
check(key, ttlMs = 0) {
|
|
35
|
+
const hash = this.hashKey(key);
|
|
36
|
+
const now = Date.now();
|
|
37
|
+
const buckets = Math.floor(ttlMs / ONE_HOUR_MS) + 2;
|
|
38
|
+
for (let i = 0; i < buckets; i++) {
|
|
39
|
+
const bucket = this.bucketName(now - i * ONE_HOUR_MS);
|
|
40
|
+
const filePath = join(this.dir, bucket, hash);
|
|
41
|
+
const stat = statSync(filePath, { throwIfNoEntry: false });
|
|
42
|
+
if (stat !== undefined && now - stat.mtime.getTime() < ttlMs) {
|
|
43
|
+
return true;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
record(key, _ttlMs) {
|
|
49
|
+
const hash = this.hashKey(key);
|
|
50
|
+
const bucketDir = join(this.dir, this.bucketName(Date.now()));
|
|
51
|
+
const filePath = join(bucketDir, hash);
|
|
52
|
+
mkdirSync(bucketDir, { recursive: true });
|
|
53
|
+
try {
|
|
54
|
+
const fd = openSync(filePath, 'wx');
|
|
55
|
+
closeSync(fd);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
// Concurrent at-least-once delivery may race to create the same file.
|
|
59
|
+
if (err.code === 'EEXIST') {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
throw err;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
cleanup(maxAgeMs) {
|
|
66
|
+
try {
|
|
67
|
+
const now = Date.now();
|
|
68
|
+
let entries;
|
|
69
|
+
try {
|
|
70
|
+
entries = readdirSync(this.dir);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
if (err.code === 'ENOENT') {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
throw err;
|
|
77
|
+
}
|
|
78
|
+
for (const name of entries) {
|
|
79
|
+
if (!/^\d{10}$/.test(name)) {
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
const year = parseInt(name.slice(0, 4), 10);
|
|
83
|
+
const month = parseInt(name.slice(4, 6), 10) - 1;
|
|
84
|
+
const day = parseInt(name.slice(6, 8), 10);
|
|
85
|
+
const hour = parseInt(name.slice(8, 10), 10);
|
|
86
|
+
const bucketEndMs = new Date(Date.UTC(year, month, day, hour + 1)).getTime();
|
|
87
|
+
if (bucketEndMs < now - maxAgeMs) {
|
|
88
|
+
rmSync(join(this.dir, name), { recursive: true, force: true });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
const now = Date.now();
|
|
94
|
+
if (now - this.lastCleanupErrorAt >= 60_000) {
|
|
95
|
+
this.lastCleanupErrorAt = now;
|
|
96
|
+
console.error(`realm dedup cleanup error in ${this.dir}:`, err);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export class InMemoryDedupStore {
|
|
102
|
+
map = new Map(); // key → expiry timestamp
|
|
103
|
+
check(key) {
|
|
104
|
+
this.evictExpired();
|
|
105
|
+
const expiry = this.map.get(key);
|
|
106
|
+
return expiry !== undefined && Date.now() < expiry;
|
|
107
|
+
}
|
|
108
|
+
record(key, ttlMs) {
|
|
109
|
+
this.map.set(key, Date.now() + ttlMs);
|
|
110
|
+
}
|
|
111
|
+
cleanup(_maxAgeMs) {
|
|
112
|
+
this.evictExpired();
|
|
113
|
+
}
|
|
114
|
+
evictExpired() {
|
|
115
|
+
const now = Date.now();
|
|
116
|
+
for (const [k, expiry] of this.map) {
|
|
117
|
+
if (now >= expiry)
|
|
118
|
+
this.map.delete(k);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=dedup-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dedup-store.js","sourceRoot":"","sources":["../../src/lib/dedup-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { DedupConfig } from '@sensigo/realm';
|
|
2
|
+
export interface WebhookPayload {
|
|
3
|
+
headers: Record<string, string>;
|
|
4
|
+
body: unknown;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Resolves a dot-notation path into an object.
|
|
8
|
+
* Numeric segments (all-digit strings) index into arrays (zero-based).
|
|
9
|
+
* Returns undefined on any resolution failure. Never throws.
|
|
10
|
+
*
|
|
11
|
+
* Rules:
|
|
12
|
+
* - Empty path returns the root object.
|
|
13
|
+
* - On an array, an all-digit in-bounds segment descends by index; any other
|
|
14
|
+
* segment (non-numeric or out-of-bounds index) resolves to undefined.
|
|
15
|
+
* - On a plain object, the segment is always a property key — even all-digit
|
|
16
|
+
* segments are string keys, not array indices.
|
|
17
|
+
* - On null/undefined/primitive, resolution stops with undefined.
|
|
18
|
+
*/
|
|
19
|
+
export declare function resolveDotPath(obj: unknown, path: string): unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Extracts run params from a webhook payload using params_map.
|
|
22
|
+
* Logs a warn via the injected logger for each undefined result.
|
|
23
|
+
* Returns a partial record — missing keys are absent, not null.
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractParams(payload: WebhookPayload, paramsMap: Record<string, string>, logger: {
|
|
26
|
+
warn: (msg: string, data?: unknown) => void;
|
|
27
|
+
}): Record<string, unknown>;
|
|
28
|
+
/**
|
|
29
|
+
* Extracts the dedup ID from a webhook payload.
|
|
30
|
+
* Returns the value coerced to string, or undefined if absent/null.
|
|
31
|
+
* Numeric values are valid dedup IDs (stringified).
|
|
32
|
+
*/
|
|
33
|
+
export declare function extractDedupId(payload: WebhookPayload, dedupConfig: DedupConfig): string | undefined;
|
|
34
|
+
//# sourceMappingURL=webhook-params.d.ts.map
|