@agent-native/core 0.124.4 → 0.124.6
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/corpus/core/CHANGELOG.md +12 -0
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/ingestion/pptx.ts +259 -5
- package/corpus/core/src/templates/default/.agents/skills/secrets/SKILL.md +28 -3
- package/corpus/core/src/templates/headless/.agents/skills/secrets/SKILL.md +28 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +28 -3
- package/corpus/templates/slides/actions/import-file.ts +81 -8
- package/corpus/templates/slides/actions/import-pptx.ts +100 -18
- package/corpus/templates/slides/server/handlers/import/html-converter.ts +129 -27
- package/dist/collab/routes.d.ts +1 -1
- package/dist/ingestion/pptx.d.ts +4 -0
- package/dist/ingestion/pptx.d.ts.map +1 -1
- package/dist/ingestion/pptx.js +207 -2
- package/dist/ingestion/pptx.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/templates/default/.agents/skills/secrets/SKILL.md +28 -3
- package/dist/templates/headless/.agents/skills/secrets/SKILL.md +28 -3
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +28 -3
- package/package.json +1 -1
- package/src/ingestion/pptx.ts +259 -5
- package/src/templates/default/.agents/skills/secrets/SKILL.md +28 -3
- package/src/templates/headless/.agents/skills/secrets/SKILL.md +28 -3
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +28 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pptx.js","sourceRoot":"","sources":["../../src/ingestion/pptx.ts"],"names":[],"mappings":"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","sourcesContent":["export interface ParsedPptxTextRun {\n content: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n color?: string;\n}\n\nexport interface ParsedPptxImage {\n data: Uint8Array;\n mimeType: string;\n name: string;\n}\n\nexport interface ParsedPptxSlide {\n texts: ParsedPptxTextRun[];\n images: ParsedPptxImage[];\n notes?: string;\n layoutHint?: string;\n}\n\nexport interface ParsedPptxPresentation {\n title: string;\n slides: ParsedPptxSlide[];\n theme?: { colors: string[]; fonts: string[] };\n}\n\ninterface ZipFile {\n async(type: \"string\"): Promise<string>;\n async(type: \"nodebuffer\"): Promise<Buffer>;\n}\n\ninterface ZipArchive {\n files: Record<string, unknown>;\n file(path: string): ZipFile | null;\n}\n\nexport async function parsePptxPresentation(\n fileBuffer: Uint8Array,\n): Promise<ParsedPptxPresentation> {\n const { loadZip, parseXml } = await loadPptxDependencies();\n const zip = await loadZip(fileBuffer);\n const presentationXml = await zip\n .file(\"ppt/presentation.xml\")\n ?.async(\"string\");\n if (!presentationXml)\n throw new Error(\"Invalid PPTX: missing ppt/presentation.xml\");\n const presentation = parseXml(presentationXml);\n const slideIds = asArray(\n record(record(record(presentation)?.[\"p:presentation\"])?.[\"p:sldIdLst\"])?.[\n \"p:sldId\"\n ],\n ).map((entry) => stringValue(record(entry)?.[\"@_r:id\"]) ?? \"\");\n const relationshipsXml = await zip\n .file(\"ppt/_rels/presentation.xml.rels\")\n ?.async(\"string\");\n const relationships = relationshipsXml\n ? parseRelationships(parseXml(relationshipsXml))\n : new Map<string, { target: string; type: string }>();\n const slidePaths = slideIds.flatMap((id) => {\n const relationship = relationships.get(id);\n if (!relationship) return [];\n return [\n relationship.target.startsWith(\"/\")\n ? relationship.target.slice(1)\n : `ppt/${relationship.target}`,\n ];\n });\n if (slidePaths.length === 0) {\n slidePaths.push(\n ...Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((a, b) => slideNumber(a) - slideNumber(b)),\n );\n }\n const theme = await parseTheme(zip, parseXml);\n const slides: ParsedPptxSlide[] = [];\n for (const slidePath of slidePaths) {\n const xml = await zip.file(slidePath)?.async(\"string\");\n if (!xml) continue;\n let slide: unknown;\n try {\n slide = parseXml(xml);\n } catch {\n continue;\n }\n const texts: ParsedPptxTextRun[] = [];\n collectTextRuns(slide, texts);\n const images: ParsedPptxImage[] = [];\n const relationshipPath = slidePath.replace(\n /slides\\/(slide\\d+\\.xml)/,\n \"slides/_rels/$1.rels\",\n );\n const slideRelationshipsXml = await zip\n .file(relationshipPath)\n ?.async(\"string\");\n if (slideRelationshipsXml) {\n for (const relationship of parseRelationships(\n parseXml(slideRelationshipsXml),\n ).values()) {\n if (\n !relationship.type.includes(\"/image\") &&\n !/\\.(png|jpe?g|gif|svg|webp|bmp|tiff?|emf|wmf)$/i.test(\n relationship.target,\n )\n ) {\n continue;\n }\n const imagePath = relationship.target.startsWith(\"/\")\n ? relationship.target.slice(1)\n : relationship.target.startsWith(\"../\")\n ? `ppt/${relationship.target.replace(/^\\.\\.\\//, \"\")}`\n : `ppt/slides/${relationship.target}`;\n const image = zip.file(imagePath);\n if (!image) continue;\n const name = imagePath.split(\"/\").at(-1) ?? \"image\";\n images.push({\n data: new Uint8Array(await image.async(\"nodebuffer\")),\n mimeType: imageMimeType(name),\n name,\n });\n }\n }\n const number = slideNumber(slidePath);\n const notesXml = await zip\n .file(`ppt/notesSlides/notesSlide${number}.xml`)\n ?.async(\"string\");\n let notes: string | undefined;\n if (notesXml) {\n const runs: ParsedPptxTextRun[] = [];\n collectTextRuns(parseXml(notesXml), runs);\n const value = runs\n .map((run) => run.content)\n .join(\" \")\n .trim();\n if (value.length > 1) notes = value;\n }\n slides.push({\n texts,\n images,\n notes,\n layoutHint: guessLayoutHint(texts, images.length > 0),\n });\n }\n const firstSlide = slides[0]?.texts ?? [];\n const title =\n [...firstSlide]\n .sort((a, b) => (b.fontSize ?? 0) - (a.fontSize ?? 0))[0]\n ?.content.trim()\n .slice(0, 200) || \"Imported Presentation\";\n return { title, slides, theme };\n}\n\nasync function parseTheme(\n zip: ZipArchive,\n parseXml: (xml: string) => unknown,\n): Promise<ParsedPptxPresentation[\"theme\"]> {\n const xml = await zip.file(\"ppt/theme/theme1.xml\")?.async(\"string\");\n if (!xml) return undefined;\n const root = record(parseXml(xml));\n const elements = record(record(root?.[\"a:theme\"])?.[\"a:themeElements\"]);\n const scheme = record(elements?.[\"a:clrScheme\"]);\n const colors: string[] = [];\n for (const [key, value] of Object.entries(scheme ?? {})) {\n if (key.startsWith(\"@_\")) continue;\n const color = record(value);\n const rgb = stringValue(record(color?.[\"a:srgbClr\"])?.[\"@_val\"]);\n const system = stringValue(record(color?.[\"a:sysClr\"])?.[\"@_lastClr\"]);\n if (rgb || system) colors.push(`#${rgb ?? system}`);\n }\n const fontScheme = record(elements?.[\"a:fontScheme\"]);\n const fonts = [\"a:majorFont\", \"a:minorFont\"].flatMap((key) => {\n const value = stringValue(\n record(record(fontScheme?.[key])?.[\"a:latin\"])?.[\"@_typeface\"],\n );\n return value ? [value] : [];\n });\n return colors.length || fonts.length ? { colors, fonts } : undefined;\n}\n\nfunction collectTextRuns(\n value: unknown,\n runs: ParsedPptxTextRun[],\n inherited: Omit<ParsedPptxTextRun, \"content\"> = {},\n): void {\n const node = record(value);\n if (!node) return;\n for (const raw of asArray(node[\"a:r\"])) {\n const run = record(raw);\n const content = innerText(run?.[\"a:t\"]);\n if (content)\n runs.push({\n content,\n ...runProperties(record(run?.[\"a:rPr\"]), inherited),\n });\n }\n if (node[\"a:t\"] !== undefined && node[\"a:r\"] === undefined) {\n const content = innerText(node[\"a:t\"]);\n if (content) runs.push({ content, ...inherited });\n }\n for (const [key, child] of Object.entries(node)) {\n if (key.startsWith(\"@_\") || key === \"a:r\" || key === \"a:t\") continue;\n for (const item of asArray(child)) collectTextRuns(item, runs, inherited);\n }\n}\n\nfunction runProperties(\n value: Record<string, unknown> | null,\n inherited: Omit<ParsedPptxTextRun, \"content\">,\n): Omit<ParsedPptxTextRun, \"content\"> {\n if (!value) return inherited;\n const size = Number(value[\"@_sz\"]);\n const rgb = stringValue(\n record(record(value[\"a:solidFill\"])?.[\"a:srgbClr\"])?.[\"@_val\"],\n );\n return {\n ...inherited,\n ...(value[\"@_b\"] === \"1\" || value[\"@_b\"] === 1 || value[\"@_b\"] === true\n ? { bold: true }\n : {}),\n ...(value[\"@_i\"] === \"1\" || value[\"@_i\"] === 1 || value[\"@_i\"] === true\n ? { italic: true }\n : {}),\n ...(Number.isFinite(size) && size > 0 ? { fontSize: size / 100 } : {}),\n ...(rgb ? { color: `#${rgb}` } : {}),\n };\n}\n\nfunction parseRelationships(value: unknown) {\n const output = new Map<string, { target: string; type: string }>();\n for (const raw of asArray(\n record(record(value)?.Relationships)?.Relationship,\n )) {\n const relationship = record(raw);\n const id = stringValue(relationship?.[\"@_Id\"]);\n const target = stringValue(relationship?.[\"@_Target\"]);\n if (id && target) {\n output.set(id, {\n target,\n type: stringValue(relationship?.[\"@_Type\"]) ?? \"\",\n });\n }\n }\n return output;\n}\n\nfunction guessLayoutHint(texts: ParsedPptxTextRun[], hasImages: boolean) {\n if (hasImages) return \"image\";\n const maxSize = Math.max(...texts.map((text) => text.fontSize ?? 0), 0);\n const length = texts.reduce((total, text) => total + text.content.length, 0);\n if (texts.length <= 3 && length < 200 && maxSize >= 28) return \"title\";\n if (texts.length <= 2 && length < 100) return \"section\";\n return \"content\";\n}\n\nfunction imageMimeType(name: string): string {\n const extension = name.split(\".\").at(-1)?.toLowerCase();\n return (\n {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n tiff: \"image/tiff\",\n tif: \"image/tiff\",\n emf: \"image/emf\",\n wmf: \"image/wmf\",\n }[extension ?? \"\"] ?? \"application/octet-stream\"\n );\n}\n\nasync function loadPptxDependencies(): Promise<{\n loadZip(data: Uint8Array): Promise<ZipArchive>;\n parseXml(xml: string): unknown;\n}> {\n try {\n const [zipModule, xmlModule] = await Promise.all([\n import(\"jszip\") as Promise<{\n default: { loadAsync(data: Uint8Array): Promise<ZipArchive> };\n }>,\n import(\"fast-xml-parser\") as Promise<{\n XMLParser: new (options: Record<string, unknown>) => {\n parse(xml: string): unknown;\n };\n }>,\n ]);\n const parser = new xmlModule.XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n });\n return {\n loadZip: (data) => zipModule.default.loadAsync(data),\n parseXml: (xml) => parser.parse(xml),\n };\n } catch {\n throw new Error(\n \"Structured PPTX parsing requires the optional jszip and fast-xml-parser dependencies.\",\n );\n }\n}\n\nfunction slideNumber(value: string): number {\n return Number(value.match(/slide(\\d+)/)?.[1] ?? 0);\n}\n\nfunction innerText(value: unknown): string {\n if (typeof value === \"string\" || typeof value === \"number\")\n return String(value);\n return String(record(value)?.[\"#text\"] ?? \"\");\n}\n\nfunction asArray(value: unknown): unknown[] {\n return value === undefined || value === null\n ? []\n : Array.isArray(value)\n ? value\n : [value];\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"pptx.js","sourceRoot":"","sources":["../../src/ingestion/pptx.ts"],"names":[],"mappings":"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","sourcesContent":["export interface ParsedPptxTextRun {\n content: string;\n bold?: boolean;\n italic?: boolean;\n fontSize?: number;\n color?: string;\n}\n\nexport interface ParsedPptxImage {\n data: Uint8Array;\n mimeType: string;\n name: string;\n /** Width / height of the picture shape on the slide, from its own placed size (not the source file's pixel dimensions). */\n aspectRatio?: number;\n /** True when the picture shape covers at least ~85% of the slide's width and height — a full-bleed background photo rather than an inset card image. */\n fullBleed?: boolean;\n}\n\nexport interface ParsedPptxSlide {\n texts: ParsedPptxTextRun[];\n images: ParsedPptxImage[];\n notes?: string;\n layoutHint?: string;\n}\n\nexport interface ParsedPptxPresentation {\n title: string;\n slides: ParsedPptxSlide[];\n theme?: { colors: string[]; fonts: string[] };\n}\n\ninterface ZipFile {\n async(type: \"string\"): Promise<string>;\n async(type: \"nodebuffer\"): Promise<Buffer>;\n}\n\ninterface ZipArchive {\n files: Record<string, unknown>;\n file(path: string): ZipFile | null;\n}\n\nexport async function parsePptxPresentation(\n fileBuffer: Uint8Array,\n): Promise<ParsedPptxPresentation> {\n const { loadZip, parseXml } = await loadPptxDependencies();\n const zip = await loadZip(fileBuffer);\n const presentationXml = await zip\n .file(\"ppt/presentation.xml\")\n ?.async(\"string\");\n if (!presentationXml)\n throw new Error(\"Invalid PPTX: missing ppt/presentation.xml\");\n const presentation = parseXml(presentationXml);\n const presentationRoot = record(record(presentation)?.[\"p:presentation\"]);\n const slideIds = asArray(\n record(presentationRoot?.[\"p:sldIdLst\"])?.[\"p:sldId\"],\n ).map((entry) => stringValue(record(entry)?.[\"@_r:id\"]) ?? \"\");\n const sldSz = record(presentationRoot?.[\"p:sldSz\"]);\n const slideWidthEmu = Number(sldSz?.[\"@_cx\"]) || undefined;\n const slideHeightEmu = Number(sldSz?.[\"@_cy\"]) || undefined;\n const relationshipsXml = await zip\n .file(\"ppt/_rels/presentation.xml.rels\")\n ?.async(\"string\");\n const relationships = relationshipsXml\n ? parseRelationships(parseXml(relationshipsXml))\n : new Map<string, { target: string; type: string }>();\n const slidePaths = slideIds.flatMap((id) => {\n const relationship = relationships.get(id);\n if (!relationship) return [];\n return [\n relationship.target.startsWith(\"/\")\n ? relationship.target.slice(1)\n : `ppt/${relationship.target}`,\n ];\n });\n if (slidePaths.length === 0) {\n slidePaths.push(\n ...Object.keys(zip.files)\n .filter((path) => /^ppt\\/slides\\/slide\\d+\\.xml$/.test(path))\n .sort((a, b) => slideNumber(a) - slideNumber(b)),\n );\n }\n const theme = await parseTheme(zip, parseXml);\n const slides: ParsedPptxSlide[] = [];\n for (const slidePath of slidePaths) {\n const xml = await zip.file(slidePath)?.async(\"string\");\n if (!xml) continue;\n let slide: unknown;\n try {\n slide = parseXml(xml);\n } catch {\n continue;\n }\n const texts: ParsedPptxTextRun[] = [];\n collectTextRuns(slide, texts);\n const images: ParsedPptxImage[] = [];\n const relationshipPath = slidePath.replace(\n /slides\\/(slide\\d+\\.xml)/,\n \"slides/_rels/$1.rels\",\n );\n const slideRelationshipsXml = await zip\n .file(relationshipPath)\n ?.async(\"string\");\n if (slideRelationshipsXml) {\n const slideRelationships = parseRelationships(\n parseXml(slideRelationshipsXml),\n );\n // Walk the slide's own picture shapes (in document order) rather than\n // every image relationship, so each image carries the placed size the\n // author gave it on the slide — that size is what tells a full-bleed\n // cover photo apart from a small inset card photo, which a flat\n // relationship scan has no way to know.\n const pictureShapes: PictureShape[] = [];\n collectPictureShapes(slide, pictureShapes);\n reorderByDocumentPosition(pictureShapes, xml);\n addBackgroundFillShape(\n slide,\n pictureShapes,\n slideWidthEmu,\n slideHeightEmu,\n );\n for (const shape of pictureShapes) {\n if (!shape.embedId) continue;\n const relationship = slideRelationships.get(shape.embedId);\n if (!relationship) continue;\n if (\n !relationship.type.includes(\"/image\") &&\n !/\\.(png|jpe?g|gif|svg|webp|bmp|tiff?|emf|wmf)$/i.test(\n relationship.target,\n )\n ) {\n continue;\n }\n const imagePath = relationship.target.startsWith(\"/\")\n ? relationship.target.slice(1)\n : relationship.target.startsWith(\"../\")\n ? `ppt/${relationship.target.replace(/^\\.\\.\\//, \"\")}`\n : `ppt/slides/${relationship.target}`;\n const image = zip.file(imagePath);\n if (!image) continue;\n const name = imagePath.split(\"/\").at(-1) ?? \"image\";\n const aspectRatio =\n shape.widthEmu && shape.heightEmu\n ? shape.widthEmu / shape.heightEmu\n : undefined;\n const fullBleed = Boolean(\n shape.widthEmu &&\n shape.heightEmu &&\n slideWidthEmu &&\n slideHeightEmu &&\n shape.widthEmu / slideWidthEmu >= 0.85 &&\n shape.heightEmu / slideHeightEmu >= 0.85,\n );\n images.push({\n data: new Uint8Array(await image.async(\"nodebuffer\")),\n mimeType: imageMimeType(name),\n name,\n aspectRatio,\n fullBleed,\n });\n }\n }\n const number = slideNumber(slidePath);\n const notesXml = await zip\n .file(`ppt/notesSlides/notesSlide${number}.xml`)\n ?.async(\"string\");\n let notes: string | undefined;\n if (notesXml) {\n const runs: ParsedPptxTextRun[] = [];\n collectTextRuns(parseXml(notesXml), runs);\n const value = runs\n .map((run) => run.content)\n .join(\" \")\n .trim();\n if (value.length > 1) notes = value;\n }\n slides.push({\n texts,\n images,\n notes,\n layoutHint: guessLayoutHint(texts, images.length > 0),\n });\n }\n const firstSlide = slides[0]?.texts ?? [];\n const title =\n [...firstSlide]\n .sort((a, b) => (b.fontSize ?? 0) - (a.fontSize ?? 0))[0]\n ?.content.trim()\n .slice(0, 200) || \"Imported Presentation\";\n return { title, slides, theme };\n}\n\nasync function parseTheme(\n zip: ZipArchive,\n parseXml: (xml: string) => unknown,\n): Promise<ParsedPptxPresentation[\"theme\"]> {\n const xml = await zip.file(\"ppt/theme/theme1.xml\")?.async(\"string\");\n if (!xml) return undefined;\n const root = record(parseXml(xml));\n const elements = record(record(root?.[\"a:theme\"])?.[\"a:themeElements\"]);\n const scheme = record(elements?.[\"a:clrScheme\"]);\n const colors: string[] = [];\n for (const [key, value] of Object.entries(scheme ?? {})) {\n if (key.startsWith(\"@_\")) continue;\n const color = record(value);\n const rgb = stringValue(record(color?.[\"a:srgbClr\"])?.[\"@_val\"]);\n const system = stringValue(record(color?.[\"a:sysClr\"])?.[\"@_lastClr\"]);\n if (rgb || system) colors.push(`#${rgb ?? system}`);\n }\n const fontScheme = record(elements?.[\"a:fontScheme\"]);\n const fonts = [\"a:majorFont\", \"a:minorFont\"].flatMap((key) => {\n const value = stringValue(\n record(record(fontScheme?.[key])?.[\"a:latin\"])?.[\"@_typeface\"],\n );\n return value ? [value] : [];\n });\n return colors.length || fonts.length ? { colors, fonts } : undefined;\n}\n\nfunction collectTextRuns(\n value: unknown,\n runs: ParsedPptxTextRun[],\n inherited: Omit<ParsedPptxTextRun, \"content\"> = {},\n): void {\n const node = record(value);\n if (!node) return;\n for (const raw of asArray(node[\"a:r\"])) {\n const run = record(raw);\n const content = innerText(run?.[\"a:t\"]);\n if (content)\n runs.push({\n content,\n ...runProperties(record(run?.[\"a:rPr\"]), inherited),\n });\n }\n if (node[\"a:t\"] !== undefined && node[\"a:r\"] === undefined) {\n const content = innerText(node[\"a:t\"]);\n if (content) runs.push({ content, ...inherited });\n }\n for (const [key, child] of Object.entries(node)) {\n if (key.startsWith(\"@_\") || key === \"a:r\" || key === \"a:t\") continue;\n for (const item of asArray(child)) collectTextRuns(item, runs, inherited);\n }\n}\n\ninterface PictureShape {\n embedId?: string;\n widthEmu?: number;\n heightEmu?: number;\n}\n\n/**\n * Recursively find every embedded picture in a slide, in document order:\n * plain `p:pic` shapes, and `p:sp` autoshapes whose fill is a picture\n * (common for \"photo cutout\" shapes and full-bleed decorative rectangles).\n * A group shape (`p:grpSp`) defines its own local coordinate space for its\n * children (`chOff`/`chExt`) that can be scaled arbitrarily relative to the\n * group's own placed size on the slide, so each level of nesting multiplies\n * a running scale factor into the child sizes below it — without that, a\n * picture inside a resized group would report its unscaled design-time\n * size instead of how large it actually appears on the slide.\n */\nfunction collectPictureShapes(\n value: unknown,\n out: PictureShape[],\n scaleX = 1,\n scaleY = 1,\n): void {\n const node = record(value);\n if (!node) return;\n for (const [key, child] of Object.entries(node)) {\n if (key.startsWith(\"@_\")) continue;\n if (key === \"p:pic\") {\n for (const picNode of asArray(child)) {\n const pic = record(picNode);\n const blip = record(record(pic?.[\"p:blipFill\"])?.[\"a:blip\"]);\n out.push(\n scaledShape(\n stringValue(blip?.[\"@_r:embed\"]),\n extFromSpPr(pic),\n scaleX,\n scaleY,\n ),\n );\n }\n continue;\n }\n if (key === \"p:sp\") {\n for (const spNode of asArray(child)) {\n const sp = record(spNode);\n const blip = record(\n record(record(sp?.[\"p:spPr\"])?.[\"a:blipFill\"])?.[\"a:blip\"],\n );\n const embedId = stringValue(blip?.[\"@_r:embed\"]);\n if (embedId) {\n out.push(scaledShape(embedId, extFromSpPr(sp), scaleX, scaleY));\n }\n }\n continue;\n }\n if (key === \"p:grpSp\") {\n for (const groupNode of asArray(child)) {\n const scale = groupChildScale(record(groupNode), scaleX, scaleY);\n collectPictureShapes(groupNode, out, scale.x, scale.y);\n }\n continue;\n }\n for (const item of asArray(child)) {\n collectPictureShapes(item, out, scaleX, scaleY);\n }\n }\n}\n\n/** Whether an `a:xfrm` `rot` value (60,000ths of a degree) is an odd multiple of 90° — a 90/270 turn that swaps effective width and height. */\nfunction isOddQuarterTurn(rot: number): boolean {\n if (!Number.isFinite(rot)) return false;\n const quarterTurns = Math.round(rot / 60000 / 90);\n return ((quarterTurns % 2) + 2) % 2 === 1;\n}\n\n/**\n * A group's `chExt` is the coordinate space its children are authored in;\n * `ext` is how large the group actually renders — the ratio between them is\n * the extra scale nested children need on top of their own declared size.\n * When the group itself is rotated a 90/270-degree turn, that ratio applies\n * to the perpendicular axis on the slide, so the X/Y scale factors need\n * swapping the same way a rotated picture's own width/height do.\n */\nfunction groupChildScale(\n groupNode: Record<string, unknown> | null,\n parentScaleX: number,\n parentScaleY: number,\n): { x: number; y: number } {\n const xfrm = record(record(groupNode?.[\"p:grpSpPr\"])?.[\"a:xfrm\"]);\n const ext = record(xfrm?.[\"a:ext\"]);\n const chExt = record(xfrm?.[\"a:chExt\"]);\n const extCx = Number(ext?.[\"@_cx\"]);\n const extCy = Number(ext?.[\"@_cy\"]);\n const chExtCx = Number(chExt?.[\"@_cx\"]);\n const chExtCy = Number(chExt?.[\"@_cy\"]);\n let groupScaleX =\n Number.isFinite(extCx) && Number.isFinite(chExtCx) && chExtCx > 0\n ? extCx / chExtCx\n : 1;\n let groupScaleY =\n Number.isFinite(extCy) && Number.isFinite(chExtCy) && chExtCy > 0\n ? extCy / chExtCy\n : 1;\n if (isOddQuarterTurn(Number(xfrm?.[\"@_rot\"]))) {\n [groupScaleX, groupScaleY] = [groupScaleY, groupScaleX];\n }\n return { x: parentScaleX * groupScaleX, y: parentScaleY * groupScaleY };\n}\n\n/**\n * `a:xfrm/a:ext` always stores the shape's *unrotated* design-time width and\n * height — `a:xfrm/@rot` (in 60,000ths of a degree) rotates it around its\n * own center afterward. For a 90/270-degree turn, the shape's effective\n * on-slide footprint has its width and height swapped relative to that\n * declared size, so a rotated full-bleed photo can otherwise get treated as\n * a small inset, or a portrait image get an inverted aspect ratio.\n */\nfunction extFromSpPr(shapeNode: Record<string, unknown> | null): {\n cx?: number;\n cy?: number;\n} {\n const xfrm = record(record(shapeNode?.[\"p:spPr\"])?.[\"a:xfrm\"]);\n const ext = record(xfrm?.[\"a:ext\"]);\n const cx = Number(ext?.[\"@_cx\"]);\n const cy = Number(ext?.[\"@_cy\"]);\n if (!Number.isFinite(cx) || cx <= 0 || !Number.isFinite(cy) || cy <= 0) {\n return { cx: undefined, cy: undefined };\n }\n return isOddQuarterTurn(Number(xfrm?.[\"@_rot\"]))\n ? { cx: cy, cy: cx }\n : { cx, cy };\n}\n\nfunction scaledShape(\n embedId: string | undefined,\n size: { cx?: number; cy?: number },\n scaleX: number,\n scaleY: number,\n): PictureShape {\n return {\n embedId,\n widthEmu: size.cx !== undefined ? size.cx * scaleX : undefined,\n heightEmu: size.cy !== undefined ? size.cy * scaleY : undefined,\n };\n}\n\n/**\n * fast-xml-parser groups sibling elements by tag name, so a slide whose\n * picture-bearing shapes alternate types on the page (e.g. `p:sp`, `p:pic`,\n * `p:sp`) comes out of `collectPictureShapes` re-sorted by tag rather than\n * by the order they actually appear — every `p:sp` gets visited before any\n * `p:pic`, even if a `p:pic` came first in the file. Re-derive the true\n * order from the raw XML text instead: `<a:blip r:embed=\"...\">` occurrences\n * appear in exactly document order regardless of nesting, so they can be\n * used to restore the author's original front-to-back ordering (which\n * matters because downstream rendering treats the first image as primary).\n */\nfunction reorderByDocumentPosition(shapes: PictureShape[], xml: string): void {\n const order: string[] = [];\n const blipPattern = /<a:blip\\b[^>]*\\br:embed=(?:\"([^\"]+)\"|'([^']+)')/g;\n let match: RegExpExecArray | null;\n while ((match = blipPattern.exec(xml))) order.push(match[1] ?? match[2]);\n\n // The same relationship id can legitimately be reused across multiple\n // placements (e.g. a repeated icon), so looking up a single fixed index\n // per id would assign every reused shape the position of its first XML\n // occurrence. Instead give each id a queue of its occurrence positions\n // and consume one per shape, in the order shapes were collected.\n const occurrences = new Map<string, number[]>();\n order.forEach((embedId, index) => {\n const queue = occurrences.get(embedId);\n if (queue) queue.push(index);\n else occurrences.set(embedId, [index]);\n });\n const positions = shapes.map((shape) => {\n const queue = shape.embedId ? occurrences.get(shape.embedId) : undefined;\n return queue && queue.length > 0 ? queue.shift()! : -1;\n });\n const sortedIndices = shapes.map((_, i) => i);\n sortedIndices.sort((a, b) => positions[a] - positions[b]);\n const sorted = sortedIndices.map((i) => shapes[i]);\n shapes.splice(0, shapes.length, ...sorted);\n}\n\n/** Read the embed relationship id of a slide's background picture fill (`p:cSld/p:bg/p:bgPr/a:blipFill/a:blip`), if any. */\nfunction extractBackgroundFillEmbedId(slide: unknown): string | undefined {\n const root = record(slide);\n const cSld = record(record(root?.[\"p:sld\"])?.[\"p:cSld\"] ?? root?.[\"p:cSld\"]);\n const bgPr = record(record(cSld?.[\"p:bg\"])?.[\"p:bgPr\"]);\n const blip = record(record(bgPr?.[\"a:blipFill\"])?.[\"a:blip\"]);\n return stringValue(blip?.[\"@_r:embed\"]);\n}\n\n/**\n * Add the slide's background picture fill, if any, as a synthetic\n * full-slide-sized shape. It's unshifted to the front rather than appended:\n * downstream rendering only ever uses the first image in the list, and a\n * background fill is the slide's base layer — the primary visual — so a\n * smaller foreground picture (a logo, an icon) must not bump it out of that\n * slot.\n */\nfunction addBackgroundFillShape(\n slide: unknown,\n pictureShapes: PictureShape[],\n slideWidthEmu: number | undefined,\n slideHeightEmu: number | undefined,\n): void {\n const embedId = extractBackgroundFillEmbedId(slide);\n if (!embedId) return;\n pictureShapes.unshift({\n embedId,\n widthEmu: slideWidthEmu,\n heightEmu: slideHeightEmu,\n });\n}\n\nfunction runProperties(\n value: Record<string, unknown> | null,\n inherited: Omit<ParsedPptxTextRun, \"content\">,\n): Omit<ParsedPptxTextRun, \"content\"> {\n if (!value) return inherited;\n const size = Number(value[\"@_sz\"]);\n const rgb = stringValue(\n record(record(value[\"a:solidFill\"])?.[\"a:srgbClr\"])?.[\"@_val\"],\n );\n return {\n ...inherited,\n ...(value[\"@_b\"] === \"1\" || value[\"@_b\"] === 1 || value[\"@_b\"] === true\n ? { bold: true }\n : {}),\n ...(value[\"@_i\"] === \"1\" || value[\"@_i\"] === 1 || value[\"@_i\"] === true\n ? { italic: true }\n : {}),\n ...(Number.isFinite(size) && size > 0 ? { fontSize: size / 100 } : {}),\n ...(rgb ? { color: `#${rgb}` } : {}),\n };\n}\n\nfunction parseRelationships(value: unknown) {\n const output = new Map<string, { target: string; type: string }>();\n for (const raw of asArray(\n record(record(value)?.Relationships)?.Relationship,\n )) {\n const relationship = record(raw);\n const id = stringValue(relationship?.[\"@_Id\"]);\n const target = stringValue(relationship?.[\"@_Target\"]);\n if (id && target) {\n output.set(id, {\n target,\n type: stringValue(relationship?.[\"@_Type\"]) ?? \"\",\n });\n }\n }\n return output;\n}\n\nfunction guessLayoutHint(texts: ParsedPptxTextRun[], hasImages: boolean) {\n if (hasImages) return \"image\";\n const maxSize = Math.max(...texts.map((text) => text.fontSize ?? 0), 0);\n const length = texts.reduce((total, text) => total + text.content.length, 0);\n if (texts.length <= 3 && length < 200 && maxSize >= 28) return \"title\";\n if (texts.length <= 2 && length < 100) return \"section\";\n return \"content\";\n}\n\nfunction imageMimeType(name: string): string {\n const extension = name.split(\".\").at(-1)?.toLowerCase();\n return (\n {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n svg: \"image/svg+xml\",\n webp: \"image/webp\",\n bmp: \"image/bmp\",\n tiff: \"image/tiff\",\n tif: \"image/tiff\",\n emf: \"image/emf\",\n wmf: \"image/wmf\",\n }[extension ?? \"\"] ?? \"application/octet-stream\"\n );\n}\n\nasync function loadPptxDependencies(): Promise<{\n loadZip(data: Uint8Array): Promise<ZipArchive>;\n parseXml(xml: string): unknown;\n}> {\n try {\n const [zipModule, xmlModule] = await Promise.all([\n import(\"jszip\") as Promise<{\n default: { loadAsync(data: Uint8Array): Promise<ZipArchive> };\n }>,\n import(\"fast-xml-parser\") as Promise<{\n XMLParser: new (options: Record<string, unknown>) => {\n parse(xml: string): unknown;\n };\n }>,\n ]);\n const parser = new xmlModule.XMLParser({\n ignoreAttributes: false,\n attributeNamePrefix: \"@_\",\n });\n return {\n loadZip: (data) => zipModule.default.loadAsync(data),\n parseXml: (xml) => parser.parse(xml),\n };\n } catch {\n throw new Error(\n \"Structured PPTX parsing requires the optional jszip and fast-xml-parser dependencies.\",\n );\n }\n}\n\nfunction slideNumber(value: string): number {\n return Number(value.match(/slide(\\d+)/)?.[1] ?? 0);\n}\n\nfunction innerText(value: unknown): string {\n if (typeof value === \"string\" || typeof value === \"number\")\n return String(value);\n return String(record(value)?.[\"#text\"] ?? \"\");\n}\n\nfunction asArray(value: unknown): unknown[] {\n return value === undefined || value === null\n ? []\n : Array.isArray(value)\n ? value\n : [value];\n}\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value.trim() : undefined;\n}\n"]}
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
|
|
14
14
|
count: number;
|
|
15
15
|
updated?: undefined;
|
|
16
|
-
ok?: undefined;
|
|
17
16
|
error?: undefined;
|
|
17
|
+
ok?: undefined;
|
|
18
18
|
} | {
|
|
19
19
|
count?: undefined;
|
|
20
20
|
updated: number;
|
|
21
|
-
ok?: undefined;
|
|
22
21
|
error?: undefined;
|
|
22
|
+
ok?: undefined;
|
|
23
23
|
} | {
|
|
24
24
|
count?: undefined;
|
|
25
25
|
updated?: undefined;
|
|
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
|
|
|
28
28
|
} | {
|
|
29
29
|
count?: undefined;
|
|
30
30
|
updated?: undefined;
|
|
31
|
-
ok: boolean;
|
|
32
31
|
error?: undefined;
|
|
32
|
+
ok: boolean;
|
|
33
33
|
}>>;
|
|
34
34
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -49,8 +49,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
|
|
|
49
49
|
}>;
|
|
50
50
|
/** DELETE /_agent-native/resources/:id — delete a resource */
|
|
51
51
|
export declare function handleDeleteResource(event: any): Promise<{
|
|
52
|
-
error: string;
|
|
53
52
|
ok?: undefined;
|
|
53
|
+
error: string;
|
|
54
54
|
} | {
|
|
55
55
|
error?: undefined;
|
|
56
56
|
ok: boolean;
|
package/dist/secrets/routes.d.ts
CHANGED
|
@@ -37,17 +37,17 @@ export declare function createWriteSecretHandler(): import("h3").EventHandlerWit
|
|
|
37
37
|
ok?: undefined;
|
|
38
38
|
status?: undefined;
|
|
39
39
|
} | {
|
|
40
|
+
error?: undefined;
|
|
40
41
|
ok: boolean;
|
|
41
42
|
status: string;
|
|
42
|
-
error?: undefined;
|
|
43
43
|
} | {
|
|
44
44
|
ok?: undefined;
|
|
45
45
|
error: string;
|
|
46
46
|
removed?: undefined;
|
|
47
47
|
} | {
|
|
48
|
+
error?: undefined;
|
|
48
49
|
ok: boolean;
|
|
49
50
|
removed: boolean;
|
|
50
|
-
error?: undefined;
|
|
51
51
|
}>>;
|
|
52
52
|
/**
|
|
53
53
|
* POST /_agent-native/secrets/:key/test — re-run the validator against the
|
|
@@ -58,13 +58,13 @@ export declare function createTestSecretHandler(): import("h3").EventHandlerWith
|
|
|
58
58
|
error: string;
|
|
59
59
|
note?: undefined;
|
|
60
60
|
} | {
|
|
61
|
+
error?: undefined;
|
|
61
62
|
ok: boolean;
|
|
62
63
|
note?: undefined;
|
|
63
|
-
error?: undefined;
|
|
64
64
|
} | {
|
|
65
|
+
error?: undefined;
|
|
65
66
|
ok: boolean;
|
|
66
67
|
note: string;
|
|
67
|
-
error?: undefined;
|
|
68
68
|
} | {
|
|
69
69
|
note?: undefined;
|
|
70
70
|
ok: boolean;
|
|
@@ -95,12 +95,12 @@ export interface AdHocSecretPayload {
|
|
|
95
95
|
export declare function createAdHocSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<AdHocSecretPayload[] | {
|
|
96
96
|
error: string;
|
|
97
97
|
} | {
|
|
98
|
+
error?: undefined;
|
|
98
99
|
ok: boolean;
|
|
99
100
|
key: string;
|
|
100
|
-
error?: undefined;
|
|
101
101
|
} | {
|
|
102
|
+
error?: undefined;
|
|
102
103
|
ok: boolean;
|
|
103
104
|
removed: boolean;
|
|
104
|
-
error?: undefined;
|
|
105
105
|
}>>;
|
|
106
106
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -177,9 +177,34 @@ workspace repo:
|
|
|
177
177
|
npx agent-native doctor --only no-env-credentials
|
|
178
178
|
```
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
## `resolveCredential` sees exactly one organization
|
|
181
|
+
|
|
182
|
+
`resolveCredential(key, { userEmail, orgId })` checks the user scope, then the
|
|
183
|
+
one `orgId` you pass, then the solo workspace. That is the whole search. It is
|
|
184
|
+
correct for a signed-in request, and wrong for two common cases:
|
|
185
|
+
|
|
186
|
+
- **The caller has no organization.** A cron, a scheduled job, or any CLI run
|
|
187
|
+
without a real member identity resolves no `orgId`, so only the user and solo
|
|
188
|
+
scopes are ever consulted — and a shared key is in neither.
|
|
189
|
+
- **The key was synced under a different organization.** `app_secrets` has no
|
|
190
|
+
scope visible to every org (`readAppSecret` is strict equality on
|
|
191
|
+
`(scope, scope_id, key)`), so a key the vault UI advertises as available to
|
|
192
|
+
every app is unreadable from any org except the one that ran the sync.
|
|
193
|
+
|
|
194
|
+
Both produce the same misleading "not set" that the split brain above produces,
|
|
195
|
+
which is why swapping `process.env` for `resolveCredential` can look like a fix
|
|
196
|
+
and change nothing. A workspace app should read shared keys through a resolver
|
|
197
|
+
that also sweeps the caller's other memberships and a designated vault org —
|
|
198
|
+
see `resolveConnectorSecret` and `AGENT_VAULT_ORG_ID` in the builder-workspace
|
|
199
|
+
repo for the shape, including the boot-time assertion that the deployment really
|
|
200
|
+
is single-tenant before a non-membership-gated fallback is safe.
|
|
201
|
+
|
|
202
|
+
**The doctor guard does not catch this second form** — it looks for
|
|
203
|
+
`process.env` reads, and `resolveCredential` is not one. Grep for
|
|
204
|
+
`resolveCredential` yourself and confirm each call sits somewhere a single-org
|
|
205
|
+
lookup is genuinely the right question. Findings that pair it with a
|
|
206
|
+
`?? process.env.KEY` fallback are the sanctioned deploy-level escape hatch; the
|
|
207
|
+
bugs are calls whose value can only live in another org's vault.
|
|
183
208
|
|
|
184
209
|
## HTTP routes
|
|
185
210
|
|
|
@@ -177,9 +177,34 @@ workspace repo:
|
|
|
177
177
|
npx agent-native doctor --only no-env-credentials
|
|
178
178
|
```
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
## `resolveCredential` sees exactly one organization
|
|
181
|
+
|
|
182
|
+
`resolveCredential(key, { userEmail, orgId })` checks the user scope, then the
|
|
183
|
+
one `orgId` you pass, then the solo workspace. That is the whole search. It is
|
|
184
|
+
correct for a signed-in request, and wrong for two common cases:
|
|
185
|
+
|
|
186
|
+
- **The caller has no organization.** A cron, a scheduled job, or any CLI run
|
|
187
|
+
without a real member identity resolves no `orgId`, so only the user and solo
|
|
188
|
+
scopes are ever consulted — and a shared key is in neither.
|
|
189
|
+
- **The key was synced under a different organization.** `app_secrets` has no
|
|
190
|
+
scope visible to every org (`readAppSecret` is strict equality on
|
|
191
|
+
`(scope, scope_id, key)`), so a key the vault UI advertises as available to
|
|
192
|
+
every app is unreadable from any org except the one that ran the sync.
|
|
193
|
+
|
|
194
|
+
Both produce the same misleading "not set" that the split brain above produces,
|
|
195
|
+
which is why swapping `process.env` for `resolveCredential` can look like a fix
|
|
196
|
+
and change nothing. A workspace app should read shared keys through a resolver
|
|
197
|
+
that also sweeps the caller's other memberships and a designated vault org —
|
|
198
|
+
see `resolveConnectorSecret` and `AGENT_VAULT_ORG_ID` in the builder-workspace
|
|
199
|
+
repo for the shape, including the boot-time assertion that the deployment really
|
|
200
|
+
is single-tenant before a non-membership-gated fallback is safe.
|
|
201
|
+
|
|
202
|
+
**The doctor guard does not catch this second form** — it looks for
|
|
203
|
+
`process.env` reads, and `resolveCredential` is not one. Grep for
|
|
204
|
+
`resolveCredential` yourself and confirm each call sits somewhere a single-org
|
|
205
|
+
lookup is genuinely the right question. Findings that pair it with a
|
|
206
|
+
`?? process.env.KEY` fallback are the sanctioned deploy-level escape hatch; the
|
|
207
|
+
bugs are calls whose value can only live in another org's vault.
|
|
183
208
|
|
|
184
209
|
## HTTP routes
|
|
185
210
|
|
|
@@ -177,9 +177,34 @@ workspace repo:
|
|
|
177
177
|
npx agent-native doctor --only no-env-credentials
|
|
178
178
|
```
|
|
179
179
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
## `resolveCredential` sees exactly one organization
|
|
181
|
+
|
|
182
|
+
`resolveCredential(key, { userEmail, orgId })` checks the user scope, then the
|
|
183
|
+
one `orgId` you pass, then the solo workspace. That is the whole search. It is
|
|
184
|
+
correct for a signed-in request, and wrong for two common cases:
|
|
185
|
+
|
|
186
|
+
- **The caller has no organization.** A cron, a scheduled job, or any CLI run
|
|
187
|
+
without a real member identity resolves no `orgId`, so only the user and solo
|
|
188
|
+
scopes are ever consulted — and a shared key is in neither.
|
|
189
|
+
- **The key was synced under a different organization.** `app_secrets` has no
|
|
190
|
+
scope visible to every org (`readAppSecret` is strict equality on
|
|
191
|
+
`(scope, scope_id, key)`), so a key the vault UI advertises as available to
|
|
192
|
+
every app is unreadable from any org except the one that ran the sync.
|
|
193
|
+
|
|
194
|
+
Both produce the same misleading "not set" that the split brain above produces,
|
|
195
|
+
which is why swapping `process.env` for `resolveCredential` can look like a fix
|
|
196
|
+
and change nothing. A workspace app should read shared keys through a resolver
|
|
197
|
+
that also sweeps the caller's other memberships and a designated vault org —
|
|
198
|
+
see `resolveConnectorSecret` and `AGENT_VAULT_ORG_ID` in the builder-workspace
|
|
199
|
+
repo for the shape, including the boot-time assertion that the deployment really
|
|
200
|
+
is single-tenant before a non-membership-gated fallback is safe.
|
|
201
|
+
|
|
202
|
+
**The doctor guard does not catch this second form** — it looks for
|
|
203
|
+
`process.env` reads, and `resolveCredential` is not one. Grep for
|
|
204
|
+
`resolveCredential` yourself and confirm each call sits somewhere a single-org
|
|
205
|
+
lookup is genuinely the right question. Findings that pair it with a
|
|
206
|
+
`?? process.env.KEY` fallback are the sanctioned deploy-level escape hatch; the
|
|
207
|
+
bugs are calls whose value can only live in another org's vault.
|
|
183
208
|
|
|
184
209
|
## HTTP routes
|
|
185
210
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.124.
|
|
3
|
+
"version": "0.124.6",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|