@slopus/happy-agent-client 0.0.116 → 0.0.119

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 CHANGED
@@ -513,7 +513,8 @@ from a closed subset of CSS; check every value with `mediaLayoutStyleValue(key,
513
513
  any it refuses. Use the automatic layout when `layout` is absent or unrecognized, ignore unknown
514
514
  style fields, skip out-of-range or repeated item nodes, and show items a tree leaves out after it.
515
515
  An image without explicit sizing shows at its natural size, shrunk to fit and never enlarged, in
516
- every layout. Read an item's bytes with
516
+ every layout. An item's optional `source`, `{ path, absolutePath }`, names the file it came
517
+ from, so layout blocks in agent text can place it. Read an item's bytes with
517
518
  `getToolCallMedia(agentId, toolCallId, index)`, ranges and `ifNoneMatch` included, or hand
518
519
  `toolCallMediaUrl(agentId, toolCallId, index)` to an image, video, or document element through a
519
520
  transport that adds the bearer token. The URL's content never changes. `ArtifactPresentation`
@@ -565,6 +566,27 @@ the daemon agree on what is a tag:
565
566
  Show a resolved reference as a link whose text is the live title. Indicate a busy entity on the
566
567
  link. Show unknown kinds and unresolvable references as inert placeholder text.
567
568
 
569
+ ## Media layouts in text
570
+
571
+ Agent text may arrange media already shown in the conversation with plain HTML blocks such as
572
+ `<div style="display: grid; grid-template-columns: 1fr 1fr"><img src="a.png"><img src="b.png"></div>`,
573
+ as API.md specifies under "Media layouts in text". This package holds the one splitter and parser:
574
+
575
+ - `splitMediaLayoutBlocks(markdown)` splits text into `markdown` and `layout` segments that join
576
+ back to the input. A block starts at a line beginning with `<div`, `<section`, `<figure`, `<p`,
577
+ or `<img`, outside code, and runs until its root element closes, across blank lines. A block
578
+ without an `<img` stays Markdown. A block that never closes is the last segment, with
579
+ `complete: false`: hold it while the text streams, and show it as Markdown once it is final.
580
+ - `parseMediaLayoutHtml(html, resolve)` reads one block, or `present_files`' layout, into
581
+ `MediaLayoutNode`s. `resolve(src)` returns an index into a list of items the caller builds, or
582
+ `undefined`; the result reports the indexes `placed`, what was `ignored`, and whether content
583
+ was `truncated` by a limit. Resolve each `src` to the most recent earlier media item for which
584
+ `mediaSourceMatches(item.source, src)` holds, and show the tree with those items as a `tree`
585
+ layout. Show the block as Markdown when nothing was placed or content was truncated.
586
+ - `stripMediaLayoutBlocks(markdown)` is the fallback for surfaces that cannot show blocks.
587
+
588
+ Never load a `src` yourself; show only the matched item's snapshot.
589
+
568
590
  ## File links
569
591
 
570
592
  A file outside the reader's own workspace is linked as an ordinary Markdown link to a `happy-file`
package/dist/index.d.ts CHANGED
@@ -18,6 +18,8 @@ export type { MessageDeltaApplication } from "./applyMessageDelta.js";
18
18
  export * from "./requestOptions.js";
19
19
  export * from "./happyFileLinks.js";
20
20
  export * from "./happyReferences.js";
21
+ export * from "./mediaLayoutBlocks.js";
22
+ export * from "./mediaLayoutHtml.js";
21
23
  export { artifactAddressPublic, artifactAddressLoopback, artifactNetworkHost, } from "./artifactNetwork.js";
22
24
  export * from "./protocol/agents.js";
23
25
  export * from "./protocol/artifacts.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACR,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,YAAY,EACR,mBAAmB,EACnB,yBAAyB,EACzB,uBAAuB,EACvB,0BAA0B,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACR,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,WAAW,GACnB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAC;AAC/E,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACtE,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -10,6 +10,8 @@ export { applyMessageDelta } from "./applyMessageDelta.js";
10
10
  export * from "./requestOptions.js";
11
11
  export * from "./happyFileLinks.js";
12
12
  export * from "./happyReferences.js";
13
+ export * from "./mediaLayoutBlocks.js";
14
+ export * from "./mediaLayoutHtml.js";
13
15
  export { artifactAddressPublic, artifactAddressLoopback, artifactNetworkHost, } from "./artifactNetwork.js";
14
16
  export * from "./protocol/agents.js";
15
17
  export * from "./protocol/artifacts.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GAIzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../sources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAajD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,sBAAsB,GAIzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,OAAO,EACH,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,GACtB,MAAM,sBAAsB,CAAC;AAE9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC"}
@@ -11,6 +11,15 @@ export declare function textBlocks(markdown: string): {
11
11
  start: number;
12
12
  end: number;
13
13
  }[];
14
+ /** A fenced code block's opening run, when `line` opens one. */
15
+ export interface MarkdownFence {
16
+ readonly marker: string;
17
+ readonly length: number;
18
+ }
19
+ /** The fence `line` opens, or `undefined` when it opens none. */
20
+ export declare function fenceOpening(line: string): MarkdownFence | undefined;
21
+ /** Whether `line` closes the open `fence`. */
22
+ export declare function isFenceClose(line: string, fence: MarkdownFence): boolean;
14
23
  /**
15
24
  * Skips a code span that opens at `start`, returning the index after it. Backticks with no
16
25
  * closing run of the same length are literal, except at the end of streaming text, where the
@@ -1 +1 @@
1
- {"version":3,"file":"markdownBlocks.d.ts","sourceRoot":"","sources":["../sources/markdownBlocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CA8B7E;AAOD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAWhG"}
1
+ {"version":3,"file":"markdownBlocks.d.ts","sourceRoot":"","sources":["../sources/markdownBlocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CA4B7E;AAED,gEAAgE;AAChE,MAAM,WAAW,aAAa;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAMpE;AAED,8CAA8C;AAC9C,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,GAAG,OAAO,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAWhG"}
@@ -23,14 +23,12 @@ export function textBlocks(markdown) {
23
23
  fence = undefined;
24
24
  }
25
25
  else {
26
- const open = FENCE_OPEN.exec(line);
27
- const marker = open?.[1];
28
- const info = open?.[2] ?? "";
29
- if (marker !== undefined && !(marker.startsWith("`") && info.includes("`"))) {
26
+ const open = fenceOpening(line);
27
+ if (open !== undefined) {
30
28
  if (blockStart !== undefined)
31
29
  blocks.push({ start: blockStart, end: lineStart });
32
30
  blockStart = undefined;
33
- fence = { marker: marker.charAt(0), length: marker.length };
31
+ fence = open;
34
32
  }
35
33
  else if (BLANK_LINE.test(line)) {
36
34
  if (blockStart !== undefined)
@@ -47,7 +45,17 @@ export function textBlocks(markdown) {
47
45
  blocks.push({ start: blockStart, end: markdown.length });
48
46
  return blocks;
49
47
  }
50
- function isFenceClose(line, fence) {
48
+ /** The fence `line` opens, or `undefined` when it opens none. */
49
+ export function fenceOpening(line) {
50
+ const open = FENCE_OPEN.exec(line);
51
+ const marker = open?.[1];
52
+ const info = open?.[2] ?? "";
53
+ if (marker === undefined || (marker.startsWith("`") && info.includes("`")))
54
+ return undefined;
55
+ return { marker: marker.charAt(0), length: marker.length };
56
+ }
57
+ /** Whether `line` closes the open `fence`. */
58
+ export function isFenceClose(line, fence) {
51
59
  const close = /^[ \t]*(?:>[ \t]?)*[ \t]*(`+|~+)[ \t\r]*$/.exec(line)?.[1];
52
60
  return close !== undefined && close.charAt(0) === fence.marker && close.length >= fence.length;
53
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"markdownBlocks.js","sourceRoot":"","sources":["../sources/markdownBlocks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,GAAG,6CAA6C,CAAC;AACjE,MAAM,UAAU,GAAG,YAAY,CAAC;AAEhC;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB;IACvC,MAAM,MAAM,GAAqC,EAAE,CAAC;IACpD,IAAI,UAA8B,CAAC;IACnC,IAAI,KAAqD,CAAC;IAC1D,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,OAAO,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACnF,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC;gBAAE,KAAK,GAAG,SAAS,CAAC;QACrD,CAAC;aAAM,CAAC;YACJ,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC1E,IAAI,UAAU,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjF,UAAU,GAAG,SAAS,CAAC;gBACvB,KAAK,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;YAChE,CAAC;iBAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,IAAI,UAAU,KAAK,SAAS;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;gBACjF,UAAU,GAAG,SAAS,CAAC;YAC3B,CAAC;iBAAM,CAAC;gBACJ,UAAU,KAAK,SAAS,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,SAAS,GAAG,OAAO,CAAC;IACxB,CAAC;IACD,IAAI,UAAU,KAAK,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvF,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,KAAyC;IACzE,MAAM,KAAK,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC;AACnG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,KAAa,EAAE,GAAW,EAAE,IAAa;IACpF,MAAM,MAAM,GAAG,SAAS,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC3B,OAAO,KAAK,GAAG,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1C,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,IAAI,GAAG;YAAE,MAAM;QACtC,MAAM,OAAO,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,OAAO,KAAK,MAAM;YAAE,OAAO,IAAI,GAAG,OAAO,CAAC;QAC9C,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC;IAC3B,CAAC;IACD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;AACvC,CAAC;AAED,SAAS,SAAS,CAAC,IAAY,EAAE,KAAa,EAAE,SAAiB;IAC7D,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,SAAS;QAAE,KAAK,IAAI,CAAC,CAAC;IAC7C,OAAO,KAAK,GAAG,KAAK,CAAC;AACzB,CAAC"}
1
+ {"version":3,"file":"markdownBlocks.js","sourceRoot":"","sources":["../sources/markdownBlocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Media layout blocks: plain HTML an agent writes in its Markdown reply to arrange media it
3
+ * already showed in the conversation, such as
4
+ * `<div style="display: grid; grid-template-columns: 1fr 1fr"><img src="a.png"><img src="b.png"></div>`.
5
+ * This finds the blocks; `parseMediaLayoutHtml` reads each one, and a client resolves every
6
+ * `<img src>` to an earlier media item with `mediaSourceMatches`. Nothing is ever loaded from
7
+ * `src`.
8
+ *
9
+ * A block starts at the start of a line, indented at most three spaces, with `<div`, `<section`,
10
+ * `<figure`, `<p`, or `<img`, outside fenced code and outside a code span. It runs until its root
11
+ * element closes, counting only that tag, so blank lines inside it never end it, and then takes
12
+ * the rest of the line it closes on. A block holding no `<img>` is ordinary Markdown.
13
+ */
14
+ import type { MediaItemSource } from "./protocol/messages.js";
15
+ /**
16
+ * Markdown split around its layout blocks; the segments' text joined in order is the input.
17
+ * A `layout` segment that is not `complete` is always the last: its root element never closed,
18
+ * either because the text is still streaming or because the agent never closed it.
19
+ */
20
+ export type MediaLayoutBlockSegment = {
21
+ type: "markdown";
22
+ text: string;
23
+ } | {
24
+ type: "layout";
25
+ html: string;
26
+ complete: boolean;
27
+ };
28
+ /** Splits Markdown into Markdown and the layout blocks in it. Empty Markdown is omitted. */
29
+ export declare function splitMediaLayoutBlocks(markdown: string): MediaLayoutBlockSegment[];
30
+ /**
31
+ * Markdown without its complete layout blocks, for a surface that cannot show them, such as a
32
+ * chat service the reply is relayed to. The blank lines around a removed block close up to one.
33
+ * An incomplete block is broken HTML rather than a layout, so it stays as written.
34
+ */
35
+ export declare function stripMediaLayoutBlocks(markdown: string): string;
36
+ /**
37
+ * Whether an `<img src>` in a layout block names the media item with this source: `src` equals
38
+ * the path the agent wrote or its absolute path, exactly. An item without a source never matches.
39
+ */
40
+ export declare function mediaSourceMatches(source: MediaItemSource | undefined, src: string): boolean;
41
+ //# sourceMappingURL=mediaLayoutBlocks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaLayoutBlocks.d.ts","sourceRoot":"","sources":["../sources/mediaLayoutBlocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAC7B;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC;AAQ1D,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,uBAAuB,EAAE,CAgElF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAkB/D;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5F"}
@@ -0,0 +1,237 @@
1
+ /**
2
+ * Media layout blocks: plain HTML an agent writes in its Markdown reply to arrange media it
3
+ * already showed in the conversation, such as
4
+ * `<div style="display: grid; grid-template-columns: 1fr 1fr"><img src="a.png"><img src="b.png"></div>`.
5
+ * This finds the blocks; `parseMediaLayoutHtml` reads each one, and a client resolves every
6
+ * `<img src>` to an earlier media item with `mediaSourceMatches`. Nothing is ever loaded from
7
+ * `src`.
8
+ *
9
+ * A block starts at the start of a line, indented at most three spaces, with `<div`, `<section`,
10
+ * `<figure`, `<p`, or `<img`, outside fenced code and outside a code span. It runs until its root
11
+ * element closes, counting only that tag, so blank lines inside it never end it, and then takes
12
+ * the rest of the line it closes on. A block holding no `<img>` is ordinary Markdown.
13
+ */
14
+ import { fenceOpening, isFenceClose, skipCodeSpan } from "./markdownBlocks.js";
15
+ const BLOCK_TAGS = ["div", "section", "figure", "p", "img"];
16
+ const BLOCK_START = /^ {0,3}<(div|section|figure|p|img)(?=[\t\n\f\r />]|$)/iu;
17
+ const PARTIAL_START = /^ {0,3}<([a-z]*)$/iu;
18
+ const BLANK_LINE = /^[ \t\r]*$/u;
19
+ const TAG_NAME = /[A-Za-z][A-Za-z0-9-]*/uy;
20
+ /** Splits Markdown into Markdown and the layout blocks in it. Empty Markdown is omitted. */
21
+ export function splitMediaLayoutBlocks(markdown) {
22
+ const segments = [];
23
+ const pushMarkdown = (text) => {
24
+ if (text === "")
25
+ return;
26
+ const last = segments[segments.length - 1];
27
+ if (last?.type === "markdown")
28
+ last.text += text;
29
+ else
30
+ segments.push({ type: "markdown", text });
31
+ };
32
+ let markdownStart = 0;
33
+ let lineStart = 0;
34
+ let fence;
35
+ // Where the code span covering the current paragraph's text ends; nothing starts before it.
36
+ let codeUntil = 0;
37
+ while (lineStart < markdown.length) {
38
+ const newline = markdown.indexOf("\n", lineStart);
39
+ const lineEnd = newline === -1 ? markdown.length : newline + 1;
40
+ const line = markdown.slice(lineStart, newline === -1 ? markdown.length : newline);
41
+ if (fence !== undefined) {
42
+ if (isFenceClose(line, fence))
43
+ fence = undefined;
44
+ lineStart = lineEnd;
45
+ continue;
46
+ }
47
+ const opening = fenceOpening(line);
48
+ if (opening !== undefined) {
49
+ fence = opening;
50
+ lineStart = lineEnd;
51
+ continue;
52
+ }
53
+ if (BLANK_LINE.test(line)) {
54
+ lineStart = lineEnd;
55
+ continue;
56
+ }
57
+ if (lineStart >= codeUntil) {
58
+ const start = BLOCK_START.exec(line);
59
+ if (start !== null) {
60
+ const tag = (start[1] ?? "").toLowerCase();
61
+ const block = scanBlock(markdown, lineStart + start[0].length - tag.length - 1, tag);
62
+ pushMarkdown(markdown.slice(markdownStart, lineStart));
63
+ const html = markdown.slice(lineStart, block.end);
64
+ if (!block.complete) {
65
+ segments.push({ type: "layout", html, complete: false });
66
+ return segments;
67
+ }
68
+ if (block.image)
69
+ segments.push({ type: "layout", html, complete: true });
70
+ else
71
+ pushMarkdown(html);
72
+ markdownStart = block.end;
73
+ lineStart = block.end;
74
+ continue;
75
+ }
76
+ if (newline === -1 && isPartialStart(line)) {
77
+ pushMarkdown(markdown.slice(markdownStart, lineStart));
78
+ segments.push({ type: "layout", html: line, complete: false });
79
+ return segments;
80
+ }
81
+ }
82
+ codeUntil = skipCodeSpans(markdown, Math.max(lineStart, codeUntil), lineEnd, codeUntil);
83
+ lineStart = lineEnd;
84
+ }
85
+ pushMarkdown(markdown.slice(markdownStart));
86
+ return segments;
87
+ }
88
+ /**
89
+ * Markdown without its complete layout blocks, for a surface that cannot show them, such as a
90
+ * chat service the reply is relayed to. The blank lines around a removed block close up to one.
91
+ * An incomplete block is broken HTML rather than a layout, so it stays as written.
92
+ */
93
+ export function stripMediaLayoutBlocks(markdown) {
94
+ let text = "";
95
+ let removed = false;
96
+ for (const segment of splitMediaLayoutBlocks(markdown)) {
97
+ if (segment.type === "layout" && segment.complete) {
98
+ removed = true;
99
+ continue;
100
+ }
101
+ let part = segment.type === "markdown" ? segment.text : segment.html;
102
+ if (removed) {
103
+ part = part.replace(/^(?:[ \t]*\r?\n)+/u, "");
104
+ if (part === "")
105
+ continue;
106
+ text = text === "" ? "" : `${text.replace(/(?:\r?\n[ \t]*)+$/u, "")}\n\n`;
107
+ removed = false;
108
+ }
109
+ text += part;
110
+ }
111
+ return removed ? text.replace(/\s+$/u, "") : text;
112
+ }
113
+ /**
114
+ * Whether an `<img src>` in a layout block names the media item with this source: `src` equals
115
+ * the path the agent wrote or its absolute path, exactly. An item without a source never matches.
116
+ */
117
+ export function mediaSourceMatches(source, src) {
118
+ return source !== undefined && (src === source.path || src === source.absolutePath);
119
+ }
120
+ /** Whether a final line without its newline could still become a block start. */
121
+ function isPartialStart(line) {
122
+ const name = PARTIAL_START.exec(line)?.[1]?.toLowerCase();
123
+ return name !== undefined && BLOCK_TAGS.some((tag) => tag.startsWith(name));
124
+ }
125
+ /**
126
+ * Where the block whose root `tag` opens at `start` ends: after the line its root element closes
127
+ * on. Comments and quoted attribute values are skipped. Incomplete when the root never closes, or
128
+ * a tag or comment is cut off.
129
+ */
130
+ function scanBlock(markdown, start, tag) {
131
+ const incomplete = { end: markdown.length, complete: false, image: false };
132
+ let depth = 0;
133
+ let image = false;
134
+ let index = start;
135
+ while (index < markdown.length) {
136
+ if (markdown[index] !== "<") {
137
+ index += 1;
138
+ continue;
139
+ }
140
+ if (markdown.startsWith("<!--", index)) {
141
+ const close = markdown.indexOf("-->", index + 4);
142
+ if (close === -1)
143
+ return incomplete;
144
+ index = close + 3;
145
+ continue;
146
+ }
147
+ const closing = markdown[index + 1] === "/";
148
+ TAG_NAME.lastIndex = index + (closing ? 2 : 1);
149
+ const name = TAG_NAME.exec(markdown)?.[0].toLowerCase();
150
+ if (name === undefined) {
151
+ index += 1;
152
+ continue;
153
+ }
154
+ const tagEnd = closing
155
+ ? markdown.indexOf(">", TAG_NAME.lastIndex)
156
+ : openTagEnd(markdown, TAG_NAME.lastIndex);
157
+ if (tagEnd === -1)
158
+ return incomplete;
159
+ index = tagEnd + 1;
160
+ if (!closing && name === "img")
161
+ image = true;
162
+ if (name !== tag)
163
+ continue;
164
+ if (closing)
165
+ depth -= 1;
166
+ else if (tag !== "img")
167
+ depth += 1;
168
+ if (depth > 0)
169
+ continue;
170
+ const newline = markdown.indexOf("\n", index);
171
+ return { end: newline === -1 ? markdown.length : newline + 1, complete: true, image };
172
+ }
173
+ return incomplete;
174
+ }
175
+ /** The index of the `>` ending an open tag whose attributes start at `index`, or -1. */
176
+ function openTagEnd(markdown, index) {
177
+ let position = index;
178
+ let afterEquals = false;
179
+ while (position < markdown.length) {
180
+ const character = markdown[position];
181
+ if (character === ">")
182
+ return position;
183
+ if ((character === '"' || character === "'") && afterEquals) {
184
+ const close = markdown.indexOf(character, position + 1);
185
+ if (close === -1)
186
+ return -1;
187
+ position = close + 1;
188
+ afterEquals = false;
189
+ continue;
190
+ }
191
+ if (character === "=")
192
+ afterEquals = true;
193
+ else if (!/\s/u.test(character ?? ""))
194
+ afterEquals = false;
195
+ position += 1;
196
+ }
197
+ return -1;
198
+ }
199
+ /**
200
+ * Skips the code spans that open in `[from, lineEnd)`, returning where the last one ends, or
201
+ * `codeUntil` when none opens. A span is bounded by its paragraph, which a blank line or a fence
202
+ * ends.
203
+ */
204
+ function skipCodeSpans(markdown, from, lineEnd, codeUntil) {
205
+ let until = codeUntil;
206
+ let index = from;
207
+ let end;
208
+ while (index < lineEnd) {
209
+ const character = markdown[index];
210
+ if (character === "\\") {
211
+ index += 2;
212
+ }
213
+ else if (character === "`") {
214
+ end ??= paragraphEnd(markdown, lineEnd);
215
+ index = skipCodeSpan(markdown, index, end, false);
216
+ until = index;
217
+ }
218
+ else {
219
+ index += 1;
220
+ }
221
+ }
222
+ return until;
223
+ }
224
+ function paragraphEnd(markdown, from) {
225
+ let lineStart = from;
226
+ while (lineStart < markdown.length) {
227
+ const newline = markdown.indexOf("\n", lineStart);
228
+ const line = markdown.slice(lineStart, newline === -1 ? markdown.length : newline);
229
+ if (BLANK_LINE.test(line) || fenceOpening(line) !== undefined)
230
+ return lineStart;
231
+ if (newline === -1)
232
+ return markdown.length;
233
+ lineStart = newline + 1;
234
+ }
235
+ return markdown.length;
236
+ }
237
+ //# sourceMappingURL=mediaLayoutBlocks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaLayoutBlocks.js","sourceRoot":"","sources":["../sources/mediaLayoutBlocks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Media layout HTML: the small subset of HTML and CSS an agent writes to arrange media it showed,
3
+ * either as `present_files`' `layout` argument or as a block in its Markdown reply. This one
4
+ * parser turns it into the typed tree clients render, so the daemon and every client agree on
5
+ * exactly what a layout means. No HTML ever reaches a renderer.
6
+ */
7
+ import type { MediaLayoutNode } from "./protocol/messages.js";
8
+ /** The most layout HTML that is read, in UTF-16 code units; a longer layout is not used. */
9
+ export declare const MAX_MEDIA_LAYOUT_HTML_LENGTH: number;
10
+ /**
11
+ * Names the media an `<img src>` refers to as an index into the caller's own list of items, or
12
+ * `undefined` when it names nothing. The parser never loads `src` itself.
13
+ */
14
+ export type MediaLayoutSourceResolver = (src: string) => number | undefined;
15
+ /** What layout HTML became. */
16
+ export interface ParsedMediaLayoutHtml {
17
+ /** The typed tree; each item node's `index` is what the resolver returned for its `src`. */
18
+ readonly root: MediaLayoutNode[];
19
+ /** The indexes the tree places, in order, each once. */
20
+ readonly placed: readonly number[];
21
+ /** Short descriptions of what was left out, such as `position on <div>`, for the agent. */
22
+ readonly ignored: readonly string[];
23
+ /**
24
+ * Whether content was lost to a limit: the whole HTML was too long, or nodes or text beyond
25
+ * the tree's bounds were dropped. Unsupported markup left out on purpose does not count.
26
+ */
27
+ readonly truncated: boolean;
28
+ }
29
+ /**
30
+ * Turn media layout HTML into the typed tree a client renders.
31
+ *
32
+ * The HTML is parsed by parse5, a spec-compliant parser, so tags, attributes, and entities mean
33
+ * what a browser would take them to mean, and malformed markup is repaired the way a browser
34
+ * repairs it. The tree is then rebuilt from what the subset allows, and nothing fails: a tag the
35
+ * subset lacks is unwrapped and its content kept, a tag that runs, loads, or embeds something is
36
+ * left out with its content, other attributes and declarations are left out, and an image whose
37
+ * `src` the resolver does not know, or whose item is already placed, is left out. Everything left
38
+ * out is reported. Deciding what a layout that places nothing means is the caller's.
39
+ */
40
+ export declare function parseMediaLayoutHtml(source: string, resolve: MediaLayoutSourceResolver): ParsedMediaLayoutHtml;
41
+ //# sourceMappingURL=mediaLayoutHtml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaLayoutHtml.d.ts","sourceRoot":"","sources":["../sources/mediaLayoutHtml.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAkB,MAAM,wBAAwB,CAAC;AAK9E,4FAA4F;AAC5F,eAAO,MAAM,4BAA4B,QAAY,CAAC;AA2DtD;;;GAGG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAE5E,+BAA+B;AAC/B,MAAM,WAAW,qBAAqB;IAClC,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,EAAE,eAAe,EAAE,CAAC;IACjC,wDAAwD;IACxD,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC/B;AAWD;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAChC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,yBAAyB,GACnC,qBAAqB,CAuCvB"}