feat(intelligence): add lexical briefing text helpers
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent) Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
This commit is contained in:
parent
4f4e2b136f
commit
0db0e5a786
1 changed files with 84 additions and 0 deletions
84
src/lib/intelligence/briefingText.ts
Normal file
84
src/lib/intelligence/briefingText.ts
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
interface LexicalTextNode {
|
||||
type: string;
|
||||
text?: unknown;
|
||||
children?: unknown[];
|
||||
}
|
||||
|
||||
interface LexicalBlock {
|
||||
type: string;
|
||||
children?: unknown[];
|
||||
}
|
||||
|
||||
export type SerializedLexicalState = {
|
||||
root: {
|
||||
type: "root";
|
||||
children: {
|
||||
type: "paragraph";
|
||||
children: { type: "text"; text: string; version: number }[];
|
||||
direction: null;
|
||||
format: "";
|
||||
indent: number;
|
||||
version: number;
|
||||
}[];
|
||||
direction: "ltr" | "rtl" | null;
|
||||
format: "left" | "start" | "center" | "right" | "end" | "justify" | "";
|
||||
indent: number;
|
||||
version: number;
|
||||
};
|
||||
};
|
||||
|
||||
function collectText(node: unknown): string {
|
||||
if (typeof node !== "object" || node === null) return "";
|
||||
const n = node as LexicalTextNode;
|
||||
if (n.type === "linebreak") return "\n";
|
||||
if (typeof n.text === "string") return n.text;
|
||||
if (!Array.isArray(n.children)) return "";
|
||||
return n.children.map(collectText).join("");
|
||||
}
|
||||
|
||||
function collectBlockText(node: unknown): string {
|
||||
if (typeof node !== "object" || node === null) return "";
|
||||
const n = node as LexicalBlock;
|
||||
if (!Array.isArray(n.children)) return "";
|
||||
return n.children.map(collectText).join("");
|
||||
}
|
||||
|
||||
export function lexicalToText(details: unknown): string {
|
||||
if (typeof details !== "object" || details === null) return "";
|
||||
const root = (details as SerializedLexicalState).root;
|
||||
if (!root || !Array.isArray(root.children)) return "";
|
||||
return root.children
|
||||
.map(collectBlockText)
|
||||
.filter((line, i, all) => line.trim() !== "" || (i > 0 && i < all.length - 1))
|
||||
.join("\n");
|
||||
}
|
||||
|
||||
export function textToLexical(text: string): SerializedLexicalState {
|
||||
const lines = text.split("\n");
|
||||
return {
|
||||
root: {
|
||||
type: "root",
|
||||
children: (lines.length > 0 ? lines : [""]).map((line) => ({
|
||||
type: "paragraph",
|
||||
children:
|
||||
line === ""
|
||||
? []
|
||||
: [
|
||||
{
|
||||
type: "text",
|
||||
text: line,
|
||||
version: 1,
|
||||
},
|
||||
],
|
||||
direction: null,
|
||||
format: "",
|
||||
indent: 0,
|
||||
version: 1,
|
||||
})),
|
||||
direction: "ltr",
|
||||
format: "",
|
||||
indent: 0,
|
||||
version: 1,
|
||||
},
|
||||
};
|
||||
}
|
||||
Loading…
Reference in a new issue