typebulb 0.24.3 → 0.26.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.
- package/README.md +32 -27
- package/dist/agents/claude/client.js +343 -273
- package/dist/agents/claude/styles.css +79 -11
- package/dist/agents/pi/client.js +319 -249
- package/dist/agents/pi/matchu-patchu.ts +1 -1
- package/dist/agents/pi/styles.css +79 -11
- package/dist/ai/index.d.ts +1 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/inference.d.ts +40 -0
- package/dist/ai/inference.d.ts.map +1 -0
- package/dist/ai/inference.js +301 -0
- package/dist/ai/inference.js.map +1 -0
- package/dist/ai/providers/gemini.d.ts +11 -1
- package/dist/ai/providers/gemini.d.ts.map +1 -1
- package/dist/ai/providers/gemini.js +24 -16
- package/dist/ai/providers/gemini.js.map +1 -1
- package/dist/format/config.d.ts +5 -0
- package/dist/format/config.d.ts.map +1 -1
- package/dist/format/config.js +20 -0
- package/dist/format/config.js.map +1 -1
- package/dist/format/parse.d.ts +3 -0
- package/dist/format/parse.d.ts.map +1 -1
- package/dist/format/parse.js +7 -3
- package/dist/format/parse.js.map +1 -1
- package/dist/format/serialize.d.ts +8 -0
- package/dist/format/serialize.d.ts.map +1 -1
- package/dist/format/serialize.js +42 -7
- package/dist/format/serialize.js.map +1 -1
- package/dist/index.js +626 -228
- package/dist/render.js +151 -86
- package/dist/servers.js +101 -101
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ export class GeminiProvider extends AIProvider {
|
|
|
5
5
|
this.providerName = 'Gemini';
|
|
6
6
|
this.defaultBaseUrl = 'https://generativelanguage.googleapis.com';
|
|
7
7
|
this.path = '/v1beta/models';
|
|
8
|
+
this.budgetMap = { 0: 0, 1: 1024, 2: 8192, 3: -1 };
|
|
8
9
|
}
|
|
9
10
|
// ── Request building ─────────────────────────────────────────────
|
|
10
11
|
getPath(model, stream) {
|
|
@@ -18,7 +19,7 @@ export class GeminiProvider extends AIProvider {
|
|
|
18
19
|
'x-goog-api-key': apiKey
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
|
-
buildPayload(messages,
|
|
22
|
+
buildPayload(messages, model, opts, _stream) {
|
|
22
23
|
const { system, conversationMessages } = this.extractSystemMessages(messages, '\n');
|
|
23
24
|
const contents = conversationMessages.map(m => ({
|
|
24
25
|
role: m.role === 'assistant' ? 'model' : 'user',
|
|
@@ -35,24 +36,19 @@ export class GeminiProvider extends AIProvider {
|
|
|
35
36
|
parts: [{ text: system }]
|
|
36
37
|
};
|
|
37
38
|
}
|
|
38
|
-
// Map the 1-3 reasoning dial to a thinking budget so the effort selector actually controls depth
|
|
39
|
-
// — mirroring how the OpenRouter path honors `effort` per level (native previously hardcoded
|
|
40
|
-
// `thinkingBudget: -1`, always thinking maximally and ignoring the dial, which made native Gemini
|
|
41
|
-
// look like it "always reasons" while OpenRouter respected the dial). `low` gets a small budget
|
|
42
|
-
// (often below the summary threshold → blank, matching OpenRouter's `effort:'low'`); `high` uses
|
|
43
|
-
// `-1` (dynamic, always in-range, no per-model max risk). `includeThoughts` streams thought
|
|
44
|
-
// summaries as `thought` parts, which the parser maps to AiChunk `{ kind: "reasoning" }`.
|
|
45
39
|
const effort = opts?.effort;
|
|
46
40
|
if (effort !== undefined) {
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
|
|
41
|
+
// Generation-gated like anthropic.ts: 3.x+ takes Google's semantic `thinkingLevel`; 2.5-era
|
|
42
|
+
// and unrecognized aliases stay on numeric budgets (2.5's native dial, and the safe fallback —
|
|
43
|
+
// Google back-compat remaps budgets on 3.x). Low's small budget often streams blank reasoning
|
|
44
|
+
// (intended); `includeThoughts` streams thought summaries as `thought` parts (parser maps
|
|
45
|
+
// them to reasoning), and at effort 0 there is nothing to stream, so it's dropped.
|
|
46
|
+
const version = this.geminiVersion(model);
|
|
47
|
+
const dial = version !== null && version >= 3
|
|
48
|
+
? { thinkingLevel: this.thinkingLevelFor(version, effort) }
|
|
49
|
+
: { thinkingBudget: this.budgetMap[effort] };
|
|
52
50
|
payload.generationConfig = {
|
|
53
|
-
thinkingConfig:
|
|
54
|
-
? { thinkingBudget: 0 }
|
|
55
|
-
: { includeThoughts: true, thinkingBudget },
|
|
51
|
+
thinkingConfig: effort === 0 ? dial : { includeThoughts: true, ...dial },
|
|
56
52
|
};
|
|
57
53
|
}
|
|
58
54
|
return payload;
|
|
@@ -110,6 +106,18 @@ export class GeminiProvider extends AIProvider {
|
|
|
110
106
|
return (piece.text || piece.reasoning) ? piece : null;
|
|
111
107
|
}
|
|
112
108
|
// ── Private helpers ──────────────────────────────────────────────
|
|
109
|
+
/** Major.minor from a versioned model name (`gemini-3.5-flash` → 3.5); null for aliases. */
|
|
110
|
+
geminiVersion(model) {
|
|
111
|
+
const m = model.match(/^gemini-(\d+(?:\.\d+)?)/);
|
|
112
|
+
return m ? Number(m[1]) : null;
|
|
113
|
+
}
|
|
114
|
+
/** Dial → level, clamped to the family's supported enum: `minimal` is 3.5+; earlier 3.x floors at
|
|
115
|
+
* `low`. (gemini-3-pro-preview's low|high-only enum would need a wider clamp, but Google retired
|
|
116
|
+
* the model — 404 verified 2026-07-15.) */
|
|
117
|
+
thinkingLevelFor(version, effort) {
|
|
118
|
+
const level = ['minimal', 'low', 'medium', 'high'][effort];
|
|
119
|
+
return level === 'minimal' && version < 3.5 ? 'low' : level;
|
|
120
|
+
}
|
|
113
121
|
isGeminiResponse(json) {
|
|
114
122
|
return (typeof json === 'object' &&
|
|
115
123
|
json !== null &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAwB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../../ai/src/providers/gemini.ts"],"names":[],"mappings":"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"}
|
package/dist/format/config.d.ts
CHANGED
|
@@ -14,4 +14,9 @@ export interface BulbConfig {
|
|
|
14
14
|
}
|
|
15
15
|
/** Parse the `config.json` block, returning {} for empty or malformed JSON. */
|
|
16
16
|
export declare function parseConfig(config: string): BulbConfig;
|
|
17
|
+
/** Strip inline markdown (links, emphasis, code, headings) for plain-text contexts like meta descriptions. */
|
|
18
|
+
export declare function stripMarkdown(text: string): string;
|
|
19
|
+
/** Plain-text description from a `config.json` string: markdown stripped, single line, ≤200 chars.
|
|
20
|
+
* Logic duplicated in client/_worker.js (edge runtime, no build step). */
|
|
21
|
+
export declare function extractDescription(config: string | undefined): string;
|
|
17
22
|
//# sourceMappingURL=config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOtD"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOtD;AAID,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;0EAC0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMrE"}
|
package/dist/format/config.js
CHANGED
|
@@ -10,4 +10,24 @@ export function parseConfig(config) {
|
|
|
10
10
|
return {};
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
const DEFAULT_DESCRIPTION = 'A Typebulb bulb.';
|
|
14
|
+
/** Strip inline markdown (links, emphasis, code, headings) for plain-text contexts like meta descriptions. */
|
|
15
|
+
export function stripMarkdown(text) {
|
|
16
|
+
return text
|
|
17
|
+
.replace(/\[([^\]]*)\]\([^)]*\)/g, '$1')
|
|
18
|
+
.replace(/\*\*([^*]+)\*\*/g, '$1')
|
|
19
|
+
.replace(/\*([^*]+)\*/g, '$1')
|
|
20
|
+
.replace(/`([^`]+)`/g, '$1')
|
|
21
|
+
.replace(/^#{1,6}\s+/gm, '');
|
|
22
|
+
}
|
|
23
|
+
/** Plain-text description from a `config.json` string: markdown stripped, single line, ≤200 chars.
|
|
24
|
+
* Logic duplicated in client/_worker.js (edge runtime, no build step). */
|
|
25
|
+
export function extractDescription(config) {
|
|
26
|
+
const desc = parseConfig(config ?? '').description?.trim();
|
|
27
|
+
if (!desc)
|
|
28
|
+
return DEFAULT_DESCRIPTION;
|
|
29
|
+
const stripped = stripMarkdown(desc);
|
|
30
|
+
const truncated = stripped.length > 200 ? stripped.slice(0, 197) + '...' : stripped;
|
|
31
|
+
return truncated.replace(/\n/g, ' ');
|
|
32
|
+
}
|
|
13
33
|
//# sourceMappingURL=config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAe/F,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAe/F,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAE9C,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC;SACvC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAChC,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,mBAAmB,CAAA;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnF,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC"}
|
package/dist/format/parse.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
/** Parse a `.bulb.md` file: strict Markdown bundle with YAML frontmatter and `**filename**` blocks. */
|
|
2
2
|
import { type SubscriptKind } from './registry.js';
|
|
3
|
+
export declare const FENCE_OPEN_RE: RegExp;
|
|
4
|
+
/** The closing-fence test for a given opening fence (the fence chars alone, trailing whitespace ok). */
|
|
5
|
+
export declare const fenceCloseRe: (fence: string) => RegExp;
|
|
3
6
|
export interface BulbFrontmatter {
|
|
4
7
|
format: string;
|
|
5
8
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,eAAe,CAAA;AAOtF,eAAO,MAAM,aAAa,QAAsB,CAAA;AAGhD,wGAAwG;AACxG,eAAO,MAAM,YAAY,GAAI,OAAO,MAAM,KAAG,MAAsC,CAAA;AAEnF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,eAAe,CAAA;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC1B,iGAAiG;IACjG,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,mDAAmD;AACnD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEvE,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAqE5D;AA6CD;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAE/D;AAED;;sGAEsG;AACtG,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,CAkBjE;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAKvD"}
|
package/dist/format/parse.js
CHANGED
|
@@ -2,10 +2,13 @@
|
|
|
2
2
|
import { blocks, orderedKinds, isBulbFormat } from './registry.js';
|
|
3
3
|
import { unescapeYamlString } from './yaml.js';
|
|
4
4
|
// The block grammar: a `**filename**` header on its own line, then a fenced code block (3+ backticks,
|
|
5
|
-
// optional language).
|
|
5
|
+
// optional language). Exported so the surgical writer (serialize.ts replaceBulbBlock) shares this
|
|
6
|
+
// grammar rather than restating it — parse and replace must never disagree about what a fence is.
|
|
6
7
|
const BLOCK_HEADER_RE = /^\*\*(.+)\*\*$/;
|
|
7
|
-
const FENCE_OPEN_RE = /^(`{3,})(\w*)\s*$/;
|
|
8
|
+
export const FENCE_OPEN_RE = /^(`{3,})(\w*)\s*$/;
|
|
8
9
|
const BLOCK_PATHS = new Set(orderedKinds.map(k => blocks[k].path));
|
|
10
|
+
/** The closing-fence test for a given opening fence (the fence chars alone, trailing whitespace ok). */
|
|
11
|
+
export const fenceCloseRe = (fence) => new RegExp(`^${fence}\\s*$`);
|
|
9
12
|
/** Parse a `.bulb.md` file into frontmatter and file contents, or null if malformed. */
|
|
10
13
|
export function parseBulb(content) {
|
|
11
14
|
try {
|
|
@@ -53,7 +56,8 @@ export function parseBulb(content) {
|
|
|
53
56
|
const fence = fenceMatch[1];
|
|
54
57
|
i++;
|
|
55
58
|
const contentLines = [];
|
|
56
|
-
|
|
59
|
+
const closeRe = fenceCloseRe(fence);
|
|
60
|
+
while (i < lines.length && !lines[i]?.match(closeRe)) {
|
|
57
61
|
contentLines.push(lines[i]);
|
|
58
62
|
i++;
|
|
59
63
|
}
|
package/dist/format/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAsB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,sGAAsG;AACtG,
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAsB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACtF,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAE9C,sGAAsG;AACtG,kGAAkG;AAClG,kGAAkG;AAClG,MAAM,eAAe,GAAG,gBAAgB,CAAA;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG,mBAAmB,CAAA;AAChD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAS,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAE1E,wGAAwG;AACxG,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,CAAA;AA0BnF,wFAAwF;AACxF,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACjC,IAAI,CAAC,GAAG,CAAC,CAAA;QAET,oBAAoB;QACpB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;QAC3C,CAAC,EAAE,CAAA;QAEH,MAAM,gBAAgB,GAAa,EAAE,CAAA;QACrC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YACtD,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC/B,CAAC,EAAE,CAAA;QACL,CAAC;QACD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;QAC3C,CAAC,EAAE,CAAA;QAEH,MAAM,WAAW,GAAG,gBAAgB,CAAC,gBAAgB,CAAC,CAAA;QACtD,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QAE7B,sBAAsB;QACtB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;QACvC,MAAM,QAAQ,GAAa,EAAE,CAAA;QAC7B,kGAAkG;QAClG,uEAAuE;QACvE,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAA;YAE7B,gEAAgE;YAChE,MAAM,SAAS,GAAG,IAAI,EAAE,KAAK,CAAC,eAAe,CAAC,CAAA;YAC9C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBACpC,CAAC,EAAE,CAAA;gBAEH,+BAA+B;gBAC/B,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;oBAAE,CAAC,EAAE,CAAA;gBAEvD,kFAAkF;gBAClF,gFAAgF;gBAChF,qFAAqF;gBACrF,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;gBACjD,IAAI,CAAC,UAAU,EAAE,CAAC;oBAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,QAAQ,sCAAsC,CAAC,CAAC;oBAAC,SAAQ;gBAAC,CAAC;gBAEjG,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;gBAC3B,CAAC,EAAE,CAAA;gBAEH,MAAM,YAAY,GAAa,EAAE,CAAA;gBACjC,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAA;gBACnC,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACrD,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;oBAC3B,CAAC,EAAE,CAAA;gBACL,CAAC;gBACD,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,MAAM,CAAA;gBACnC,CAAC,EAAE,CAAA,CAAC,sCAAsC;gBAE1C,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC,CAAA;gBACnE,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;gBAC5C,WAAW,GAAG,CAAC,CAAA;YACjB,CAAC;iBAAM,CAAC;gBACN,CAAC,EAAE,CAAA;YACL,CAAC;QACH,CAAC;QAED,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,wGAAwG;AACxG,qGAAqG;AACrG,uGAAuG;AACvG,uFAAuF;AACvF,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAc,EAAE,UAAmB;IAC1E,MAAM,SAAS,GAAa,EAAE,CAAA;IAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;QAChD,IAAI,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,SAAS,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,QAAQ,gEAAgE,EAAE,WAAW,CAAC,CAAA;IAC5I,IAAI,CAAC,UAAU;QAAE,OAAO,CAAC,KAAK,QAAQ,2EAA2E,CAAC,CAAA;IAClH,OAAO,EAAE,CAAA;AACX,CAAC;AAED,qGAAqG;AACrG,+EAA+E;AAC/E,SAAS,YAAY,CAAC,IAAc,EAAE,SAAiB;IACrD,IAAI,CAAC,GAAG,SAAS,GAAG,CAAC,CAAA;IACrB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE;QAAE,CAAC,EAAE,CAAA;IACrD,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,CAAA;AACxC,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAe;IACvC,MAAM,EAAE,GAA6B,EAAE,CAAA;IAEvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAQ;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAE7C,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,QAAQ;gBAAE,EAAE,CAAC,MAAM,GAAG,KAAK,CAAC;gBAAC,MAAK;YACvC,KAAK,MAAM;gBAAE,EAAE,CAAC,IAAI,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;gBAAC,MAAK;QACzD,CAAC;IACH,CAAC;IAED,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI;QAAE,OAAO,IAAI,CAAA;IACrD,OAAO,EAAqB,CAAA;AAC9B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,SAAS,CAAC,OAAO,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAA;AAC3C,CAAC;AAWD;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,KAAK,GAAmB,EAAE,CAAA;IAChC,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,CAAC;YAAC,CAAC,EAAE,CAAC;YAAC,SAAQ;QAAC,CAAC;QACjD,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QACnD,kGAAkG;QAClG,qFAAqF;QACrF,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,WAAW,CAAA;YAClC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;YACrE,CAAC,GAAG,GAAG,CAAA;QACT,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,CAAA;QACL,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,MAAkB;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAC9B,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAC3C,CAAA;IAClC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAA;AACpD,CAAC"}
|
|
@@ -5,4 +5,12 @@ export type BulbSource = {
|
|
|
5
5
|
} & Partial<Record<SubscriptKind, string | null>>;
|
|
6
6
|
/** Serialize a bulb to `.bulb.md` text: YAML frontmatter then one `**filename**` block per present kind. */
|
|
7
7
|
export declare function serializeBulb(source: BulbSource): string;
|
|
8
|
+
/**
|
|
9
|
+
* Replace one block's fence content in existing `.bulb.md` text, surgically — everything else
|
|
10
|
+
* (frontmatter beyond format/name, inter-block prose, block order) is preserved verbatim, which a
|
|
11
|
+
* parse→serialize round trip would lose. Appends the block at the end when absent. The fence grows
|
|
12
|
+
* if the new content carries a longer backtick run; an unterminated block is left untouched (the
|
|
13
|
+
* same defect parseBulb only warns on — rewriting inside it would guess at its extent).
|
|
14
|
+
*/
|
|
15
|
+
export declare function replaceBulbBlock(content: string, kind: SubscriptKind, newContent: string): string;
|
|
8
16
|
//# sourceMappingURL=serialize.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,KAAK,aAAa,EAAqC,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAE,KAAK,aAAa,EAAqC,MAAM,eAAe,CAAA;AAWrF,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAAA;AAUzF,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAaxD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAoBjG"}
|
package/dist/format/serialize.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/** Serialize a bulb's blocks back into `.bulb.md` text. */
|
|
2
2
|
import { blocks, orderedKinds, BULB_FORMAT } from './registry.js';
|
|
3
|
+
import { FENCE_OPEN_RE, fenceCloseRe } from './parse.js';
|
|
3
4
|
import { escapeYamlString } from './yaml.js';
|
|
4
5
|
/** A fence long enough not to collide with any run of backticks already in the content. */
|
|
5
6
|
function getFence(content) {
|
|
@@ -7,17 +8,18 @@ function getFence(content) {
|
|
|
7
8
|
const maxLen = match ? Math.max(...match.map(m => m.length)) : 0;
|
|
8
9
|
return '`'.repeat(Math.max(3, maxLen + 1));
|
|
9
10
|
}
|
|
11
|
+
/** One `**path**` block section: header + fenced content, fence sized to the content. */
|
|
12
|
+
function blockSection(kind, content) {
|
|
13
|
+
const { path } = blocks[kind];
|
|
14
|
+
const lang = path.split('.').pop();
|
|
15
|
+
const fence = getFence(content);
|
|
16
|
+
return `**${path}**\n\n${fence}${lang}\n${content}\n${fence}`;
|
|
17
|
+
}
|
|
10
18
|
/** Serialize a bulb to `.bulb.md` text: YAML frontmatter then one `**filename**` block per present kind. */
|
|
11
19
|
export function serializeBulb(source) {
|
|
12
20
|
const sections = orderedKinds
|
|
13
21
|
.filter(kind => source[kind])
|
|
14
|
-
.map(kind =>
|
|
15
|
-
const { path } = blocks[kind];
|
|
16
|
-
const content = source[kind];
|
|
17
|
-
const lang = path.split('.').pop();
|
|
18
|
-
const fence = getFence(content);
|
|
19
|
-
return `**${path}**\n\n${fence}${lang}\n${content}\n${fence}`;
|
|
20
|
-
});
|
|
22
|
+
.map(kind => blockSection(kind, source[kind]));
|
|
21
23
|
return [
|
|
22
24
|
'---',
|
|
23
25
|
`format: ${BULB_FORMAT}`,
|
|
@@ -27,4 +29,37 @@ export function serializeBulb(source) {
|
|
|
27
29
|
...sections,
|
|
28
30
|
].join('\n');
|
|
29
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Replace one block's fence content in existing `.bulb.md` text, surgically — everything else
|
|
34
|
+
* (frontmatter beyond format/name, inter-block prose, block order) is preserved verbatim, which a
|
|
35
|
+
* parse→serialize round trip would lose. Appends the block at the end when absent. The fence grows
|
|
36
|
+
* if the new content carries a longer backtick run; an unterminated block is left untouched (the
|
|
37
|
+
* same defect parseBulb only warns on — rewriting inside it would guess at its extent).
|
|
38
|
+
*/
|
|
39
|
+
export function replaceBulbBlock(content, kind, newContent) {
|
|
40
|
+
const { path } = blocks[kind];
|
|
41
|
+
const lines = content.split('\n');
|
|
42
|
+
for (let i = 0; i < lines.length; i++) {
|
|
43
|
+
if (lines[i]?.trim() !== `**${path}**`)
|
|
44
|
+
continue;
|
|
45
|
+
let j = i + 1;
|
|
46
|
+
while (j < lines.length && lines[j]?.trim() === '')
|
|
47
|
+
j++;
|
|
48
|
+
const m = lines[j]?.match(FENCE_OPEN_RE);
|
|
49
|
+
if (!m)
|
|
50
|
+
continue;
|
|
51
|
+
const closeRe = fenceCloseRe(m[1]);
|
|
52
|
+
let k = j + 1;
|
|
53
|
+
while (k < lines.length && !lines[k]?.match(closeRe))
|
|
54
|
+
k++;
|
|
55
|
+
// Unterminated fence: refuse to touch the file at all — rewriting inside it would guess at its
|
|
56
|
+
// extent, and falling through to append would plant a duplicate block inside the open fence.
|
|
57
|
+
if (k >= lines.length)
|
|
58
|
+
return content;
|
|
59
|
+
const grown = getFence(newContent);
|
|
60
|
+
const fence = grown.length > m[1].length ? grown : m[1];
|
|
61
|
+
return [...lines.slice(0, j), fence + m[2], ...newContent.split('\n'), fence, ...lines.slice(k + 1)].join('\n');
|
|
62
|
+
}
|
|
63
|
+
return `${content.replace(/\s*$/, '')}\n\n${blockSection(kind, newContent)}\n`;
|
|
64
|
+
}
|
|
30
65
|
//# sourceMappingURL=serialize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAE3D,OAAO,EAAsB,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAE5C,2FAA2F;AAC3F,SAAS,QAAQ,CAAC,OAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACvC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAChE,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC,CAAA;AAC5C,CAAC;AAID,4GAA4G;AAC5G,MAAM,UAAU,aAAa,CAAC,MAAkB;IAC9C,MAAM,QAAQ,GAAG,YAAY;SAC1B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC5B,GAAG,CAAC,IAAI,CAAC,EAAE
|
|
1
|
+
{"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../format/src/serialize.ts"],"names":[],"mappings":"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"}
|