@relayfile/adapter-reddit 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/digest.d.ts +4 -0
  2. package/dist/digest.d.ts.map +1 -0
  3. package/dist/digest.js +47 -0
  4. package/dist/digest.js.map +1 -0
  5. package/dist/digest.test.d.ts +2 -0
  6. package/dist/digest.test.d.ts.map +1 -0
  7. package/dist/digest.test.js +65 -0
  8. package/dist/digest.test.js.map +1 -0
  9. package/dist/emit-auxiliary-files.d.ts +20 -0
  10. package/dist/emit-auxiliary-files.d.ts.map +1 -0
  11. package/dist/emit-auxiliary-files.js +298 -0
  12. package/dist/emit-auxiliary-files.js.map +1 -0
  13. package/dist/emit-auxiliary-files.test.d.ts +2 -0
  14. package/dist/emit-auxiliary-files.test.d.ts.map +1 -0
  15. package/dist/emit-auxiliary-files.test.js +102 -0
  16. package/dist/emit-auxiliary-files.test.js.map +1 -0
  17. package/dist/index-emitter.d.ts +26 -0
  18. package/dist/index-emitter.d.ts.map +1 -0
  19. package/dist/index-emitter.js +79 -0
  20. package/dist/index-emitter.js.map +1 -0
  21. package/dist/index-emitter.test.d.ts +2 -0
  22. package/dist/index-emitter.test.d.ts.map +1 -0
  23. package/dist/index-emitter.test.js +25 -0
  24. package/dist/index-emitter.test.js.map +1 -0
  25. package/dist/index.d.ts +8 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +7 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/layout-prompt.d.ts +7 -0
  30. package/dist/layout-prompt.d.ts.map +1 -0
  31. package/dist/layout-prompt.js +39 -0
  32. package/dist/layout-prompt.js.map +1 -0
  33. package/dist/layout-prompt.test.d.ts +2 -0
  34. package/dist/layout-prompt.test.d.ts.map +1 -0
  35. package/dist/layout-prompt.test.js +11 -0
  36. package/dist/layout-prompt.test.js.map +1 -0
  37. package/dist/path-mapper.d.ts +25 -0
  38. package/dist/path-mapper.d.ts.map +1 -0
  39. package/dist/path-mapper.js +112 -0
  40. package/dist/path-mapper.js.map +1 -0
  41. package/dist/path-mapper.test.d.ts +2 -0
  42. package/dist/path-mapper.test.d.ts.map +1 -0
  43. package/dist/path-mapper.test.js +18 -0
  44. package/dist/path-mapper.test.js.map +1 -0
  45. package/dist/resources.d.ts +27 -0
  46. package/dist/resources.d.ts.map +1 -0
  47. package/dist/resources.js +23 -0
  48. package/dist/resources.js.map +1 -0
  49. package/dist/types.d.ts +55 -0
  50. package/dist/types.d.ts.map +1 -0
  51. package/dist/types.js +2 -0
  52. package/dist/types.js.map +1 -0
  53. package/package.json +2 -2
@@ -0,0 +1,4 @@
1
+ import { type DigestBullet, type DigestChangeEvent, type DigestContext, type DigestHandler, type DigestSection, type DigestWindow } from '@relayfile/adapter-core';
2
+ export type { DigestBullet, DigestChangeEvent, DigestContext, DigestHandler, DigestSection, DigestWindow, };
3
+ export declare const digest: DigestHandler;
4
+ //# sourceMappingURL=digest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.d.ts","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,YAAY,EACZ,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,GACb,CAAC;AAEF,eAAO,MAAM,MAAM,EAAE,aAgBnB,CAAC"}
package/dist/digest.js ADDED
@@ -0,0 +1,47 @@
1
+ import { createDigestHandler, } from '@relayfile/adapter-core';
2
+ export const digest = createDigestHandler({
3
+ provider: 'reddit',
4
+ identify: (canonicalPath) => redditIdentifier(canonicalPath),
5
+ alias: {
6
+ mode: 'any',
7
+ segments: ['by-id', 'by-status'],
8
+ },
9
+ acceptEvent: (_event, canonicalPath) => isCanonicalRedditRecordPath(canonicalPath),
10
+ actionRules: [
11
+ { verbs: 'create|created|add|added|write|written', pastTense: 'was created' },
12
+ { verbs: 'archive|archived', pastTense: 'was archived' },
13
+ { verbs: 'lock|locked', pastTense: 'was locked' },
14
+ { verbs: 'remove|removed', pastTense: 'was removed' },
15
+ { verbs: 'delete|deleted', pastTense: 'was deleted' },
16
+ ],
17
+ defaultPastTense: 'was updated',
18
+ });
19
+ function isCanonicalRedditRecordPath(path) {
20
+ return /^reddit\/subreddits\/[^/]+\.json$/u.test(path)
21
+ || /^reddit\/subreddits\/[^/]+\/posts\/[^/]+\.json$/u.test(path);
22
+ }
23
+ function normalizeDigestPath(path) {
24
+ return path.replace(/^\/+/, '');
25
+ }
26
+ function redditIdentifier(path) {
27
+ const segments = normalizeDigestPath(path).split('/').filter(Boolean);
28
+ if (segments[1] === 'subreddits' && segments[3] === 'posts') {
29
+ return `post r/${decodePart(segments[2] ?? '')}/${decodeLeaf(segments[4] ?? '')}`;
30
+ }
31
+ if (segments[1] === 'subreddits') {
32
+ return `subreddit r/${decodeLeaf(segments[2] ?? '')}`;
33
+ }
34
+ return decodeLeaf(segments.at(-1) ?? path);
35
+ }
36
+ function decodeLeaf(segment) {
37
+ return decodePart(segment).replace(/\.[^.]+$/u, '');
38
+ }
39
+ function decodePart(segment) {
40
+ try {
41
+ return decodeURIComponent(segment);
42
+ }
43
+ catch {
44
+ return segment;
45
+ }
46
+ }
47
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../src/digest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAOpB,MAAM,yBAAyB,CAAC;AAWjC,MAAM,CAAC,MAAM,MAAM,GAAkB,mBAAmB,CAAC;IACvD,QAAQ,EAAE,QAAQ;IAClB,QAAQ,EAAE,CAAC,aAAa,EAAE,EAAE,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAC5D,KAAK,EAAE;QACL,IAAI,EAAE,KAAK;QACX,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;KACjC;IACD,WAAW,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,CAAC,2BAA2B,CAAC,aAAa,CAAC;IAClF,WAAW,EAAE;QACX,EAAE,KAAK,EAAE,wCAAwC,EAAE,SAAS,EAAE,aAAa,EAAE;QAC7E,EAAE,KAAK,EAAE,kBAAkB,EAAE,SAAS,EAAE,cAAc,EAAE;QACxD,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE;QACjD,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;QACrD,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE;KACtD;IACD,gBAAgB,EAAE,aAAa;CAChC,CAAC,CAAC;AAEH,SAAS,2BAA2B,CAAC,IAAY;IAC/C,OAAO,oCAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;WACjD,kDAAkD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IACpC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QAC5D,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,YAAY,EAAE,CAAC;QACjC,OAAO,eAAe,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;IACxD,CAAC;IACD,OAAO,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,UAAU,CAAC,OAAe;IACjC,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=digest.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.test.d.ts","sourceRoot":"","sources":["../src/digest.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,65 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { digest } from './digest.js';
4
+ test('reddit digest summarizes canonical events and terminal states', async () => {
5
+ const ctx = {
6
+ provider: 'reddit',
7
+ window: { from: '2026-05-29T00:00:00.000Z', to: '2026-05-30T00:00:00.000Z' },
8
+ async changeEvents(filter) {
9
+ assert.deepEqual(filter, { providers: ['reddit'] });
10
+ return [
11
+ {
12
+ id: 'evt-1',
13
+ timestamp: '2026-05-29T08:00:00.000Z',
14
+ action: 'created',
15
+ canonicalPath: '/reddit/subreddits/agentrelay.json',
16
+ },
17
+ {
18
+ id: 'evt-2',
19
+ timestamp: '2026-05-29T08:30:00.000Z',
20
+ action: 'archived',
21
+ canonicalPath: '/reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json',
22
+ },
23
+ ];
24
+ },
25
+ };
26
+ const result = await digest(ctx);
27
+ assert.deepEqual(result, {
28
+ provider: 'reddit',
29
+ bullets: [
30
+ {
31
+ text: 'subreddit r/agentrelay was created',
32
+ canonicalPath: 'reddit/subreddits/agentrelay.json',
33
+ },
34
+ {
35
+ text: 'post r/agentrelay/launch-week-recap__abc123 was archived',
36
+ canonicalPath: 'reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json',
37
+ },
38
+ ],
39
+ });
40
+ });
41
+ test('reddit digest ignores aliases and non-canonical helper files', async () => {
42
+ const ctx = {
43
+ provider: 'reddit',
44
+ window: { from: '2026-05-29T00:00:00.000Z', to: '2026-05-30T00:00:00.000Z' },
45
+ async changeEvents() {
46
+ return [
47
+ { id: 'evt-1', timestamp: '2026-05-29T08:00:00.000Z', action: 'updated', canonicalPath: '/reddit/LAYOUT.md' },
48
+ {
49
+ id: 'evt-2',
50
+ timestamp: '2026-05-29T08:00:01.000Z',
51
+ action: 'updated',
52
+ canonicalPath: '/reddit/posts/by-id/agentrelay__abc123.json',
53
+ },
54
+ {
55
+ id: 'evt-3',
56
+ timestamp: '2026-05-29T08:00:02.000Z',
57
+ action: 'updated',
58
+ canonicalPath: '/reddit/posts/by-status/archived/agentrelay__abc123.json',
59
+ },
60
+ ];
61
+ },
62
+ };
63
+ assert.equal(await digest(ctx), null);
64
+ });
65
+ //# sourceMappingURL=digest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.test.js","sourceRoot":"","sources":["../src/digest.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AAEzD,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAC/E,MAAM,GAAG,GAAkB;QACzB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,0BAA0B,EAAE;QAC5E,KAAK,CAAC,YAAY,CAAC,MAAM;YACvB,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO;gBACL;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,oCAAoC;iBACpD;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,UAAU;oBAClB,aAAa,EAAE,oEAAoE;iBACpF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE;QACvB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,oCAAoC;gBAC1C,aAAa,EAAE,mCAAmC;aACnD;YACD;gBACE,IAAI,EAAE,0DAA0D;gBAChE,aAAa,EAAE,mEAAmE;aACnF;SACF;KACF,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;IAC9E,MAAM,GAAG,GAAkB;QACzB,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE,EAAE,IAAI,EAAE,0BAA0B,EAAE,EAAE,EAAE,0BAA0B,EAAE;QAC5E,KAAK,CAAC,YAAY;YAChB,OAAO;gBACL,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,0BAA0B,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,mBAAmB,EAAE;gBAC7G;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,6CAA6C;iBAC7D;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,SAAS,EAAE,0BAA0B;oBACrC,MAAM,EAAE,SAAS;oBACjB,aAAa,EAAE,0DAA0D;iBAC1E;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,MAAM,CAAC,KAAK,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { type AuxiliaryEmitterClient, type EmitAuxiliaryFilesResult } from '@relayfile/adapter-core';
2
+ import type { RedditPost, RedditSubreddit } from './types.js';
3
+ export type RedditDeletedRecord = {
4
+ id: string;
5
+ _deleted: true;
6
+ objectType: 'subreddit' | 'post';
7
+ subreddit?: string;
8
+ post_id?: string;
9
+ };
10
+ export type RedditSubredditEmitRecord = RedditSubreddit | RedditDeletedRecord;
11
+ export type RedditPostEmitRecord = RedditPost | RedditDeletedRecord;
12
+ export interface RedditEmitAuxiliaryFilesInput {
13
+ workspaceId: string;
14
+ records?: readonly (RedditSubreddit | RedditPost | RedditDeletedRecord)[];
15
+ subreddits?: readonly RedditSubredditEmitRecord[];
16
+ posts?: readonly RedditPostEmitRecord[];
17
+ connectionId?: string;
18
+ }
19
+ export declare function emitRedditAuxiliaryFiles(client: AuxiliaryEmitterClient, input: RedditEmitAuxiliaryFilesInput): Promise<EmitAuxiliaryFilesResult>;
20
+ //# sourceMappingURL=emit-auxiliary-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.d.ts","sourceRoot":"","sources":["../src/emit-auxiliary-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,sBAAsB,EAC3B,KAAK,wBAAwB,EAG9B,MAAM,yBAAyB,CAAC;AAyBjC,OAAO,KAAK,EAAE,UAAU,EAAsB,eAAe,EAA2B,MAAM,YAAY,CAAC;AAK3G,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,WAAW,GAAG,MAAM,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,eAAe,GAAG,mBAAmB,CAAC;AAC9E,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,mBAAmB,CAAC;AAEpE,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,SAAS,CAAC,eAAe,GAAG,UAAU,GAAG,mBAAmB,CAAC,EAAE,CAAC;IAC1E,UAAU,CAAC,EAAE,SAAS,yBAAyB,EAAE,CAAC;IAClD,KAAK,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,6BAA6B,GACnC,OAAO,CAAC,wBAAwB,CAAC,CAoDnC"}
@@ -0,0 +1,298 @@
1
+ import { EMIT_AUXILIARY_JSON_CONTENT_TYPE, IndexFileReconciler, runEmitBatch, } from '@relayfile/adapter-core';
2
+ import { buildRedditPostsIndexFile, buildRedditRootIndexFile, buildRedditSubredditPostsIndexFile, buildRedditSubredditsIndexFile, redditPostIndexRow, redditPostTitle, redditSubredditIndexRow, redditSubredditTitle, } from './index-emitter.js';
3
+ import { redditLayoutPromptFile } from './layout-prompt.js';
4
+ import { normalizeSubreddit, parseRedditPostScopedId, redditPostByIdAliasPath, redditPostByStatusAliasPath, redditPostPath, redditPostsIndexPath, redditSubredditByIdAliasPath, redditSubredditPath, redditSubredditPostsIndexPath, redditSubredditsIndexPath, } from './path-mapper.js';
5
+ const REDDIT_PROVIDER_NAME = 'reddit';
6
+ const JSON_CONTENT_TYPE = EMIT_AUXILIARY_JSON_CONTENT_TYPE;
7
+ export async function emitRedditAuxiliaryFiles(client, input) {
8
+ const workspaceId = input.workspaceId;
9
+ const aggregate = { written: 0, deleted: 0, errors: [] };
10
+ await writeStaticFiles(client, workspaceId, aggregate);
11
+ const classified = classifyRecords(input.records ?? []);
12
+ const subreddits = [...(input.subreddits ?? []), ...classified.subreddits];
13
+ const posts = [...(input.posts ?? []), ...classified.posts];
14
+ const subredditIndex = new IndexFileReconciler({
15
+ client,
16
+ workspaceId,
17
+ path: redditSubredditsIndexPath(),
18
+ builder: buildRedditSubredditsIndexFile,
19
+ });
20
+ const postIndex = new IndexFileReconciler({
21
+ client,
22
+ workspaceId,
23
+ path: redditPostsIndexPath(),
24
+ builder: buildRedditPostsIndexFile,
25
+ });
26
+ const subredditPostIndexes = new Map();
27
+ accumulate(aggregate, await runEmitBatch(client, workspaceId, subreddits, (record) => planSubredditRecord(record, subredditIndex, input.connectionId)));
28
+ accumulate(aggregate, await runEmitBatch(client, workspaceId, posts, async (record) => planPostRecord(client, workspaceId, record, postIndex, getSubredditPostIndex, input.connectionId)));
29
+ for (const reconciler of [subredditIndex, postIndex, ...subredditPostIndexes.values()]) {
30
+ const flush = await reconciler.flush();
31
+ aggregate.written += flush.written;
32
+ aggregate.errors.push(...flush.errors);
33
+ }
34
+ return aggregate;
35
+ function getSubredditPostIndex(subreddit) {
36
+ const normalizedSubreddit = normalizeSubreddit(subreddit);
37
+ let reconciler = subredditPostIndexes.get(normalizedSubreddit);
38
+ if (!reconciler) {
39
+ reconciler = new IndexFileReconciler({
40
+ client,
41
+ workspaceId,
42
+ path: redditSubredditPostsIndexPath(normalizedSubreddit),
43
+ builder: (rows) => buildRedditSubredditPostsIndexFile(normalizedSubreddit, rows),
44
+ });
45
+ subredditPostIndexes.set(normalizedSubreddit, reconciler);
46
+ }
47
+ return reconciler;
48
+ }
49
+ }
50
+ async function writeStaticFiles(client, workspaceId, aggregate) {
51
+ for (const file of [buildRedditRootIndexFile(), redditLayoutPromptFile()]) {
52
+ try {
53
+ await client.writeFile({
54
+ workspaceId,
55
+ path: file.path,
56
+ content: file.content,
57
+ contentType: file.contentType,
58
+ });
59
+ aggregate.written += 1;
60
+ }
61
+ catch (error) {
62
+ aggregate.errors.push({ path: file.path, error: stringifyError(error) });
63
+ }
64
+ }
65
+ }
66
+ function planSubredditRecord(record, index, connectionId) {
67
+ const subreddit = normalizeSubreddit(isDeleted(record) ? record.id : record.name);
68
+ if (isDeleted(record)) {
69
+ index.remove(subreddit);
70
+ return {
71
+ deletes: staleDeletes([
72
+ redditSubredditPath(subreddit),
73
+ redditSubredditByIdAliasPath(subreddit),
74
+ ]),
75
+ };
76
+ }
77
+ const row = { ...redditSubredditIndexRow(record), id: subreddit };
78
+ index.upsert(row);
79
+ const canonicalPath = redditSubredditPath(subreddit);
80
+ const content = json(recordEnvelope('subreddit', subreddit, canonicalPath, redditSubredditTitle(record), record, connectionId));
81
+ const semantics = {
82
+ properties: {
83
+ provider: REDDIT_PROVIDER_NAME,
84
+ 'reddit.object_type': 'subreddit',
85
+ 'reddit.subreddit': subreddit,
86
+ },
87
+ };
88
+ return {
89
+ writes: [
90
+ mirrorWrite(canonicalPath, content, semantics),
91
+ mirrorWrite(redditSubredditByIdAliasPath(subreddit), content, semantics),
92
+ ],
93
+ };
94
+ }
95
+ async function planPostRecord(client, workspaceId, record, index, subredditIndex, connectionId) {
96
+ if (isDeleted(record)) {
97
+ const scoped = await resolveDeletedPostScope(client, workspaceId, record);
98
+ if (!scoped) {
99
+ index.remove(record.id);
100
+ return { deletes: [] };
101
+ }
102
+ const scopedId = `${scoped.subreddit}/${scoped.postId}`;
103
+ const byIdAliasPath = redditPostByIdAliasPath(scoped.subreddit, scoped.postId);
104
+ const canonicalPath = await canonicalPathFromAlias(client, workspaceId, byIdAliasPath);
105
+ index.remove(record.id);
106
+ index.remove(scopedId);
107
+ subredditIndex(scoped.subreddit).remove(record.id);
108
+ subredditIndex(scoped.subreddit).remove(scopedId);
109
+ return {
110
+ deletes: staleDeletes([
111
+ canonicalPath ?? redditPostPath(scoped.subreddit, scoped.postId),
112
+ byIdAliasPath,
113
+ redditPostByStatusAliasPath('active', scoped.subreddit, scoped.postId),
114
+ redditPostByStatusAliasPath('locked', scoped.subreddit, scoped.postId),
115
+ redditPostByStatusAliasPath('archived', scoped.subreddit, scoped.postId),
116
+ redditPostByStatusAliasPath('removed', scoped.subreddit, scoped.postId),
117
+ redditPostByStatusAliasPath('deleted', scoped.subreddit, scoped.postId),
118
+ ]),
119
+ };
120
+ }
121
+ const normalizedSubreddit = normalizeSubreddit(record.subreddit);
122
+ const row = redditPostIndexRow(record);
123
+ index.upsert(row);
124
+ subredditIndex(normalizedSubreddit).upsert(row);
125
+ const canonicalPath = redditPostPath(normalizedSubreddit, record.post_id, redditPostTitle(record));
126
+ const content = json(recordEnvelope('post', record.id, canonicalPath, redditPostTitle(record), record, connectionId));
127
+ const status = (record.status ?? 'active').toLowerCase();
128
+ const semantics = {
129
+ properties: {
130
+ provider: REDDIT_PROVIDER_NAME,
131
+ 'reddit.object_type': 'post',
132
+ 'reddit.subreddit': normalizedSubreddit,
133
+ 'reddit.post_id': record.post_id,
134
+ 'reddit.status': status,
135
+ },
136
+ };
137
+ return {
138
+ writes: [
139
+ mirrorWrite(canonicalPath, content, semantics),
140
+ mirrorWrite(redditPostByIdAliasPath(normalizedSubreddit, record.post_id), content, semantics),
141
+ mirrorWrite(redditPostByStatusAliasPath(status, normalizedSubreddit, record.post_id), content, semantics),
142
+ ],
143
+ deletes: staleDeletes([
144
+ ...(status === 'active' ? [] : [redditPostByStatusAliasPath('active', normalizedSubreddit, record.post_id)]),
145
+ ...(status === 'locked' ? [] : [redditPostByStatusAliasPath('locked', normalizedSubreddit, record.post_id)]),
146
+ ...(status === 'archived' ? [] : [redditPostByStatusAliasPath('archived', normalizedSubreddit, record.post_id)]),
147
+ ...(status === 'removed' ? [] : [redditPostByStatusAliasPath('removed', normalizedSubreddit, record.post_id)]),
148
+ ...(status === 'deleted' ? [] : [redditPostByStatusAliasPath('deleted', normalizedSubreddit, record.post_id)]),
149
+ ]),
150
+ };
151
+ }
152
+ async function resolveDeletedPostScope(client, workspaceId, record) {
153
+ const rawId = record.id.trim();
154
+ if (!rawId) {
155
+ return undefined;
156
+ }
157
+ try {
158
+ return parseRedditPostScopedId(rawId);
159
+ }
160
+ catch {
161
+ // fall through: some tombstones only carry an unscoped post id.
162
+ }
163
+ if (record.subreddit) {
164
+ return {
165
+ subreddit: normalizeSubreddit(record.subreddit),
166
+ postId: typeof record.post_id === 'string' && record.post_id.trim() ? record.post_id.trim() : rawId,
167
+ };
168
+ }
169
+ if (!client.readFile) {
170
+ return undefined;
171
+ }
172
+ try {
173
+ const read = await client.readFile({ workspaceId, path: redditPostsIndexPath() });
174
+ if (!read?.content) {
175
+ return undefined;
176
+ }
177
+ const parsed = JSON.parse(read.content);
178
+ if (!Array.isArray(parsed)) {
179
+ return undefined;
180
+ }
181
+ for (const row of parsed) {
182
+ if (!row || typeof row !== 'object')
183
+ continue;
184
+ const entry = row;
185
+ if (typeof entry.id !== 'string')
186
+ continue;
187
+ const id = entry.id.trim();
188
+ if (!id)
189
+ continue;
190
+ if (id === rawId && typeof entry.subreddit === 'string' && entry.subreddit.trim()) {
191
+ return {
192
+ subreddit: normalizeSubreddit(entry.subreddit),
193
+ postId: rawId,
194
+ };
195
+ }
196
+ if (id === rawId || id.endsWith(`/${rawId}`)) {
197
+ try {
198
+ return parseRedditPostScopedId(id);
199
+ }
200
+ catch {
201
+ // keep looking through the index for another compatible row.
202
+ }
203
+ }
204
+ }
205
+ }
206
+ catch {
207
+ return undefined;
208
+ }
209
+ return undefined;
210
+ }
211
+ function classifyRecords(records) {
212
+ const subreddits = [];
213
+ const posts = [];
214
+ for (const record of records) {
215
+ if (!record || typeof record !== 'object')
216
+ continue;
217
+ if ('_deleted' in record && record._deleted === true) {
218
+ const tombstone = record;
219
+ if (tombstone.objectType === 'subreddit')
220
+ subreddits.push(tombstone);
221
+ if (tombstone.objectType === 'post')
222
+ posts.push(tombstone);
223
+ continue;
224
+ }
225
+ const candidate = record;
226
+ if (typeof candidate.post_id === 'string' && typeof candidate.subreddit === 'string') {
227
+ posts.push(record);
228
+ continue;
229
+ }
230
+ if (typeof candidate.name === 'string') {
231
+ subreddits.push(record);
232
+ }
233
+ }
234
+ return { subreddits, posts };
235
+ }
236
+ function recordEnvelope(objectType, objectId, canonicalPath, title, payload, connectionId) {
237
+ return {
238
+ provider: REDDIT_PROVIDER_NAME,
239
+ objectType,
240
+ objectId,
241
+ title,
242
+ canonicalPath,
243
+ ...(connectionId ? { connectionId } : {}),
244
+ payload,
245
+ };
246
+ }
247
+ function mirrorWrite(path, content, semantics) {
248
+ return {
249
+ path,
250
+ content,
251
+ contentType: JSON_CONTENT_TYPE,
252
+ ...(semantics ? { semantics } : {}),
253
+ };
254
+ }
255
+ function json(value) {
256
+ return `${JSON.stringify(value)}\n`;
257
+ }
258
+ function staleDeletes(paths) {
259
+ return paths
260
+ .filter((path) => Boolean(path))
261
+ .map((path) => ({ path }));
262
+ }
263
+ async function canonicalPathFromAlias(client, workspaceId, aliasPath) {
264
+ if (!client.readFile) {
265
+ return undefined;
266
+ }
267
+ try {
268
+ const read = await client.readFile({ workspaceId, path: aliasPath });
269
+ if (!read?.content) {
270
+ return undefined;
271
+ }
272
+ const parsed = JSON.parse(read.content);
273
+ if (!parsed || typeof parsed !== 'object') {
274
+ return undefined;
275
+ }
276
+ const canonicalPath = parsed.canonicalPath;
277
+ return typeof canonicalPath === 'string' && canonicalPath.length > 0
278
+ ? canonicalPath
279
+ : undefined;
280
+ }
281
+ catch {
282
+ return undefined;
283
+ }
284
+ }
285
+ function isDeleted(record) {
286
+ return record._deleted === true;
287
+ }
288
+ function stringifyError(error) {
289
+ if (error instanceof Error)
290
+ return error.message;
291
+ return String(error);
292
+ }
293
+ function accumulate(target, source) {
294
+ target.written += source.written;
295
+ target.deleted += source.deleted;
296
+ target.errors.push(...source.errors);
297
+ }
298
+ //# sourceMappingURL=emit-auxiliary-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.js","sourceRoot":"","sources":["../src/emit-auxiliary-files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=emit-auxiliary-files.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.d.ts","sourceRoot":"","sources":["../src/emit-auxiliary-files.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ import assert from 'node:assert/strict';
2
+ import test from 'node:test';
3
+ import { emitRedditAuxiliaryFiles } from './emit-auxiliary-files.js';
4
+ import { redditPostByIdAliasPath, redditPostsIndexPath, redditSubredditPostsIndexPath, redditSubredditsIndexPath, } from './path-mapper.js';
5
+ function createClient(initialFiles = {}) {
6
+ const files = new Map(Object.entries(initialFiles));
7
+ return {
8
+ writes: [],
9
+ deletes: [],
10
+ files,
11
+ async writeFile(input) {
12
+ this.writes.push(input);
13
+ this.files.set(input.path, input.content);
14
+ return { created: true };
15
+ },
16
+ async deleteFile(input) {
17
+ this.deletes.push(input);
18
+ this.files.delete(input.path);
19
+ },
20
+ async readFile(input) {
21
+ const content = this.files.get(input.path);
22
+ return content === undefined ? null : { content };
23
+ },
24
+ };
25
+ }
26
+ test('subreddit tombstones normalize r/ prefix when deleting aliases and index rows', async () => {
27
+ const client = createClient({
28
+ [redditSubredditsIndexPath()]: JSON.stringify([
29
+ {
30
+ id: 'agentrelay',
31
+ title: 'Agent Relay',
32
+ updated: '2026-05-29T00:00:00.000Z',
33
+ },
34
+ ]),
35
+ });
36
+ const tombstone = {
37
+ id: 'r/AgentRelay',
38
+ _deleted: true,
39
+ objectType: 'subreddit',
40
+ };
41
+ const result = await emitRedditAuxiliaryFiles(client, {
42
+ workspaceId: 'ws-1',
43
+ subreddits: [tombstone],
44
+ });
45
+ assert.deepEqual(result.errors, []);
46
+ assert.ok(client.deletes.some((entry) => entry.path === '/reddit/subreddits/agentrelay.json'));
47
+ assert.ok(client.deletes.some((entry) => entry.path === '/reddit/subreddits/by-id/agentrelay.json'));
48
+ const indexContent = client.files.get(redditSubredditsIndexPath());
49
+ assert.ok(indexContent, 'subreddits index should be rewritten');
50
+ assert.deepEqual(JSON.parse(indexContent), []);
51
+ });
52
+ test('post tombstones delete canonical file path resolved from by-id alias payload', async () => {
53
+ const byIdAlias = redditPostByIdAliasPath('agentrelay', 'abc123');
54
+ const canonical = '/reddit/subreddits/agentrelay/posts/launch-week-recap__abc123.json';
55
+ const client = createClient({
56
+ [byIdAlias]: JSON.stringify({ canonicalPath: canonical }),
57
+ [redditPostsIndexPath()]: JSON.stringify([
58
+ { id: 'agentrelay/abc123', title: 'Launch week recap', updated: '2026-05-29T00:00:00.000Z', subreddit: 'agentrelay' },
59
+ ]),
60
+ [redditSubredditPostsIndexPath('agentrelay')]: JSON.stringify([
61
+ { id: 'agentrelay/abc123', title: 'Launch week recap', updated: '2026-05-29T00:00:00.000Z', subreddit: 'agentrelay' },
62
+ ]),
63
+ });
64
+ const result = await emitRedditAuxiliaryFiles(client, {
65
+ workspaceId: 'ws-1',
66
+ posts: [{ id: 'agentrelay/abc123', _deleted: true, objectType: 'post' }],
67
+ });
68
+ assert.deepEqual(result.errors, []);
69
+ assert.ok(client.deletes.some((entry) => entry.path === canonical));
70
+ assert.ok(client.deletes.some((entry) => entry.path === byIdAlias));
71
+ });
72
+ test('post tombstones accept unscoped ids when subreddit context is provided', async () => {
73
+ const byIdAlias = redditPostByIdAliasPath('agentrelay', 'abc123');
74
+ const canonical = '/reddit/subreddits/agentrelay/posts/hello-world__abc123.json';
75
+ const client = createClient({
76
+ [byIdAlias]: JSON.stringify({ canonicalPath: canonical }),
77
+ });
78
+ const result = await emitRedditAuxiliaryFiles(client, {
79
+ workspaceId: 'ws-1',
80
+ posts: [{ id: 'abc123', subreddit: 'r/AgentRelay', _deleted: true, objectType: 'post' }],
81
+ });
82
+ assert.deepEqual(result.errors, []);
83
+ assert.ok(client.deletes.some((entry) => entry.path === canonical));
84
+ assert.ok(client.deletes.some((entry) => entry.path === byIdAlias));
85
+ });
86
+ test('post upserts do not require scoped id format', async () => {
87
+ const client = createClient();
88
+ const result = await emitRedditAuxiliaryFiles(client, {
89
+ workspaceId: 'ws-1',
90
+ posts: [
91
+ {
92
+ id: 'abc123',
93
+ post_id: 'abc123',
94
+ subreddit: 'AgentRelay',
95
+ title: 'Hello world',
96
+ },
97
+ ],
98
+ });
99
+ assert.deepEqual(result.errors, []);
100
+ assert.ok(client.writes.some((entry) => entry.path === '/reddit/subreddits/agentrelay/posts/hello-world__abc123.json'));
101
+ });
102
+ //# sourceMappingURL=emit-auxiliary-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-auxiliary-files.test.js","sourceRoot":"","sources":["../src/emit-auxiliary-files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import type { RedditPost, RedditPostIndexRow, RedditSubreddit, RedditSubredditIndexRow } from './types.js';
2
+ export declare function buildRedditRootIndexFile(): {
3
+ path: string;
4
+ contentType: string;
5
+ content: string;
6
+ };
7
+ export declare function buildRedditSubredditsIndexFile(rows: readonly RedditSubredditIndexRow[]): {
8
+ path: string;
9
+ contentType: string;
10
+ content: string;
11
+ };
12
+ export declare function buildRedditPostsIndexFile(rows: readonly RedditPostIndexRow[]): {
13
+ path: string;
14
+ contentType: string;
15
+ content: string;
16
+ };
17
+ export declare function buildRedditSubredditPostsIndexFile(subreddit: string, rows: readonly RedditPostIndexRow[]): {
18
+ path: string;
19
+ contentType: string;
20
+ content: string;
21
+ };
22
+ export declare function redditSubredditIndexRow(record: RedditSubreddit): RedditSubredditIndexRow;
23
+ export declare function redditPostIndexRow(record: RedditPost): RedditPostIndexRow;
24
+ export declare function redditSubredditTitle(record: RedditSubreddit): string;
25
+ export declare function redditPostTitle(record: RedditPost): string;
26
+ //# sourceMappingURL=index-emitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-emitter.d.ts","sourceRoot":"","sources":["../src/index-emitter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgB3G,wBAAgB,wBAAwB;;;;EASvC;AAED,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,SAAS,uBAAuB,EAAE;;;;EAMtF;AAED,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,SAAS,kBAAkB,EAAE;;;;EAM5E;AAED,wBAAgB,kCAAkC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,kBAAkB,EAAE;;;;EAMxG;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,eAAe,GAAG,uBAAuB,CAaxF;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,UAAU,GAAG,kBAAkB,CAezE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAEpE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAE1D"}