@nanorail/sdk 0.1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NanoRail
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # @nanorail/sdk
2
+
3
+ The MPP-native metering SDK for priced digital units. Mark content with
4
+ `data-nanorail-*` attributes and NanoRail generates the agent-readable manifest, a
5
+ discovery API, policy-bounded unlocks, receipts, and Tempo settlement — for humans
6
+ and autonomous agents alike.
7
+
8
+ ## Install
9
+
10
+ ```bash
11
+ npm i @nanorail/sdk
12
+ ```
13
+
14
+ ## Use
15
+
16
+ ```ts
17
+ import { initNanoRail } from '@nanorail/sdk';
18
+
19
+ const nr = initNanoRail({
20
+ gatewayUrl: 'https://gateway.yoursite.com',
21
+ articleId: 'your-article-id',
22
+ autoUnlockOnScroll: true, // humans: meter eligible chunks open as they read
23
+ });
24
+ ```
25
+
26
+ Mark any element:
27
+
28
+ ```html
29
+ <p
30
+ data-nanorail-chunk="para-3"
31
+ data-nanorail-price="0.005"
32
+ data-nanorail-type="text"
33
+ data-nanorail-title="The micropayment thesis"
34
+ data-nanorail-teaser="Why metering beats blocking for machine readers."
35
+ data-nanorail-tags="MPP, micropayments, metering"
36
+ >
37
+ Premium content…
38
+ </p>
39
+ ```
40
+
41
+ ### Script tag (no bundler)
42
+
43
+ ```html
44
+ <script>
45
+ window.NANORAIL_CONFIG = { gatewayUrl: 'http://localhost:4020', articleId: 'your-article-id' };
46
+ </script>
47
+ <script src="https://cdn.yoursite.com/nanorail.js"></script>
48
+ ```
49
+
50
+ ## API
51
+
52
+ `initNanoRail(config)` returns an instance:
53
+
54
+ - `client` — `NanoRailClient`: sessions, policy, unlocks, receipts
55
+ - `manifest` — the auto-generated `ArticleManifest`
56
+ - `rescan()` — re-scan + lock any newly added chunks
57
+ - `runAgent(opts)` — discovery → plan → buy → summarize
58
+ - `unlockTempoSnippet()` — the real Tempo MPP settlement path
59
+
60
+ Policy is enforced both client-side (before signing) and server-side (independently).
61
+ Chunks that are over budget or of a blocked type stay gated. Unlocks emit lifecycle
62
+ events and receipts.
63
+
64
+ ## License
65
+
66
+ MIT
@@ -0,0 +1,488 @@
1
+ // Generated by dts-bundle-generator v9.5.1
2
+
3
+ export type ContentType = "text" | "chart" | "citation_pack" | "video";
4
+ export type Currency = "USD";
5
+ /** The visible MPP lifecycle labels. These exact strings are shown in the dashboard. */
6
+ export type LifecycleLabel = "discovery query" | "discovery match" | "session opened" | "chunk challenge issued" | "voucher signed" | "receipt returned" | "policy blocked" | "batch settled" | "Real Tempo MPP unlock";
7
+ /** Actor that drove a unlock/block — used for human-vs-agent breakdowns. */
8
+ export type Actor = "human" | "agent";
9
+ /** Agent-readable manifest entry for a single purchasable chunk. */
10
+ export interface ManifestChunk {
11
+ chunkId: string;
12
+ type: ContentType;
13
+ title: string;
14
+ price: string;
15
+ currency: Currency;
16
+ recipient: string;
17
+ /** Public teaser/preview shown before purchase (no gated content). */
18
+ teaser: string;
19
+ /** Topical tags the discovery layer searches over. */
20
+ tags: string[];
21
+ /** Concrete endpoints (paths) an agent calls to buy this exact chunk. */
22
+ endpoints: {
23
+ challenge: string;
24
+ unlock: string;
25
+ };
26
+ }
27
+ export interface ArticleManifest {
28
+ articleId: string;
29
+ publisherId: string;
30
+ title: string;
31
+ currency: Currency;
32
+ /** How this manifest was produced. */
33
+ source: "sdk-scan" | "gateway-default";
34
+ /** Epoch ms the manifest was generated (set by the SDK scan). */
35
+ generatedAt?: number;
36
+ /** Endpoint templates an agent can follow. */
37
+ endpoints: {
38
+ challenge: string;
39
+ unlock: string;
40
+ };
41
+ chunks: ManifestChunk[];
42
+ }
43
+ /** Client + server policy. Decimal-string money fields are the human-facing form. */
44
+ export interface Policy {
45
+ autoPayEnabled: boolean;
46
+ /** Max total spend per article (decimal string USD). */
47
+ maxSpendPerArticle: string;
48
+ /** Max spend on a single chunk (decimal string USD). */
49
+ maxSpendPerChunk: string;
50
+ allowedPublishers: string[];
51
+ allowedContentTypes: ContentType[];
52
+ blockedContentTypes: ContentType[];
53
+ /** Any chunk above this amount needs manual approval (decimal string USD). */
54
+ requireManualApprovalAbove: string;
55
+ /** Total budget for the whole session (decimal string USD). */
56
+ sessionBudget: string;
57
+ sessionExpiryMinutes: number;
58
+ }
59
+ /** A funded mock MPP session. */
60
+ export interface Session {
61
+ sessionId: string;
62
+ /** Hex Ed25519 public key of the session payer. */
63
+ payerPublicKey: string;
64
+ policy: Policy;
65
+ /** Funded budget in micro-USD. */
66
+ budgetMicros: number;
67
+ /** Amount already spent in micro-USD. */
68
+ spentMicros: number;
69
+ createdAt: number;
70
+ expiresAt: number;
71
+ }
72
+ export interface Receipt {
73
+ receiptId: string;
74
+ voucherId: string;
75
+ sessionId: string;
76
+ articleId: string;
77
+ publisherId: string;
78
+ chunkId: string;
79
+ chunkType: ContentType;
80
+ /** Decimal string USD. */
81
+ amount: string;
82
+ currency: Currency;
83
+ recipient: string;
84
+ createdAt: number;
85
+ }
86
+ /** Result of a policy evaluation. */
87
+ export interface PolicyDecision {
88
+ allowed: boolean;
89
+ /** Set when allowed but the amount exceeds requireManualApprovalAbove. */
90
+ requiresManualApproval: boolean;
91
+ /** Human-readable reason, present when blocked. */
92
+ reason?: string;
93
+ }
94
+ /**
95
+ * A discovery result. Carries only publicly-safe metadata + a relevance score —
96
+ * never the gated content. The Discovery Agent is a recommendation layer, not a
97
+ * source of truth (see README "Trust model").
98
+ */
99
+ export interface DiscoveryMatch {
100
+ chunkId: string;
101
+ title: string;
102
+ teaser: string;
103
+ tags: string[];
104
+ type: ContentType;
105
+ price: string;
106
+ currency: Currency;
107
+ /** Relevance score in [0, 1]. */
108
+ confidence: number;
109
+ /** Human-readable explanation of why it matched. */
110
+ reason: string;
111
+ }
112
+ export interface NanoRailEventDetail {
113
+ label: LifecycleLabel;
114
+ chunkId?: string;
115
+ chunkType?: ContentType;
116
+ amount?: string;
117
+ reason?: string;
118
+ detail?: string;
119
+ actor?: Actor;
120
+ receiptId?: string;
121
+ batchId?: string;
122
+ at: number;
123
+ }
124
+ /** Slugged event name for a lifecycle label, e.g. "voucher signed" -> "nanorail:voucher-signed". */
125
+ export declare function eventName(label: LifecycleLabel): string;
126
+ /**
127
+ * Tiny event bus. Dispatches two events per lifecycle step: a generic
128
+ * `nanorail:lifecycle` and a typed `nanorail:<slug>`. Both carry the exact
129
+ * lifecycle label string in their detail.
130
+ */
131
+ export declare class NanoRailEvents {
132
+ private target;
133
+ constructor(target: EventTarget);
134
+ emit(detail: Omit<NanoRailEventDetail, "at">): void;
135
+ on(label: LifecycleLabel | "lifecycle", handler: (e: NanoRailEventDetail) => void): () => void;
136
+ }
137
+ export interface ChunkDescriptor {
138
+ chunkId: string;
139
+ type: ContentType;
140
+ price: string;
141
+ publisherId: string;
142
+ articleId: string;
143
+ recipient: string;
144
+ title: string;
145
+ teaser?: string;
146
+ tags?: string[];
147
+ }
148
+ export interface NanoRailConfig {
149
+ gatewayUrl?: string;
150
+ policy?: Policy;
151
+ /** Default actor for unlocks driven by this client ('human' for the page). */
152
+ actor?: Actor;
153
+ /** Injectable for tests; defaults to globalThis.fetch. */
154
+ fetchImpl?: typeof fetch;
155
+ /** Event target; defaults to document, falling back to a fresh EventTarget. */
156
+ eventTarget?: EventTarget;
157
+ }
158
+ export interface UnlockOutcome {
159
+ ok: boolean;
160
+ content?: string;
161
+ title?: string;
162
+ receipt?: Receipt;
163
+ /** True when the purchase was blocked by policy (no voucher signed). */
164
+ blocked?: boolean;
165
+ /** True when allowed but manual approval is required and was not granted. */
166
+ needsApproval?: boolean;
167
+ reason?: string;
168
+ }
169
+ /** Outcome of the real Tempo MPP snippet unlock (separate from the mock flow). */
170
+ export interface TempoUnlockOutcome {
171
+ ok: boolean;
172
+ snippet?: string;
173
+ receipt?: Receipt;
174
+ /** On-chain (real) or simulated (offline) settlement reference. */
175
+ settlementRef?: string;
176
+ mode?: "real-network" | "offline-fallback";
177
+ /** Present when a real-network attempt failed and fell back to offline. */
178
+ error?: string;
179
+ /** Recipient address/handle the payment settled to. */
180
+ recipient?: string;
181
+ /** Tempo testnet explorer URL (recipient address page); real-network only. */
182
+ explorerUrl?: string;
183
+ reason?: string;
184
+ }
185
+ /**
186
+ * Framework-free NanoRail client. Owns the mock session keypair, opens/reuses a
187
+ * funded session, evaluates client-side policy before signing, signs vouchers,
188
+ * unlocks chunks, and emits the six lifecycle events. No DOM dependency, so it
189
+ * is unit-testable with an injected fetch.
190
+ */
191
+ export declare class NanoRailClient {
192
+ readonly events: NanoRailEvents;
193
+ private readonly gatewayUrl;
194
+ private readonly fetchImpl;
195
+ private readonly policy;
196
+ private readonly defaultActor;
197
+ private privateKeyHex?;
198
+ publicKeyHex?: string;
199
+ session?: Session;
200
+ spentMicros: number;
201
+ receipts: Receipt[];
202
+ blocked: Array<{
203
+ chunkId: string;
204
+ reason: string;
205
+ at: number;
206
+ }>;
207
+ /** Chunk ids the user has manually approved (for amounts above the threshold). */
208
+ approvals: Set<string>;
209
+ private sessionPromise?;
210
+ private settlementWatch?;
211
+ private lastBatchCount;
212
+ constructor(config?: NanoRailConfig);
213
+ getPolicy(): Policy;
214
+ /** Fetch the agent-readable manifest for an article. */
215
+ getManifest(articleId: string): Promise<ArticleManifest>;
216
+ /**
217
+ * Ask the publisher's discovery endpoint "what paid content is about X?".
218
+ * Returns ranked, publicly-safe matches (no gated content). This is a
219
+ * recommendation layer — the publisher is as trustworthy as the matches.
220
+ */
221
+ discover(articleId: string, query: string, actor?: Actor): Promise<DiscoveryMatch[]>;
222
+ /** Register an SDK-generated manifest so agents can discover this article. */
223
+ registerManifest(manifest: ArticleManifest): Promise<{
224
+ ok: boolean;
225
+ chunks?: number;
226
+ }>;
227
+ /** Open a funded session once; concurrent callers share the same promise. */
228
+ ensureSession(): Promise<Session>;
229
+ private openSession;
230
+ /** Pure client-side policy check using locally-tracked spend. */
231
+ evaluate(chunk: ChunkDescriptor): PolicyDecision;
232
+ /**
233
+ * Full unlock flow for one chunk:
234
+ * 1. evaluate client policy — if blocked, record + emit `policy blocked`, never sign.
235
+ * 2. if manual approval needed and not granted, return needsApproval.
236
+ * 3. request challenge, sign voucher, POST unlock.
237
+ * 4. on success record receipt + reveal content.
238
+ */
239
+ unlock(chunk: ChunkDescriptor, opts?: {
240
+ actor?: Actor;
241
+ approved?: boolean;
242
+ viaDiscovery?: boolean;
243
+ }): Promise<UnlockOutcome>;
244
+ private requestChallenge;
245
+ /** Record a client-side policy block (no voucher signed) and emit the event. */
246
+ recordClientBlock(chunk: ChunkDescriptor, reason: string, actor?: Actor): Promise<void>;
247
+ /** Trigger the server-side forced-rejection demo path for a chunk. */
248
+ forceServerRejection(chunk: ChunkDescriptor, actor?: Actor): Promise<{
249
+ rejected: boolean;
250
+ reason?: string;
251
+ }>;
252
+ /**
253
+ * Unlock the premium snippet via the REAL Tempo MPP path (HTTP 402 → payment →
254
+ * receipt). This is settled by the gateway's PaymentProvider (real Tempo testnet
255
+ * when configured, offline fallback otherwise) and is intentionally separate from
256
+ * the mock Ed25519 voucher flow. Emits a `Real Tempo MPP unlock` event on success.
257
+ */
258
+ unlockTempoSnippet(): Promise<TempoUnlockOutcome>;
259
+ /** Poll settlements so the widget timeline shows `batch settled` events. */
260
+ startSettlementWatch(intervalMs?: number): void;
261
+ stopSettlementWatch(): void;
262
+ /** Snapshot of state for the widget. */
263
+ snapshot(): {
264
+ sessionId: string | undefined;
265
+ publicKey: string | undefined;
266
+ policy: Policy;
267
+ budget: string;
268
+ spent: number;
269
+ receipts: Receipt[];
270
+ blocked: {
271
+ chunkId: string;
272
+ reason: string;
273
+ at: number;
274
+ }[];
275
+ approvalsPending: string;
276
+ };
277
+ }
278
+ /** Read a chunk descriptor from a `[data-nanorail-price]` element. */
279
+ export declare function readChunk(el: HTMLElement): ChunkDescriptor;
280
+ /**
281
+ * Pure gate for scroll auto-unlock: a chunk unlocks itself as the reader reaches
282
+ * it only when policy ALLOWS it AND it does not require manual approval. Pricier
283
+ * / approval-gated / blocked chunks always keep their explicit button — so the
284
+ * policy is proven live, not hidden. Unit-tested directly (no DOM/observer).
285
+ */
286
+ export declare function shouldAutoUnlock(decision: PolicyDecision): boolean;
287
+ export interface ScanOptions {
288
+ /** Auto-unlock policy-eligible chunks as they scroll into view. Default false. */
289
+ autoUnlock?: boolean;
290
+ }
291
+ /**
292
+ * Find every `[data-nanorail-price]` element, lock it, and render an unlock
293
+ * control. Returns the list of locked elements (useful for tests). With
294
+ * `{ autoUnlock: true }`, policy-eligible chunks unlock themselves on scroll.
295
+ */
296
+ export declare function scanAndLock(client: NanoRailClient, root?: ParentNode, opts?: ScanOptions): HTMLElement[];
297
+ export interface GenerateManifestOptions {
298
+ /** DOM subtree to scan; defaults to the whole document. */
299
+ root?: ParentNode;
300
+ /** Override the article id (else derived from the chunks' attributes). */
301
+ articleId?: string;
302
+ /** Override the publisher id (else derived from the chunks' attributes). */
303
+ publisherId?: string;
304
+ /** Override the article title (else taken from <h1> or document.title). */
305
+ title?: string;
306
+ }
307
+ /**
308
+ * Build a machine-readable manifest purely from the publisher's
309
+ * `data-nanorail-*` attributes — no separately-maintained manifest file. The
310
+ * publisher marks content; this derives article metadata, chunk ids/types/prices,
311
+ * teasers, and per-chunk unlock endpoints automatically.
312
+ */
313
+ export declare function generateManifest(opts?: GenerateManifestOptions): ArticleManifest;
314
+ /**
315
+ * The NanoRail **Agent Wallet** — the user-facing control layer for what an agent
316
+ * is allowed to spend money on. Budget, permissions, and purchase rules are the
317
+ * primary UI; the raw MPP protocol lifecycle is tucked into a collapsed
318
+ * "Technical details" section for judges who want to see the wire-level flow.
319
+ */
320
+ export declare class NanoRailWidget {
321
+ private client;
322
+ private root;
323
+ /** Human-readable recent purchases / blocks. */
324
+ private activity;
325
+ /** Raw protocol events for the Technical details drawer. */
326
+ private tech;
327
+ private collapsed;
328
+ private showTech;
329
+ constructor(client: NanoRailClient);
330
+ toggle(): void;
331
+ render(): void;
332
+ }
333
+ export interface AgentStep {
334
+ chunkId: string;
335
+ type: string;
336
+ decision: "bought" | "skipped" | "blocked";
337
+ reason?: string;
338
+ receiptId?: string;
339
+ /** The unlocked content, when bought. */
340
+ content?: string;
341
+ }
342
+ /** The agent's up-front decision for one manifest chunk, shown before execution. */
343
+ export interface AgentPlanItem {
344
+ chunkId: string;
345
+ type: ContentType;
346
+ title: string;
347
+ price: string;
348
+ action: "buy" | "skip" | "block";
349
+ reason: string;
350
+ /** Discovery confidence that informed the decision, when available. */
351
+ confidence?: number;
352
+ }
353
+ /** One purchased source in the final answer (title + price + receipt). */
354
+ export interface AgentPurchase {
355
+ chunkId: string;
356
+ title: string;
357
+ type: ContentType;
358
+ price: string;
359
+ receiptId: string;
360
+ }
361
+ export interface AgentResult {
362
+ task: string;
363
+ query: string;
364
+ matches: DiscoveryMatch[];
365
+ plan: AgentPlanItem[];
366
+ steps: AgentStep[];
367
+ receiptIds: string[];
368
+ /** Sources the agent actually bought (for the final answer). */
369
+ purchased: AgentPurchase[];
370
+ /** Total spent across all purchases, decimal USD string. */
371
+ totalCost: string;
372
+ summary: string;
373
+ }
374
+ /** Staged progress emitted while the agent works, so a UI can render it live. */
375
+ export type AgentProgress = {
376
+ phase: "task";
377
+ task: string;
378
+ query: string;
379
+ } | {
380
+ phase: "discovery";
381
+ query: string;
382
+ matches: DiscoveryMatch[];
383
+ } | {
384
+ phase: "plan";
385
+ plan: AgentPlanItem[];
386
+ } | {
387
+ phase: "chunk-start";
388
+ item: AgentPlanItem;
389
+ } | {
390
+ phase: "bought";
391
+ chunkId: string;
392
+ receiptId: string;
393
+ content?: string;
394
+ } | {
395
+ phase: "blocked";
396
+ chunkId: string;
397
+ reason: string;
398
+ } | {
399
+ phase: "skipped";
400
+ chunkId: string;
401
+ reason: string;
402
+ } | {
403
+ phase: "done";
404
+ result: AgentResult;
405
+ };
406
+ export interface AgentOptions {
407
+ /** Task description shown to the user (default: an MPP summary task). */
408
+ task?: string;
409
+ /** Discovery query sent to the publisher (default: derived from the task). */
410
+ query?: string;
411
+ /** Called at each stage so the demo can render the flow step by step. */
412
+ onProgress?: (p: AgentProgress) => void;
413
+ /** Pause between steps (ms) so judges can watch the lifecycle stream. */
414
+ stepDelayMs?: number;
415
+ }
416
+ /**
417
+ * Simulates an autonomous agent that **discovers before it buys** — so it never
418
+ * pays blindly:
419
+ *
420
+ * 1. POST /discover → ranked, publicly-safe matches
421
+ * 2. build a plan from the matches + policy → buy what discovery surfaced and
422
+ * policy allows; skip the rest;
423
+ * block disallowed types (video)
424
+ * 3. per bought chunk: challenge → voucher → unlock (same MPP flow a human uses)
425
+ * 4. emit a summary with receipt IDs
426
+ *
427
+ * Discovery results are treated as a recommendation, not as truth — the agent
428
+ * still applies its own policy before signing any voucher.
429
+ */
430
+ export declare function runAgentSummary(client: NanoRailClient, articleId?: string, opts?: AgentOptions): Promise<AgentResult>;
431
+ /** Example tasks shown in the console; each maps to a discovery query. */
432
+ export interface AgentTask {
433
+ label: string;
434
+ query: string;
435
+ }
436
+ export declare const DEFAULT_AGENT_TASKS: AgentTask[];
437
+ export interface AgentConsoleOptions {
438
+ tasks?: AgentTask[];
439
+ /** Pause between agent steps (ms) so the economic decisions are watchable. */
440
+ stepDelayMs?: number;
441
+ }
442
+ /**
443
+ * Mount the Agent Console: injects a launcher button + a modal. Returns an object
444
+ * with `open()`/`close()`. Safe to call once per page.
445
+ */
446
+ export declare function mountAgentConsole(instance: NanoRailInstance, opts?: AgentConsoleOptions): {
447
+ open: () => void;
448
+ close: () => void;
449
+ };
450
+ export interface InitNanoRailConfig {
451
+ gatewayUrl?: string;
452
+ articleId?: string;
453
+ /** Scan + lock [data-nanorail-price] chunks on init (default true). */
454
+ autoScan?: boolean;
455
+ /** Mount the floating widget (default true). */
456
+ mountWidget?: boolean;
457
+ /**
458
+ * Auto-unlock policy-eligible chunks as the reader scrolls to them (default
459
+ * false). Approval-gated and blocked chunks always keep their button.
460
+ */
461
+ autoUnlockOnScroll?: boolean;
462
+ /** Mount the first-class Agent Mode console (launcher + modal). Default false. */
463
+ agentConsole?: boolean;
464
+ /** Override the example tasks shown in the Agent Console. */
465
+ agentTasks?: AgentTask[];
466
+ actor?: Actor;
467
+ }
468
+ export interface NanoRailInstance {
469
+ client: NanoRailClient;
470
+ widget?: NanoRailWidget;
471
+ manifest: ArticleManifest;
472
+ rescan: () => void;
473
+ regenerateManifest: () => Promise<ArticleManifest>;
474
+ runAgent: (opts?: AgentOptions) => Promise<AgentResult>;
475
+ forceVideoRejection: () => Promise<{
476
+ rejected: boolean;
477
+ reason?: string;
478
+ }>;
479
+ unlockTempoSnippet: () => Promise<TempoUnlockOutcome>;
480
+ /** Open the Agent Mode console (present when `agentConsole` is enabled). */
481
+ openAgentConsole?: () => void;
482
+ }
483
+ /** Create and mount a NanoRail instance on the current page. */
484
+ export declare function initNanoRail(config?: InitNanoRailConfig): NanoRailInstance;
485
+ /** Turn a chunk content string into HTML for insertion into the page. */
486
+ export declare function renderContent(content: string): string;
487
+
488
+ export {};