@toon-protocol/views 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/a2ui/A2UIRenderer.d.ts +47 -0
- package/dist/a2ui/A2UIRenderer.d.ts.map +1 -0
- package/dist/a2ui/A2UIRenderer.js +106 -0
- package/dist/a2ui/A2UIRenderer.js.map +1 -0
- package/dist/a2ui/binding.d.ts +46 -0
- package/dist/a2ui/binding.d.ts.map +1 -0
- package/dist/a2ui/binding.js +111 -0
- package/dist/a2ui/binding.js.map +1 -0
- package/dist/a2ui/index.d.ts +17 -0
- package/dist/a2ui/index.d.ts.map +1 -0
- package/dist/a2ui/index.js +17 -0
- package/dist/a2ui/index.js.map +1 -0
- package/dist/a2ui/types.d.ts +101 -0
- package/dist/a2ui/types.d.ts.map +1 -0
- package/dist/a2ui/types.js +64 -0
- package/dist/a2ui/types.js.map +1 -0
- package/dist/a2ui/validate.d.ts +55 -0
- package/dist/a2ui/validate.d.ts.map +1 -0
- package/dist/a2ui/validate.js +117 -0
- package/dist/a2ui/validate.js.map +1 -0
- package/dist/app/index.html +246 -0
- package/dist/app-bridge/ext-apps-bridge.d.ts +16 -0
- package/dist/app-bridge/ext-apps-bridge.d.ts.map +1 -0
- package/dist/app-bridge/ext-apps-bridge.js +66 -0
- package/dist/app-bridge/ext-apps-bridge.js.map +1 -0
- package/dist/app-bridge/types.d.ts +41 -0
- package/dist/app-bridge/types.d.ts.map +1 -0
- package/dist/app-bridge/types.js +10 -0
- package/dist/app-bridge/types.js.map +1 -0
- package/dist/app-entry.d.ts +13 -0
- package/dist/app-entry.d.ts.map +1 -0
- package/dist/app-entry.js +45 -0
- package/dist/app-entry.js.map +1 -0
- package/dist/atoms/defi.d.ts +3 -0
- package/dist/atoms/defi.d.ts.map +1 -0
- package/dist/atoms/defi.js +80 -0
- package/dist/atoms/defi.js.map +1 -0
- package/dist/atoms/fallback.d.ts +4 -0
- package/dist/atoms/fallback.d.ts.map +1 -0
- package/dist/atoms/fallback.js +15 -0
- package/dist/atoms/fallback.js.map +1 -0
- package/dist/atoms/forge.d.ts +3 -0
- package/dist/atoms/forge.d.ts.map +1 -0
- package/dist/atoms/forge.js +50 -0
- package/dist/atoms/forge.js.map +1 -0
- package/dist/atoms/interactive.d.ts +3 -0
- package/dist/atoms/interactive.d.ts.map +1 -0
- package/dist/atoms/interactive.js +99 -0
- package/dist/atoms/interactive.js.map +1 -0
- package/dist/atoms/layout.d.ts +3 -0
- package/dist/atoms/layout.d.ts.map +1 -0
- package/dist/atoms/layout.js +22 -0
- package/dist/atoms/layout.js.map +1 -0
- package/dist/atoms/media.d.ts +3 -0
- package/dist/atoms/media.d.ts.map +1 -0
- package/dist/atoms/media.js +92 -0
- package/dist/atoms/media.js.map +1 -0
- package/dist/atoms/onboard.d.ts +3 -0
- package/dist/atoms/onboard.d.ts.map +1 -0
- package/dist/atoms/onboard.js +26 -0
- package/dist/atoms/onboard.js.map +1 -0
- package/dist/atoms/registry.d.ts +35 -0
- package/dist/atoms/registry.d.ts.map +1 -0
- package/dist/atoms/registry.js +77 -0
- package/dist/atoms/registry.js.map +1 -0
- package/dist/atoms/social.d.ts +3 -0
- package/dist/atoms/social.d.ts.map +1 -0
- package/dist/atoms/social.js +52 -0
- package/dist/atoms/social.js.map +1 -0
- package/dist/atoms/types.d.ts +72 -0
- package/dist/atoms/types.d.ts.map +1 -0
- package/dist/atoms/types.js +11 -0
- package/dist/atoms/types.js.map +1 -0
- package/dist/catalog.d.ts +27 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +121 -0
- package/dist/catalog.js.map +1 -0
- package/dist/components/mono-id.d.ts +16 -0
- package/dist/components/mono-id.d.ts.map +1 -0
- package/dist/components/mono-id.js +18 -0
- package/dist/components/mono-id.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +12 -0
- package/dist/components/ui/avatar.d.ts.map +1 -0
- package/dist/components/ui/avatar.js +25 -0
- package/dist/components/ui/avatar.js.map +1 -0
- package/dist/components/ui/badge.d.ts +10 -0
- package/dist/components/ui/badge.d.ts.map +1 -0
- package/dist/components/ui/badge.js +26 -0
- package/dist/components/ui/badge.js.map +1 -0
- package/dist/components/ui/button.d.ts +11 -0
- package/dist/components/ui/button.d.ts.map +1 -0
- package/dist/components/ui/button.js +37 -0
- package/dist/components/ui/button.js.map +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.d.ts.map +1 -0
- package/dist/components/ui/input.js +8 -0
- package/dist/components/ui/input.js.map +1 -0
- package/dist/components/ui/separator.d.ts +5 -0
- package/dist/components/ui/separator.d.ts.map +1 -0
- package/dist/components/ui/separator.js +9 -0
- package/dist/components/ui/separator.js.map +1 -0
- package/dist/components/ui/textarea.d.ts +4 -0
- package/dist/components/ui/textarea.d.ts.map +1 -0
- package/dist/components/ui/textarea.js +8 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/examples.d.ts +39 -0
- package/dist/examples.d.ts.map +1 -0
- package/dist/examples.js +168 -0
- package/dist/examples.js.map +1 -0
- package/dist/filters.d.ts +40 -0
- package/dist/filters.d.ts.map +1 -0
- package/dist/filters.js +84 -0
- package/dist/filters.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +4 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +7 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/utils.d.ts +3 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +6 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +7 -0
- package/dist/main.js.map +1 -0
- package/dist/mcp-ui/ConsentPrompt.d.ts +41 -0
- package/dist/mcp-ui/ConsentPrompt.d.ts.map +1 -0
- package/dist/mcp-ui/ConsentPrompt.js +45 -0
- package/dist/mcp-ui/ConsentPrompt.js.map +1 -0
- package/dist/mcp-ui/SandboxedAppRenderer.d.ts +54 -0
- package/dist/mcp-ui/SandboxedAppRenderer.d.ts.map +1 -0
- package/dist/mcp-ui/SandboxedAppRenderer.js +74 -0
- package/dist/mcp-ui/SandboxedAppRenderer.js.map +1 -0
- package/dist/mcp-ui/index.d.ts +18 -0
- package/dist/mcp-ui/index.d.ts.map +1 -0
- package/dist/mcp-ui/index.js +18 -0
- package/dist/mcp-ui/index.js.map +1 -0
- package/dist/mcp-ui/sandbox.d.ts +62 -0
- package/dist/mcp-ui/sandbox.d.ts.map +1 -0
- package/dist/mcp-ui/sandbox.js +78 -0
- package/dist/mcp-ui/sandbox.js.map +1 -0
- package/dist/parsers/media.d.ts +68 -0
- package/dist/parsers/media.d.ts.map +1 -0
- package/dist/parsers/media.js +124 -0
- package/dist/parsers/media.js.map +1 -0
- package/dist/parsers/nip34.d.ts +75 -0
- package/dist/parsers/nip34.d.ts.map +1 -0
- package/dist/parsers/nip34.js +142 -0
- package/dist/parsers/nip34.js.map +1 -0
- package/dist/parsers/social.d.ts +89 -0
- package/dist/parsers/social.d.ts.map +1 -0
- package/dist/parsers/social.js +136 -0
- package/dist/parsers/social.js.map +1 -0
- package/dist/render/node-shims/node-builtins.d.ts +30 -0
- package/dist/render/node-shims/node-builtins.d.ts.map +1 -0
- package/dist/render/node-shims/node-builtins.js +38 -0
- package/dist/render/node-shims/node-builtins.js.map +1 -0
- package/dist/render/resolve.d.ts +72 -0
- package/dist/render/resolve.d.ts.map +1 -0
- package/dist/render/resolve.js +115 -0
- package/dist/render/resolve.js.map +1 -0
- package/dist/runtime.d.ts +17 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +218 -0
- package/dist/runtime.js.map +1 -0
- package/dist/server/apps-server.d.ts +32 -0
- package/dist/server/apps-server.d.ts.map +1 -0
- package/dist/server/apps-server.js +163 -0
- package/dist/server/apps-server.js.map +1 -0
- package/dist/server/backend.d.ts +148 -0
- package/dist/server/backend.d.ts.map +1 -0
- package/dist/server/backend.js +11 -0
- package/dist/server/backend.js.map +1 -0
- package/dist/server/daemon-backend.d.ts +113 -0
- package/dist/server/daemon-backend.d.ts.map +1 -0
- package/dist/server/daemon-backend.js +79 -0
- package/dist/server/daemon-backend.js.map +1 -0
- package/dist/server/daemon-main.d.ts +25 -0
- package/dist/server/daemon-main.d.ts.map +1 -0
- package/dist/server/daemon-main.js +165 -0
- package/dist/server/daemon-main.js.map +1 -0
- package/dist/server/fake-backend.d.ts +53 -0
- package/dist/server/fake-backend.d.ts.map +1 -0
- package/dist/server/fake-backend.js +157 -0
- package/dist/server/fake-backend.js.map +1 -0
- package/dist/server/fake-main.d.ts +15 -0
- package/dist/server/fake-main.d.ts.map +1 -0
- package/dist/server/fake-main.js +39 -0
- package/dist/server/fake-main.js.map +1 -0
- package/dist/spec.d.ts +67 -0
- package/dist/spec.d.ts.map +1 -0
- package/dist/spec.js +221 -0
- package/dist/spec.js.map +1 -0
- package/dist/tool-names.d.ts +27 -0
- package/dist/tool-names.d.ts.map +1 -0
- package/dist/tool-names.js +32 -0
- package/dist/tool-names.js.map +1 -0
- package/dist/types.d.ts +39 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +20 -0
- package/dist/types.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/parsers/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,aAAa,CAAC;AAEzE,6EAA6E;AAC7E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,wCAAwC;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4BAA4B;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,GAAG,IAAI,CA0B7D;AAED,qEAAqE;AACrE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,CAKlE;AAED,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,oDAAoD;AACpD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CA2BxE;AAED,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,uBAAwB,CAAC;AAEtD,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,kDAAkD;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAwBlE"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Media-NIP parsers.
|
|
3
|
+
*
|
|
4
|
+
* NIP-92 `imeta` tags → MediaVariant[] (inline media on any event)
|
|
5
|
+
* NIP-94 kind:1063 file meta → FileMetadata
|
|
6
|
+
* NIP-68 kind:20 picture → MediaPost (kind 'picture')
|
|
7
|
+
* NIP-71 kind:21/22 video → MediaPost (kind 'video')
|
|
8
|
+
*
|
|
9
|
+
* Media bytes themselves live on Arweave (uploaded via the kind:5094 blob DVM);
|
|
10
|
+
* these parsers only surface the URLs/hashes/dimensions for rendering.
|
|
11
|
+
*/
|
|
12
|
+
import { getTagValue, getTagValues } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse a single NIP-92 `imeta` tag.
|
|
15
|
+
* Form: `["imeta", "url https://…", "m image/png", "x <hash>", "dim 800x600", …]`.
|
|
16
|
+
* Each element after the tag name is a space-delimited `key value` pair;
|
|
17
|
+
* `value` may itself contain spaces (e.g. `alt a cat`).
|
|
18
|
+
*/
|
|
19
|
+
export function parseImeta(tag) {
|
|
20
|
+
if (tag[0] !== 'imeta')
|
|
21
|
+
return null;
|
|
22
|
+
const fields = {};
|
|
23
|
+
const fallbacks = [];
|
|
24
|
+
for (let i = 1; i < tag.length; i++) {
|
|
25
|
+
const entry = tag[i];
|
|
26
|
+
if (!entry)
|
|
27
|
+
continue;
|
|
28
|
+
const sp = entry.indexOf(' ');
|
|
29
|
+
if (sp === -1)
|
|
30
|
+
continue;
|
|
31
|
+
const key = entry.slice(0, sp);
|
|
32
|
+
const value = entry.slice(sp + 1);
|
|
33
|
+
if (key === 'fallback')
|
|
34
|
+
fallbacks.push(value);
|
|
35
|
+
else if (!(key in fields))
|
|
36
|
+
fields[key] = value;
|
|
37
|
+
}
|
|
38
|
+
const url = fields['url'];
|
|
39
|
+
if (!url)
|
|
40
|
+
return null;
|
|
41
|
+
const variant = { url, fallbacks };
|
|
42
|
+
if (fields['m'])
|
|
43
|
+
variant.mime = fields['m'];
|
|
44
|
+
if (fields['x'])
|
|
45
|
+
variant.hash = fields['x'];
|
|
46
|
+
if (fields['dim'])
|
|
47
|
+
variant.dim = fields['dim'];
|
|
48
|
+
if (fields['alt'])
|
|
49
|
+
variant.alt = fields['alt'];
|
|
50
|
+
if (fields['blurhash'])
|
|
51
|
+
variant.blurhash = fields['blurhash'];
|
|
52
|
+
return variant;
|
|
53
|
+
}
|
|
54
|
+
/** Extract all NIP-92 inline media variants from an event's tags. */
|
|
55
|
+
export function parseInlineMedia(event) {
|
|
56
|
+
return event.tags
|
|
57
|
+
.filter((t) => t[0] === 'imeta')
|
|
58
|
+
.map(parseImeta)
|
|
59
|
+
.filter((v) => v !== null);
|
|
60
|
+
}
|
|
61
|
+
/** Parse a kind:1063 NIP-94 file metadata event. */
|
|
62
|
+
export function parseFileMetadata(event) {
|
|
63
|
+
if (event.kind !== 1063)
|
|
64
|
+
return null;
|
|
65
|
+
const url = getTagValue(event.tags, 'url');
|
|
66
|
+
if (!url)
|
|
67
|
+
return null;
|
|
68
|
+
const meta = {
|
|
69
|
+
eventId: event.id,
|
|
70
|
+
authorPubkey: event.pubkey,
|
|
71
|
+
createdAt: event.created_at,
|
|
72
|
+
url,
|
|
73
|
+
caption: event.content,
|
|
74
|
+
};
|
|
75
|
+
const mime = getTagValue(event.tags, 'm');
|
|
76
|
+
const hash = getTagValue(event.tags, 'x');
|
|
77
|
+
const sizeStr = getTagValue(event.tags, 'size');
|
|
78
|
+
const dim = getTagValue(event.tags, 'dim');
|
|
79
|
+
const summary = getTagValue(event.tags, 'summary');
|
|
80
|
+
if (mime)
|
|
81
|
+
meta.mime = mime;
|
|
82
|
+
if (hash)
|
|
83
|
+
meta.hash = hash;
|
|
84
|
+
if (dim)
|
|
85
|
+
meta.dim = dim;
|
|
86
|
+
if (summary)
|
|
87
|
+
meta.summary = summary;
|
|
88
|
+
if (sizeStr) {
|
|
89
|
+
const size = Number(sizeStr);
|
|
90
|
+
if (Number.isFinite(size))
|
|
91
|
+
meta.size = size;
|
|
92
|
+
}
|
|
93
|
+
return meta;
|
|
94
|
+
}
|
|
95
|
+
/** Kinds carrying a media-first post. */
|
|
96
|
+
export const MEDIA_POST_KINDS = [20, 21, 22];
|
|
97
|
+
/** Parse a kind:20/21/22 media post. */
|
|
98
|
+
export function parseMediaPost(event) {
|
|
99
|
+
if (!MEDIA_POST_KINDS.includes(event.kind)) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const variants = parseInlineMedia(event);
|
|
103
|
+
const post = {
|
|
104
|
+
eventId: event.id,
|
|
105
|
+
authorPubkey: event.pubkey,
|
|
106
|
+
createdAt: event.created_at,
|
|
107
|
+
mediaType: event.kind === 20 ? 'picture' : 'video',
|
|
108
|
+
short: event.kind === 22,
|
|
109
|
+
content: event.content,
|
|
110
|
+
variants,
|
|
111
|
+
hashtags: getTagValues(event.tags, 't'),
|
|
112
|
+
};
|
|
113
|
+
const title = getTagValue(event.tags, 'title');
|
|
114
|
+
if (title)
|
|
115
|
+
post.title = title;
|
|
116
|
+
const durationStr = getTagValue(event.tags, 'duration');
|
|
117
|
+
if (durationStr) {
|
|
118
|
+
const d = Number(durationStr);
|
|
119
|
+
if (Number.isFinite(d))
|
|
120
|
+
post.durationSec = d;
|
|
121
|
+
}
|
|
122
|
+
return post;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/parsers/media.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NIP-34 (git) event parsers.
|
|
3
|
+
*
|
|
4
|
+
* kind:30617 repository announcement → RepoMetadata
|
|
5
|
+
* kind:30618 repository refs/state → RepoRefs
|
|
6
|
+
* kind:1621 issue → IssueMetadata
|
|
7
|
+
* kind:1617 patch/PR → PRMetadata
|
|
8
|
+
* kind:1622 comment → CommentMetadata
|
|
9
|
+
* kind:1630-1633 status → resolved via resolvePRStatus / resolveIssueStatus
|
|
10
|
+
*
|
|
11
|
+
* Moved verbatim from rig's `web/nip34-parsers.ts` so rig and the MCP-app
|
|
12
|
+
* bundle share one parser corpus.
|
|
13
|
+
*/
|
|
14
|
+
import { type NostrEvent } from '../types.js';
|
|
15
|
+
/** Parsed repository metadata from a kind:30617 event. */
|
|
16
|
+
export interface RepoMetadata {
|
|
17
|
+
repoId: string;
|
|
18
|
+
name: string;
|
|
19
|
+
description: string;
|
|
20
|
+
ownerPubkey: string;
|
|
21
|
+
defaultBranch: string;
|
|
22
|
+
eventId: string;
|
|
23
|
+
cloneUrls: string[];
|
|
24
|
+
webUrls: string[];
|
|
25
|
+
}
|
|
26
|
+
/** Parsed repository refs from a kind:30618 event. */
|
|
27
|
+
export interface RepoRefs {
|
|
28
|
+
repoId: string;
|
|
29
|
+
refs: Map<string, string>;
|
|
30
|
+
arweaveMap: Map<string, string>;
|
|
31
|
+
}
|
|
32
|
+
/** Parse a kind:30618 repository refs event into RepoRefs. */
|
|
33
|
+
export declare function parseRepoRefs(event: NostrEvent): RepoRefs | null;
|
|
34
|
+
/** Parse a kind:30617 repository announcement event into RepoMetadata. */
|
|
35
|
+
export declare function parseRepoAnnouncement(event: NostrEvent): RepoMetadata | null;
|
|
36
|
+
/** Parsed issue metadata from a kind:1621 event. */
|
|
37
|
+
export interface IssueMetadata {
|
|
38
|
+
eventId: string;
|
|
39
|
+
title: string;
|
|
40
|
+
content: string;
|
|
41
|
+
authorPubkey: string;
|
|
42
|
+
createdAt: number;
|
|
43
|
+
labels: string[];
|
|
44
|
+
status: 'open' | 'closed';
|
|
45
|
+
}
|
|
46
|
+
/** Parsed pull request metadata from a kind:1617 event. */
|
|
47
|
+
export interface PRMetadata {
|
|
48
|
+
eventId: string;
|
|
49
|
+
title: string;
|
|
50
|
+
content: string;
|
|
51
|
+
authorPubkey: string;
|
|
52
|
+
createdAt: number;
|
|
53
|
+
commitShas: string[];
|
|
54
|
+
baseBranch: string;
|
|
55
|
+
status: 'open' | 'applied' | 'closed' | 'draft';
|
|
56
|
+
}
|
|
57
|
+
/** Parsed comment metadata from a kind:1622 event. */
|
|
58
|
+
export interface CommentMetadata {
|
|
59
|
+
eventId: string;
|
|
60
|
+
content: string;
|
|
61
|
+
authorPubkey: string;
|
|
62
|
+
createdAt: number;
|
|
63
|
+
parentEventId: string;
|
|
64
|
+
}
|
|
65
|
+
/** Parse a kind:1621 issue event into IssueMetadata. */
|
|
66
|
+
export declare function parseIssue(event: NostrEvent): IssueMetadata | null;
|
|
67
|
+
/** Parse a kind:1617 patch/PR event into PRMetadata. */
|
|
68
|
+
export declare function parsePR(event: NostrEvent): PRMetadata | null;
|
|
69
|
+
/** Parse a kind:1622 comment event into CommentMetadata. */
|
|
70
|
+
export declare function parseComment(event: NostrEvent): CommentMetadata | null;
|
|
71
|
+
/** Resolve the status of a PR from status events (kind:1630-1633). */
|
|
72
|
+
export declare function resolvePRStatus(prEventId: string, statusEvents: NostrEvent[]): 'open' | 'applied' | 'closed' | 'draft';
|
|
73
|
+
/** Resolve the status of an issue from close events (kind:1632). */
|
|
74
|
+
export declare function resolveIssueStatus(issueEventId: string, closeEvents: NostrEvent[]): 'open' | 'closed';
|
|
75
|
+
//# sourceMappingURL=nip34.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip34.d.ts","sourceRoot":"","sources":["../../src/parsers/nip34.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,aAAa,CAAC;AAEzE,0DAA0D;AAC1D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAKD,sDAAsD;AACtD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,8DAA8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAkBhE;AAED,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAyB5E;AAED,oDAAoD;AACpD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED,2DAA2D;AAC3D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;CACjD;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,GAAG,IAAI,CAgBlE;AAED,wDAAwD;AACxD,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAiB5D;AAED,4DAA4D;AAC5D,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CAatE;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,UAAU,EAAE,GACzB,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAsBzC;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,UAAU,EAAE,GACxB,MAAM,GAAG,QAAQ,CAMnB"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NIP-34 (git) event parsers.
|
|
3
|
+
*
|
|
4
|
+
* kind:30617 repository announcement → RepoMetadata
|
|
5
|
+
* kind:30618 repository refs/state → RepoRefs
|
|
6
|
+
* kind:1621 issue → IssueMetadata
|
|
7
|
+
* kind:1617 patch/PR → PRMetadata
|
|
8
|
+
* kind:1622 comment → CommentMetadata
|
|
9
|
+
* kind:1630-1633 status → resolved via resolvePRStatus / resolveIssueStatus
|
|
10
|
+
*
|
|
11
|
+
* Moved verbatim from rig's `web/nip34-parsers.ts` so rig and the MCP-app
|
|
12
|
+
* bundle share one parser corpus.
|
|
13
|
+
*/
|
|
14
|
+
import { getTagValue, getTagValues } from '../types.js';
|
|
15
|
+
/** Maximum number of refs to parse from a single kind:30618 event. */
|
|
16
|
+
const MAX_REFS_PER_EVENT = 1000;
|
|
17
|
+
/** Parse a kind:30618 repository refs event into RepoRefs. */
|
|
18
|
+
export function parseRepoRefs(event) {
|
|
19
|
+
if (event.kind !== 30618)
|
|
20
|
+
return null;
|
|
21
|
+
const dTag = getTagValue(event.tags, 'd');
|
|
22
|
+
if (!dTag)
|
|
23
|
+
return null;
|
|
24
|
+
const refs = new Map();
|
|
25
|
+
const arweaveMap = new Map();
|
|
26
|
+
for (const tag of event.tags) {
|
|
27
|
+
if (tag[0] === 'r' && tag[1] && tag[2]) {
|
|
28
|
+
if (refs.size >= MAX_REFS_PER_EVENT)
|
|
29
|
+
break;
|
|
30
|
+
refs.set(tag[1], tag[2]);
|
|
31
|
+
}
|
|
32
|
+
else if (tag[0] === 'arweave' && tag[1] && tag[2]) {
|
|
33
|
+
arweaveMap.set(tag[1], tag[2]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { repoId: dTag, refs, arweaveMap };
|
|
37
|
+
}
|
|
38
|
+
/** Parse a kind:30617 repository announcement event into RepoMetadata. */
|
|
39
|
+
export function parseRepoAnnouncement(event) {
|
|
40
|
+
if (event.kind !== 30617)
|
|
41
|
+
return null;
|
|
42
|
+
const dTag = getTagValue(event.tags, 'd');
|
|
43
|
+
if (!dTag)
|
|
44
|
+
return null;
|
|
45
|
+
const name = getTagValue(event.tags, 'name') ?? dTag;
|
|
46
|
+
const description = getTagValue(event.tags, 'description') ?? event.content;
|
|
47
|
+
const refTag = event.tags.find((t) => t[0] === 'r' && t[1] === 'HEAD' && t[2]);
|
|
48
|
+
const defaultBranch = refTag?.[2] ?? 'main';
|
|
49
|
+
const cloneUrls = getTagValues(event.tags, 'clone');
|
|
50
|
+
const webUrls = getTagValues(event.tags, 'web');
|
|
51
|
+
return {
|
|
52
|
+
repoId: dTag,
|
|
53
|
+
name,
|
|
54
|
+
description,
|
|
55
|
+
ownerPubkey: event.pubkey,
|
|
56
|
+
defaultBranch,
|
|
57
|
+
eventId: event.id,
|
|
58
|
+
cloneUrls,
|
|
59
|
+
webUrls,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Parse a kind:1621 issue event into IssueMetadata. */
|
|
63
|
+
export function parseIssue(event) {
|
|
64
|
+
if (event.kind !== 1621)
|
|
65
|
+
return null;
|
|
66
|
+
const subjectTag = getTagValue(event.tags, 'subject');
|
|
67
|
+
const title = subjectTag ?? event.content.split('\n')[0] ?? '';
|
|
68
|
+
const labels = getTagValues(event.tags, 't');
|
|
69
|
+
return {
|
|
70
|
+
eventId: event.id,
|
|
71
|
+
title,
|
|
72
|
+
content: event.content,
|
|
73
|
+
authorPubkey: event.pubkey,
|
|
74
|
+
createdAt: event.created_at,
|
|
75
|
+
labels,
|
|
76
|
+
status: 'open',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Parse a kind:1617 patch/PR event into PRMetadata. */
|
|
80
|
+
export function parsePR(event) {
|
|
81
|
+
if (event.kind !== 1617)
|
|
82
|
+
return null;
|
|
83
|
+
const title = getTagValue(event.tags, 'subject') ?? '';
|
|
84
|
+
const commitShas = getTagValues(event.tags, 'commit');
|
|
85
|
+
const baseBranch = getTagValue(event.tags, 'branch') ?? 'main';
|
|
86
|
+
return {
|
|
87
|
+
eventId: event.id,
|
|
88
|
+
title,
|
|
89
|
+
content: event.content,
|
|
90
|
+
authorPubkey: event.pubkey,
|
|
91
|
+
createdAt: event.created_at,
|
|
92
|
+
commitShas,
|
|
93
|
+
baseBranch,
|
|
94
|
+
status: 'open',
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** Parse a kind:1622 comment event into CommentMetadata. */
|
|
98
|
+
export function parseComment(event) {
|
|
99
|
+
if (event.kind !== 1622)
|
|
100
|
+
return null;
|
|
101
|
+
const parentEventId = getTagValue(event.tags, 'e');
|
|
102
|
+
if (!parentEventId)
|
|
103
|
+
return null;
|
|
104
|
+
return {
|
|
105
|
+
eventId: event.id,
|
|
106
|
+
content: event.content,
|
|
107
|
+
authorPubkey: event.pubkey,
|
|
108
|
+
createdAt: event.created_at,
|
|
109
|
+
parentEventId,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
/** Resolve the status of a PR from status events (kind:1630-1633). */
|
|
113
|
+
export function resolvePRStatus(prEventId, statusEvents) {
|
|
114
|
+
const KIND_STATUS_MAP = {
|
|
115
|
+
1630: 'open',
|
|
116
|
+
1631: 'applied',
|
|
117
|
+
1632: 'closed',
|
|
118
|
+
1633: 'draft',
|
|
119
|
+
};
|
|
120
|
+
const relevant = statusEvents.filter((evt) => {
|
|
121
|
+
const eTag = getTagValue(evt.tags, 'e');
|
|
122
|
+
return eTag === prEventId && evt.kind >= 1630 && evt.kind <= 1633;
|
|
123
|
+
});
|
|
124
|
+
if (relevant.length === 0)
|
|
125
|
+
return 'open';
|
|
126
|
+
let latest = relevant[0];
|
|
127
|
+
for (let i = 1; i < relevant.length; i++) {
|
|
128
|
+
const entry = relevant[i];
|
|
129
|
+
if (entry.created_at > latest.created_at)
|
|
130
|
+
latest = entry;
|
|
131
|
+
}
|
|
132
|
+
return KIND_STATUS_MAP[latest.kind] ?? 'open';
|
|
133
|
+
}
|
|
134
|
+
/** Resolve the status of an issue from close events (kind:1632). */
|
|
135
|
+
export function resolveIssueStatus(issueEventId, closeEvents) {
|
|
136
|
+
const isClosed = closeEvents.some((evt) => {
|
|
137
|
+
const eTag = getTagValue(evt.tags, 'e');
|
|
138
|
+
return eTag === issueEventId && evt.kind === 1632;
|
|
139
|
+
});
|
|
140
|
+
return isClosed ? 'closed' : 'open';
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=nip34.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nip34.js","sourceRoot":"","sources":["../../src/parsers/nip34.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core social-NIP parsers.
|
|
3
|
+
*
|
|
4
|
+
* NIP-01 kind:0 profile metadata → ProfileMetadata
|
|
5
|
+
* NIP-01 kind:1 text note → NoteMetadata (with NIP-10 thread refs)
|
|
6
|
+
* NIP-02 kind:3 follow list → FollowList
|
|
7
|
+
* NIP-25 kind:7 reaction → Reaction
|
|
8
|
+
* NIP-18 kind:6/16 repost → Repost
|
|
9
|
+
*/
|
|
10
|
+
import { type NostrEvent } from '../types.js';
|
|
11
|
+
/** Parsed profile (kind:0). Unknown JSON fields are preserved in `raw`. */
|
|
12
|
+
export interface ProfileMetadata {
|
|
13
|
+
pubkey: string;
|
|
14
|
+
name?: string;
|
|
15
|
+
displayName?: string;
|
|
16
|
+
about?: string;
|
|
17
|
+
picture?: string;
|
|
18
|
+
banner?: string;
|
|
19
|
+
nip05?: string;
|
|
20
|
+
lud16?: string;
|
|
21
|
+
website?: string;
|
|
22
|
+
raw: Record<string, unknown>;
|
|
23
|
+
}
|
|
24
|
+
/** Parse a kind:0 profile metadata event. Returns null on wrong kind / bad JSON. */
|
|
25
|
+
export declare function parseProfile(event: NostrEvent): ProfileMetadata | null;
|
|
26
|
+
/** NIP-10 thread references parsed from a note's `e`/`p` tags. */
|
|
27
|
+
export interface ThreadRefs {
|
|
28
|
+
/** Root event id of the thread, if any. */
|
|
29
|
+
rootId?: string;
|
|
30
|
+
/** Immediate parent event id this note replies to, if any. */
|
|
31
|
+
replyToId?: string;
|
|
32
|
+
/** Pubkeys referenced via `p` tags. */
|
|
33
|
+
mentionedPubkeys: string[];
|
|
34
|
+
}
|
|
35
|
+
/** Parsed text note (kind:1). */
|
|
36
|
+
export interface NoteMetadata {
|
|
37
|
+
eventId: string;
|
|
38
|
+
content: string;
|
|
39
|
+
authorPubkey: string;
|
|
40
|
+
createdAt: number;
|
|
41
|
+
thread: ThreadRefs;
|
|
42
|
+
/** True when the note is a reply (has a parent or root reference). */
|
|
43
|
+
isReply: boolean;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Resolve NIP-10 thread refs from `e` tags, preferring marked tags
|
|
47
|
+
* (`["e", id, relay, "root"|"reply"]`) and falling back to positional
|
|
48
|
+
* semantics (first = root, last = reply) for legacy notes.
|
|
49
|
+
*/
|
|
50
|
+
export declare function parseThreadRefs(tags: string[][]): ThreadRefs;
|
|
51
|
+
/** Parse a kind:1 text note. */
|
|
52
|
+
export declare function parseNote(event: NostrEvent): NoteMetadata | null;
|
|
53
|
+
/** Parsed follow list (kind:3, NIP-02). */
|
|
54
|
+
export interface FollowList {
|
|
55
|
+
pubkey: string;
|
|
56
|
+
follows: string[];
|
|
57
|
+
createdAt: number;
|
|
58
|
+
}
|
|
59
|
+
/** Parse a kind:3 follow list. */
|
|
60
|
+
export declare function parseFollowList(event: NostrEvent): FollowList | null;
|
|
61
|
+
/** Parsed reaction (kind:7, NIP-25). */
|
|
62
|
+
export interface Reaction {
|
|
63
|
+
eventId: string;
|
|
64
|
+
authorPubkey: string;
|
|
65
|
+
createdAt: number;
|
|
66
|
+
/** Reaction content: `+`, `-`, or an emoji/shortcode. */
|
|
67
|
+
content: string;
|
|
68
|
+
/** Event the reaction targets (last `e` tag per NIP-25). */
|
|
69
|
+
targetEventId?: string;
|
|
70
|
+
/** Author of the targeted event (last `p` tag). */
|
|
71
|
+
targetPubkey?: string;
|
|
72
|
+
}
|
|
73
|
+
/** Parse a kind:7 reaction. */
|
|
74
|
+
export declare function parseReaction(event: NostrEvent): Reaction | null;
|
|
75
|
+
/** Parsed repost (kind:6 or kind:16, NIP-18). */
|
|
76
|
+
export interface Repost {
|
|
77
|
+
eventId: string;
|
|
78
|
+
authorPubkey: string;
|
|
79
|
+
createdAt: number;
|
|
80
|
+
/** Reposted event id (`e` tag). */
|
|
81
|
+
repostedEventId?: string;
|
|
82
|
+
/** Author of the reposted event (`p` tag). */
|
|
83
|
+
repostedPubkey?: string;
|
|
84
|
+
/** For generic reposts (kind:16), the original kind from the `k` tag. */
|
|
85
|
+
repostedKind?: number;
|
|
86
|
+
}
|
|
87
|
+
/** Parse a kind:6 (repost) or kind:16 (generic repost). */
|
|
88
|
+
export declare function parseRepost(event: NostrEvent): Repost | null;
|
|
89
|
+
//# sourceMappingURL=social.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social.d.ts","sourceRoot":"","sources":["../../src/parsers/social.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,UAAU,EAA6B,MAAM,aAAa,CAAC;AAEzE,2EAA2E;AAC3E,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC9B;AAED,oFAAoF;AACpF,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,eAAe,GAAG,IAAI,CA2BtE;AAED,kEAAkE;AAClE,MAAM,WAAW,UAAU;IACzB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,iCAAiC;AACjC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,UAAU,CAAC;IACnB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,UAAU,CAuB5D;AAED,gCAAgC;AAChC,wBAAgB,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,GAAG,IAAI,CAYhE;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAOpE;AAED,wCAAwC;AACxC,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,+BAA+B;AAC/B,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAiBhE;AAED,iDAAiD;AACjD,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI,CAkB5D"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core social-NIP parsers.
|
|
3
|
+
*
|
|
4
|
+
* NIP-01 kind:0 profile metadata → ProfileMetadata
|
|
5
|
+
* NIP-01 kind:1 text note → NoteMetadata (with NIP-10 thread refs)
|
|
6
|
+
* NIP-02 kind:3 follow list → FollowList
|
|
7
|
+
* NIP-25 kind:7 reaction → Reaction
|
|
8
|
+
* NIP-18 kind:6/16 repost → Repost
|
|
9
|
+
*/
|
|
10
|
+
import { getTagValue, getTagValues } from '../types.js';
|
|
11
|
+
/** Parse a kind:0 profile metadata event. Returns null on wrong kind / bad JSON. */
|
|
12
|
+
export function parseProfile(event) {
|
|
13
|
+
if (event.kind !== 0)
|
|
14
|
+
return null;
|
|
15
|
+
let raw;
|
|
16
|
+
try {
|
|
17
|
+
const parsed = JSON.parse(event.content);
|
|
18
|
+
if (typeof parsed !== 'object' || parsed === null)
|
|
19
|
+
return null;
|
|
20
|
+
raw = parsed;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const str = (k) => typeof raw[k] === 'string' ? raw[k] : undefined;
|
|
26
|
+
return {
|
|
27
|
+
pubkey: event.pubkey,
|
|
28
|
+
name: str('name'),
|
|
29
|
+
displayName: str('display_name') ?? str('displayName'),
|
|
30
|
+
about: str('about'),
|
|
31
|
+
picture: str('picture'),
|
|
32
|
+
banner: str('banner'),
|
|
33
|
+
nip05: str('nip05'),
|
|
34
|
+
lud16: str('lud16'),
|
|
35
|
+
website: str('website'),
|
|
36
|
+
raw,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Resolve NIP-10 thread refs from `e` tags, preferring marked tags
|
|
41
|
+
* (`["e", id, relay, "root"|"reply"]`) and falling back to positional
|
|
42
|
+
* semantics (first = root, last = reply) for legacy notes.
|
|
43
|
+
*/
|
|
44
|
+
export function parseThreadRefs(tags) {
|
|
45
|
+
const eTags = tags.filter((t) => t[0] === 'e' && t[1]);
|
|
46
|
+
const mentionedPubkeys = getTagValues(tags, 'p');
|
|
47
|
+
let rootId;
|
|
48
|
+
let replyToId;
|
|
49
|
+
const marked = eTags.filter((t) => t[3] === 'root' || t[3] === 'reply');
|
|
50
|
+
if (marked.length > 0) {
|
|
51
|
+
rootId = marked.find((t) => t[3] === 'root')?.[1];
|
|
52
|
+
replyToId = marked.find((t) => t[3] === 'reply')?.[1] ?? rootId;
|
|
53
|
+
}
|
|
54
|
+
else if (eTags.length === 1) {
|
|
55
|
+
rootId = eTags[0]?.[1];
|
|
56
|
+
replyToId = rootId;
|
|
57
|
+
}
|
|
58
|
+
else if (eTags.length > 1) {
|
|
59
|
+
rootId = eTags[0]?.[1];
|
|
60
|
+
replyToId = eTags[eTags.length - 1]?.[1];
|
|
61
|
+
}
|
|
62
|
+
const refs = { mentionedPubkeys };
|
|
63
|
+
if (rootId !== undefined)
|
|
64
|
+
refs.rootId = rootId;
|
|
65
|
+
if (replyToId !== undefined)
|
|
66
|
+
refs.replyToId = replyToId;
|
|
67
|
+
return refs;
|
|
68
|
+
}
|
|
69
|
+
/** Parse a kind:1 text note. */
|
|
70
|
+
export function parseNote(event) {
|
|
71
|
+
if (event.kind !== 1)
|
|
72
|
+
return null;
|
|
73
|
+
const thread = parseThreadRefs(event.tags);
|
|
74
|
+
return {
|
|
75
|
+
eventId: event.id,
|
|
76
|
+
content: event.content,
|
|
77
|
+
authorPubkey: event.pubkey,
|
|
78
|
+
createdAt: event.created_at,
|
|
79
|
+
thread,
|
|
80
|
+
isReply: thread.rootId !== undefined || thread.replyToId !== undefined,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/** Parse a kind:3 follow list. */
|
|
84
|
+
export function parseFollowList(event) {
|
|
85
|
+
if (event.kind !== 3)
|
|
86
|
+
return null;
|
|
87
|
+
return {
|
|
88
|
+
pubkey: event.pubkey,
|
|
89
|
+
follows: getTagValues(event.tags, 'p'),
|
|
90
|
+
createdAt: event.created_at,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/** Parse a kind:7 reaction. */
|
|
94
|
+
export function parseReaction(event) {
|
|
95
|
+
if (event.kind !== 7)
|
|
96
|
+
return null;
|
|
97
|
+
const eTags = getTagValues(event.tags, 'e');
|
|
98
|
+
const pTags = getTagValues(event.tags, 'p');
|
|
99
|
+
const reaction = {
|
|
100
|
+
eventId: event.id,
|
|
101
|
+
authorPubkey: event.pubkey,
|
|
102
|
+
createdAt: event.created_at,
|
|
103
|
+
content: event.content || '+',
|
|
104
|
+
};
|
|
105
|
+
const targetEventId = eTags[eTags.length - 1];
|
|
106
|
+
const targetPubkey = pTags[pTags.length - 1];
|
|
107
|
+
if (targetEventId !== undefined)
|
|
108
|
+
reaction.targetEventId = targetEventId;
|
|
109
|
+
if (targetPubkey !== undefined)
|
|
110
|
+
reaction.targetPubkey = targetPubkey;
|
|
111
|
+
return reaction;
|
|
112
|
+
}
|
|
113
|
+
/** Parse a kind:6 (repost) or kind:16 (generic repost). */
|
|
114
|
+
export function parseRepost(event) {
|
|
115
|
+
if (event.kind !== 6 && event.kind !== 16)
|
|
116
|
+
return null;
|
|
117
|
+
const repost = {
|
|
118
|
+
eventId: event.id,
|
|
119
|
+
authorPubkey: event.pubkey,
|
|
120
|
+
createdAt: event.created_at,
|
|
121
|
+
};
|
|
122
|
+
const repostedEventId = getTagValue(event.tags, 'e');
|
|
123
|
+
const repostedPubkey = getTagValue(event.tags, 'p');
|
|
124
|
+
const kTag = getTagValue(event.tags, 'k');
|
|
125
|
+
if (repostedEventId !== undefined)
|
|
126
|
+
repost.repostedEventId = repostedEventId;
|
|
127
|
+
if (repostedPubkey !== undefined)
|
|
128
|
+
repost.repostedPubkey = repostedPubkey;
|
|
129
|
+
if (kTag !== undefined) {
|
|
130
|
+
const k = Number(kTag);
|
|
131
|
+
if (Number.isFinite(k))
|
|
132
|
+
repost.repostedKind = k;
|
|
133
|
+
}
|
|
134
|
+
return repost;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=social.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../src/parsers/social.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser shim for the Node builtins (`child_process`, `fs/promises`, `os`,
|
|
3
|
+
* `path`, `crypto`) that `@toon-protocol/core`'s root entry top-level-imports for
|
|
4
|
+
* its Node-only devnet `preset` helper. Aliased in by `vite.config.ts` for the
|
|
5
|
+
* MCP-app bundle only.
|
|
6
|
+
*
|
|
7
|
+
* The render trust gradient uses only core's PURE `ui` coordinate helpers; the
|
|
8
|
+
* devnet-preset code that needs these builtins is dead in the iframe. Vite's
|
|
9
|
+
* default `__vite-browser-external` stub does not export the *named* bindings
|
|
10
|
+
* core imports (`execFile`, `mkdtemp`, `tmpdir`, …), which fails the build at
|
|
11
|
+
* link time. This shim exports every name core references so the (dead) imports
|
|
12
|
+
* resolve; any actual call throws — none happens in the browser.
|
|
13
|
+
*/
|
|
14
|
+
export declare const execFile: () => never;
|
|
15
|
+
export declare const readFile: () => never;
|
|
16
|
+
export declare const writeFile: () => never;
|
|
17
|
+
export declare const mkdtemp: () => never;
|
|
18
|
+
export declare const cp: () => never;
|
|
19
|
+
export declare const rm: () => never;
|
|
20
|
+
export declare const tmpdir: () => never;
|
|
21
|
+
export declare const createHash: () => never;
|
|
22
|
+
declare const pathShim: {
|
|
23
|
+
join: () => never;
|
|
24
|
+
resolve: () => never;
|
|
25
|
+
dirname: () => never;
|
|
26
|
+
basename: () => never;
|
|
27
|
+
sep: string;
|
|
28
|
+
};
|
|
29
|
+
export default pathShim;
|
|
30
|
+
//# sourceMappingURL=node-builtins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-builtins.d.ts","sourceRoot":"","sources":["../../../src/render/node-shims/node-builtins.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH,eAAO,MAAM,QAAQ,QAAO,KAA8C,CAAC;AAG3E,eAAO,MAAM,QAAQ,QAAO,KAA4C,CAAC;AACzE,eAAO,MAAM,SAAS,QAAO,KAA6C,CAAC;AAC3E,eAAO,MAAM,OAAO,QAAO,KAA2C,CAAC;AACvE,eAAO,MAAM,EAAE,QAAO,KAAsC,CAAC;AAC7D,eAAO,MAAM,EAAE,QAAO,KAAsC,CAAC;AAG7D,eAAO,MAAM,MAAM,QAAO,KAAiC,CAAC;AAG5D,eAAO,MAAM,UAAU,QAAO,KAAyC,CAAC;AAGxE,QAAA,MAAM,QAAQ;gBACF,KAAK;mBACF,KAAK;mBACL,KAAK;oBACJ,KAAK;;CAEpB,CAAC;AAEF,eAAe,QAAQ,CAAC"}
|