@d4y/agent-runtime-nuxt 0.1.4 → 0.1.7

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/dist/module.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "compatibility": {
5
5
  "nuxt": ">=3.13.0"
6
6
  },
7
- "version": "0.1.4",
7
+ "version": "0.1.7",
8
8
  "builder": {
9
9
  "@nuxt/module-builder": "1.0.2",
10
10
  "unbuild": "unknown"
@@ -4,6 +4,11 @@ type __VLS_Props = {
4
4
  streaming?: boolean;
5
5
  resolveWorkspacePath?: ((relPath: string) => string | null | undefined) | null;
6
6
  resolveWorkspacePreviewPath?: ((relPath: string) => string | null | undefined) | null;
7
+ previewLinkLabel?: string;
8
+ downloadLinkLabel?: string;
9
+ pdfPreviewTitleLabel?: string;
10
+ htmlPreviewTitleLabel?: string;
11
+ showPdfEmbedToolbar?: boolean;
7
12
  };
8
13
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
9
14
  renderedChange: (rendered: boolean) => any;
@@ -11,6 +16,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
11
16
  onRenderedChange?: ((rendered: boolean) => any) | undefined;
12
17
  }>, {
13
18
  class: string | Record<string, boolean> | string[];
19
+ previewLinkLabel: string;
20
+ downloadLinkLabel: string;
21
+ pdfPreviewTitleLabel: string;
22
+ htmlPreviewTitleLabel: string;
23
+ showPdfEmbedToolbar: boolean;
14
24
  streaming: boolean;
15
25
  resolveWorkspacePath: ((relPath: string) => string | null | undefined) | null;
16
26
  resolveWorkspacePreviewPath: ((relPath: string) => string | null | undefined) | null;
@@ -8,13 +8,23 @@ const props = defineProps({
8
8
  class: { type: [String, Object, Array], required: false, default: "" },
9
9
  streaming: { type: Boolean, required: false, default: false },
10
10
  resolveWorkspacePath: { type: [Function, null], required: false, default: null },
11
- resolveWorkspacePreviewPath: { type: [Function, null], required: false, default: null }
11
+ resolveWorkspacePreviewPath: { type: [Function, null], required: false, default: null },
12
+ previewLinkLabel: { type: String, required: false, default: "Preview" },
13
+ downloadLinkLabel: { type: String, required: false, default: "Download" },
14
+ pdfPreviewTitleLabel: { type: String, required: false, default: "PDF preview" },
15
+ htmlPreviewTitleLabel: { type: String, required: false, default: "HTML preview" },
16
+ showPdfEmbedToolbar: { type: Boolean, required: false, default: false }
12
17
  });
13
- const { render } = useAgentRuntimeMarkdown({
18
+ const renderer = computed(() => useAgentRuntimeMarkdown({
14
19
  resolveWorkspacePath: (relPath) => props.resolveWorkspacePath?.(relPath) ?? null,
15
- resolveWorkspacePreviewPath: (relPath) => props.resolveWorkspacePreviewPath?.(relPath) ?? null
16
- });
17
- const html = computed(() => props.text ? render(props.text) : "");
20
+ resolveWorkspacePreviewPath: (relPath) => props.resolveWorkspacePreviewPath?.(relPath) ?? null,
21
+ previewLinkLabel: props.previewLinkLabel,
22
+ downloadLinkLabel: props.downloadLinkLabel,
23
+ pdfPreviewTitleLabel: props.pdfPreviewTitleLabel,
24
+ htmlPreviewTitleLabel: props.htmlPreviewTitleLabel,
25
+ showPdfEmbedToolbar: props.showPdfEmbedToolbar
26
+ }));
27
+ const html = computed(() => props.text ? renderer.value.render(props.text) : "");
18
28
  const dialogOpen = ref(false);
19
29
  const dialogFile = ref(null);
20
30
  const dialogPreviewSrc = ref(null);
@@ -57,7 +67,7 @@ watch(rendered, async (value) => {
57
67
  <div
58
68
  v-if="rendered"
59
69
  class="agent-runtime-markdown"
60
- :class="[props.class, streaming ? 'agent-runtime-markdown--streaming' : '']"
70
+ :class="props.class"
61
71
  @click="onClick"
62
72
  v-html="
63
73
  html
@@ -73,5 +83,5 @@ watch(rendered, async (value) => {
73
83
  </template>
74
84
 
75
85
  <style scoped>
76
- .agent-runtime-markdown{line-height:1.65}.agent-runtime-markdown--streaming{animation:agent-runtime-markdown-pulse .16s ease-out}.agent-runtime-markdown :deep(.agent-runtime-md-image-link){cursor:zoom-in;display:inline-block}.agent-runtime-markdown :deep(.agent-runtime-md-image){border-radius:.95rem;display:block;max-height:20rem;max-width:min(100%,30rem);-o-object-fit:contain;object-fit:contain}.agent-runtime-markdown :deep(.agent-runtime-md-file-link){color:inherit;text-decoration:underline;text-underline-offset:.18em}.agent-runtime-markdown :deep(.agent-runtime-md-html-shell),.agent-runtime-markdown :deep(.agent-runtime-md-pdf-shell){background:color-mix(in srgb,var(--ui-bg-elevated,rgba(248,250,252,.9)) 82%,transparent);border:1px solid color-mix(in srgb,var(--ui-border,rgba(148,163,184,.28)) 80%,transparent);border-radius:1rem;display:block;margin-top:.75rem;overflow:hidden}.agent-runtime-markdown :deep(.agent-runtime-md-embed-toolbar){align-items:center;border-bottom:1px solid color-mix(in srgb,var(--ui-border,rgba(148,163,184,.28)) 70%,transparent);display:flex;flex-wrap:wrap;font-size:.75rem;gap:.75rem;justify-content:space-between;padding:.75rem .9rem}.agent-runtime-markdown :deep(.agent-runtime-md-embed-label){font-family:var(--font-mono,ui-monospace,monospace);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-runtime-markdown :deep(.agent-runtime-md-embed-actions){display:inline-flex;flex-wrap:wrap;gap:.5rem}.agent-runtime-markdown :deep(.agent-runtime-md-download-link),.agent-runtime-markdown :deep(.agent-runtime-md-preview-link){color:inherit;text-decoration:underline;text-underline-offset:.18em}.agent-runtime-markdown :deep(.agent-runtime-md-preview-link[data-agent-runtime-preview=true]){cursor:zoom-in}.agent-runtime-markdown :deep(.agent-runtime-md-html-frame),.agent-runtime-markdown :deep(.agent-runtime-md-pdf-frame){background:color-mix(in srgb,var(--ui-bg,hsla(0,0%,100%,.94)) 85%,transparent);border:0;display:block;height:22rem;width:100%}@keyframes agent-runtime-markdown-pulse{0%{opacity:.88;transform:translateY(1px)}to{opacity:1;transform:translateY(0)}}
86
+ .agent-runtime-markdown{line-height:1.65}.agent-runtime-markdown :deep(.agent-runtime-md-image-link){cursor:zoom-in;display:inline-block}.agent-runtime-markdown :deep(.agent-runtime-md-image){border-radius:.95rem;display:block;max-height:20rem;max-width:min(100%,30rem);-o-object-fit:contain;object-fit:contain}.agent-runtime-markdown :deep(.agent-runtime-md-file-link){color:inherit;text-decoration:underline;text-underline-offset:.18em}.agent-runtime-markdown :deep(.agent-runtime-md-html-shell),.agent-runtime-markdown :deep(.agent-runtime-md-pdf-shell){background:color-mix(in srgb,var(--ui-bg-elevated,rgba(248,250,252,.9)) 82%,transparent);border:1px solid color-mix(in srgb,var(--ui-border,rgba(148,163,184,.28)) 80%,transparent);border-radius:1rem;display:block;margin-top:.75rem;overflow:hidden}.agent-runtime-markdown :deep(.agent-runtime-md-embed-toolbar){align-items:center;border-bottom:1px solid color-mix(in srgb,var(--ui-border,rgba(148,163,184,.28)) 70%,transparent);display:flex;flex-wrap:wrap;font-size:.75rem;gap:.75rem;justify-content:space-between;padding:.75rem .9rem}.agent-runtime-markdown :deep(.agent-runtime-md-embed-label){font-family:var(--font-mono,ui-monospace,monospace);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-runtime-markdown :deep(.agent-runtime-md-embed-actions){display:inline-flex;flex-wrap:wrap;gap:.5rem}.agent-runtime-markdown :deep(.agent-runtime-md-download-link),.agent-runtime-markdown :deep(.agent-runtime-md-preview-link){color:inherit;text-decoration:underline;text-underline-offset:.18em}.agent-runtime-markdown :deep(.agent-runtime-md-preview-link[data-agent-runtime-preview=true]){cursor:zoom-in}.agent-runtime-markdown :deep(.agent-runtime-md-html-frame),.agent-runtime-markdown :deep(.agent-runtime-md-pdf-frame){background:color-mix(in srgb,var(--ui-bg,hsla(0,0%,100%,.94)) 85%,transparent);border:0;display:block;height:22rem;width:100%}
77
87
  </style>
@@ -4,6 +4,11 @@ type __VLS_Props = {
4
4
  streaming?: boolean;
5
5
  resolveWorkspacePath?: ((relPath: string) => string | null | undefined) | null;
6
6
  resolveWorkspacePreviewPath?: ((relPath: string) => string | null | undefined) | null;
7
+ previewLinkLabel?: string;
8
+ downloadLinkLabel?: string;
9
+ pdfPreviewTitleLabel?: string;
10
+ htmlPreviewTitleLabel?: string;
11
+ showPdfEmbedToolbar?: boolean;
7
12
  };
8
13
  declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
9
14
  renderedChange: (rendered: boolean) => any;
@@ -11,6 +16,11 @@ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {
11
16
  onRenderedChange?: ((rendered: boolean) => any) | undefined;
12
17
  }>, {
13
18
  class: string | Record<string, boolean> | string[];
19
+ previewLinkLabel: string;
20
+ downloadLinkLabel: string;
21
+ pdfPreviewTitleLabel: string;
22
+ htmlPreviewTitleLabel: string;
23
+ showPdfEmbedToolbar: boolean;
14
24
  streaming: boolean;
15
25
  resolveWorkspacePath: ((relPath: string) => string | null | undefined) | null;
16
26
  resolveWorkspacePreviewPath: ((relPath: string) => string | null | undefined) | null;
@@ -1,6 +1,11 @@
1
1
  import MarkdownIt from 'markdown-it';
2
2
  import { type AgentRuntimeAssetResolverOptions } from '../utils/files.js';
3
3
  export interface AgentRuntimeMarkdownRenderOptions extends AgentRuntimeAssetResolverOptions {
4
+ previewLinkLabel?: string;
5
+ downloadLinkLabel?: string;
6
+ pdfPreviewTitleLabel?: string;
7
+ htmlPreviewTitleLabel?: string;
8
+ showPdfEmbedToolbar?: boolean;
4
9
  }
5
10
  export declare const createAgentRuntimeMarkdownRenderer: (options?: AgentRuntimeMarkdownRenderOptions) => MarkdownIt;
6
11
  export declare const useAgentRuntimeMarkdown: (options?: AgentRuntimeMarkdownRenderOptions) => {
@@ -33,7 +33,7 @@ const buildImageMarkup = (md, asset, alt, title) => {
33
33
  const attrs = previewAttrs(md, asset);
34
34
  return `<a href="${safePreviewUrl}" target="_blank" rel="noopener noreferrer" class="agent-runtime-md-image-link" ${attrs}><img src="${safePreviewUrl}" alt="${safeAlt}" loading="lazy" class="agent-runtime-md-image"${titleAttr} /></a>`;
35
35
  };
36
- const buildPreviewShellMarkup = (md, asset, label) => {
36
+ const buildPreviewShellMarkup = (md, asset, label, options) => {
37
37
  const previewUrl = asset.previewUrl;
38
38
  if (!previewUrl) {
39
39
  return buildDownloadLinkMarkup(md, asset, label);
@@ -44,16 +44,19 @@ const buildPreviewShellMarkup = (md, asset, label) => {
44
44
  const shellClass = asset.kind === "pdf" ? "agent-runtime-md-pdf-shell" : "agent-runtime-md-html-shell";
45
45
  const frameClass = asset.kind === "pdf" ? "agent-runtime-md-pdf-frame" : "agent-runtime-md-html-frame";
46
46
  const frameAttrs = asset.kind === "pdf" ? "" : ' sandbox="" referrerpolicy="no-referrer"';
47
- const title = asset.kind === "pdf" ? `PDF preview: ${label}` : `HTML preview: ${label}`;
48
- const downloadButton = asset.canDownload && asset.rawUrl ? `<a href="${escapeAttr(md, asset.rawUrl)}" target="_blank" rel="noopener noreferrer" class="agent-runtime-md-download-link">Download</a>` : "";
49
- return `<span class="${shellClass}"><span class="agent-runtime-md-embed-toolbar"><span class="agent-runtime-md-embed-label">${safeLabel}</span><span class="agent-runtime-md-embed-actions"><a href="${safePreviewUrl}" target="_blank" rel="noopener noreferrer" class="agent-runtime-md-preview-link" ${attrs}>Preview</a>${downloadButton}</span></span><iframe src="${safePreviewUrl}" title="${escapeAttr(md, title)}" loading="lazy"${frameAttrs} class="${frameClass}"></iframe></span>`;
47
+ const titleLabel = asset.kind === "pdf" ? options.pdfPreviewTitleLabel ?? "PDF preview" : options.htmlPreviewTitleLabel ?? "HTML preview";
48
+ const title = `${titleLabel}: ${label}`;
49
+ const showToolbar = asset.kind !== "pdf" || options.showPdfEmbedToolbar === true;
50
+ const downloadButton = asset.canDownload && asset.rawUrl ? `<a href="${escapeAttr(md, asset.rawUrl)}" target="_blank" rel="noopener noreferrer" class="agent-runtime-md-download-link">${escapeAttr(md, options.downloadLinkLabel ?? "Download")}</a>` : "";
51
+ const toolbar = showToolbar ? `<span class="agent-runtime-md-embed-toolbar"><span class="agent-runtime-md-embed-label">${safeLabel}</span><span class="agent-runtime-md-embed-actions"><a href="${safePreviewUrl}" target="_blank" rel="noopener noreferrer" class="agent-runtime-md-preview-link" ${attrs}>${escapeAttr(md, options.previewLinkLabel ?? "Preview")}</a>${downloadButton}</span></span>` : "";
52
+ return `<span class="${shellClass}">${toolbar}<iframe src="${safePreviewUrl}" title="${escapeAttr(md, title)}" loading="lazy"${frameAttrs} class="${frameClass}"></iframe></span>`;
50
53
  };
51
54
  const toHtmlToken = (state, markup) => {
52
55
  const token = new state.Token("html_inline", "", 0);
53
56
  token.content = markup;
54
57
  return token;
55
58
  };
56
- const renderWorkspaceLink = (md, asset, label) => {
59
+ const renderWorkspaceLink = (md, asset, label, options) => {
57
60
  if (asset.kind === "blocked") {
58
61
  return escapeAttr(md, label);
59
62
  }
@@ -61,7 +64,7 @@ const renderWorkspaceLink = (md, asset, label) => {
61
64
  return buildImageMarkup(md, asset, label);
62
65
  }
63
66
  if (asset.kind === "html" || asset.kind === "pdf") {
64
- return buildPreviewShellMarkup(md, asset, label);
67
+ return buildPreviewShellMarkup(md, asset, label, options);
65
68
  }
66
69
  return buildDownloadLinkMarkup(md, asset, label);
67
70
  };
@@ -107,7 +110,7 @@ export const createAgentRuntimeMarkdownRenderer = (options = {}) => {
107
110
  if (asset.kind === "image") {
108
111
  return buildImageMarkup(md, asset, alt, title);
109
112
  }
110
- return renderWorkspaceLink(md, asset, alt || asset.label);
113
+ return renderWorkspaceLink(md, asset, alt || asset.label, options);
111
114
  };
112
115
  md.core.ruler.after("inline", "agent_runtime_workspace_links", (state) => {
113
116
  for (const blockToken of state.tokens) {
@@ -128,7 +131,7 @@ export const createAgentRuntimeMarkdownRenderer = (options = {}) => {
128
131
  out.push(child);
129
132
  continue;
130
133
  }
131
- out.push(toHtmlToken(state, renderWorkspaceLink(md, asset, next.content || asset.label)));
134
+ out.push(toHtmlToken(state, renderWorkspaceLink(md, asset, next.content || asset.label, options)));
132
135
  idx += 2;
133
136
  }
134
137
  blockToken.children = out;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@d4y/agent-runtime-nuxt",
3
- "version": "0.1.4",
3
+ "version": "0.1.7",
4
4
  "description": "Headless Nuxt module that connects a Nuxt app to an agent-runtime server. Ships server-side proxy routes (so your X-Agent-Runtime-App-Key never leaves the server) and a single composable, useAgentRuntime(), that exposes a typed chat client.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -52,8 +52,8 @@
52
52
  "agent"
53
53
  ],
54
54
  "scripts": {
55
- "prepack": "nuxt-module-build build",
56
- "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare",
55
+ "prepack": "./node_modules/.bin/nuxt-module-build build",
56
+ "dev:prepare": "./node_modules/.bin/nuxt-module-build build --stub && ./node_modules/.bin/nuxt-module-build prepare",
57
57
  "typecheck": "tsc --noEmit -p tsconfig.json"
58
58
  },
59
59
  "dependencies": {