@pagelines/sdk 1.0.678 → 1.0.679

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.
@@ -1 +1 @@
1
- {"version":3,"file":"FModal.vue_vue_type_script_setup_true_lang.js","sources":["../../../src/ui/common/FClose.vue","../../../src/ui/common/FModal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { onMounted, ref } from 'vue'\n\ndefineOptions({ name: 'FClose' })\n\ndefineProps<{\n ariaLabel?: string\n}>()\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst inView = ref(false)\n\nonMounted(() => {\n setTimeout(() => {\n inView.value = true\n }, 100)\n})\n</script>\n\n<template>\n <button\n type=\"button\"\n :aria-label=\"ariaLabel || 'Close'\"\n class=\"close block cursor-pointer w-[60px] h-[60px] rounded-full transition-all duration-1000 ease-[cubic-bezier(0.25,1,0.33,1)] hover:scale-110 active:scale-90 hover:rotate-90\"\n @click=\"$emit('click', $event)\"\n >\n <!-- Background circle (invisible, for hover area) -->\n <span class=\"absolute inset-0 rounded-full transition-all\" />\n\n <!-- Close lines container -->\n <span class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] overflow-hidden\">\n <!-- Line 1 - animates from bottom-left to center, rotates 45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 rotate-45' : 'translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.15s\"\n />\n\n <!-- Line 2 - animates from top-left to center, rotates -45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 -rotate-45' : '-translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.45s\"\n />\n </span>\n </button>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport FClose from './FClose.vue'\n\ndefineOptions({ name: 'FModal' })\n\nconst {\n vis = false,\n modalClass,\n styleClass,\n fullScreen = false,\n hasClose = false,\n title = '',\n transitionMode = 'modal',\n teleportTo = 'body',\n disableTeleport = false,\n} = defineProps<{\n vis?: boolean\n modalClass?: string\n styleClass?: string\n fullScreen?: boolean\n hasClose?: boolean\n title?: string\n transitionMode?: 'modal' | 'slideUp'\n teleportTo?: string | Element\n disableTeleport?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n 'close': [value: boolean]\n 'escape': [value: boolean]\n}>()\n\nconst isMounted = ref(false)\n\nfunction close(args: { reason: 'escape' | 'reset' }): void {\n const { reason } = args\n emit('update:vis', false)\n emit('close', true)\n if (reason === 'escape')\n emit('escape', true)\n}\n\nconst classes = computed(() => {\n const cls = modalClass ? [modalClass] : ['max-w-screen-md p-24']\n const style = styleClass ? [styleClass] : ['bg-theme-0', 'shadow-xl']\n\n if (fullScreen)\n cls.push('fixed inset-0')\n else\n cls.push('rounded-2xl')\n\n return [\n 'relative',\n 'text-left',\n 'transform',\n 'transition-all',\n 'w-full',\n 'overflow-hidden',\n ...cls,\n ...style,\n ]\n})\n\nconst afterVisible = ref(false)\nconst cleanups: (() => void)[] = []\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && vis)\n close({ reason: 'escape' })\n}\n\nonMounted(async () => {\n isMounted.value = true\n\n const unwatch = watch(\n () => vis,\n (vis) => {\n if (vis) {\n setTimeout(() => (afterVisible.value = true), 300)\n } else {\n afterVisible.value = false\n }\n },\n { immediate: true },\n )\n\n cleanups.push(unwatch)\n\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', onKeydown)\n cleanups.push(() => document.removeEventListener('keydown', onKeydown))\n }\n})\n\nonUnmounted(() => {\n cleanups.forEach((c) => c())\n})\n\nconst modalTransition = computed(() => {\n if (transitionMode === 'slideUp') {\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 translate-y-full scale-95',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 translate-y-full scale-95',\n }\n }\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 scale-75',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 scale-75',\n }\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n inheritAttrs: false,\n}\n</script>\n\n<template>\n <Teleport v-if=\"isMounted\" :to=\"teleportTo\" :disabled=\"disableTeleport\">\n <div\n class=\"fixed inset-0 z-50\"\n aria-labelledby=\"modal-title\"\n role=\"dialog\"\n aria-modal=\"true\"\n :class=\"!vis ? 'pointer-events-none' : ''\"\n >\n <Transition\n enter-active-class=\"ease-out duration-300\"\n enter-from-class=\"opacity-0\"\n enter-to-class=\"opacity-100\"\n leave-active-class=\"ease-in duration-200\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <div\n v-if=\"vis\"\n class=\"fixed inset-0 bg-theme-800/60 active:bg-theme-800/80 cursor-pointer dark:bg-theme-600/90 backdrop-blur-sm transition-opacity\"\n @click=\"close({ reason: 'escape' })\"\n />\n </Transition>\n <div\n class=\"fixed inset-0 z-40 overflow-y-auto overscroll-contain no-scrollbar\"\n @click=\"close({ reason: 'escape' })\"\n >\n <!-- min-h-full, never h-full: a taller-than-viewport panel must grow this\n row so the outer layer scrolls; h-full + items-center centers the\n overflow and clips the modal top unreachably. p-4 = the 1em minimum\n viewport gap for tall modals. -->\n <div class=\"flex min-h-full items-center justify-center text-center p-4\">\n <Transition v-bind=\"modalTransition\">\n <div\n v-if=\"vis\"\n :class=\"classes\"\n class=\"w-full\"\n @click.stop\n >\n <div\n v-if=\"hasClose || title || $slots.actions\"\n :class=\"!title && (hasClose || $slots.actions) ? 'absolute top-0 right-0 z-10' : 'flex justify-between items-center'\"\n >\n <h2 v-if=\"title\" class=\"text-base p-4 font-semibold\">\n {{ title }}\n </h2>\n <div v-if=\"hasClose || $slots.actions\" class=\"flex items-center gap-2 px-2\">\n <slot name=\"actions\" />\n <FClose\n v-if=\"hasClose\"\n class=\"relative\"\n data-test-id=\"close-modal\"\n @click.stop=\"close({ reason: 'escape' })\"\n />\n </div>\n </div>\n <slot />\n </div>\n </Transition>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n"],"names":["inView","ref","onMounted","_createElementBlock","__props","_cache","$event","$emit","_createElementVNode","_hoisted_2","_normalizeClass","__default__","emit","__emit","isMounted","close","args","reason","__name","classes","computed","cls","style","afterVisible","cleanups","onKeydown","event","unwatch","watch","vis","onUnmounted","c","modalTransition","_createBlock","_Teleport","_createVNode","_Transition","_hoisted_1","$slots","_toDisplayString","_openBlock","_hoisted_3","_renderSlot","_ctx","FClose"],"mappings":"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"}
1
+ {"version":3,"file":"FModal.vue_vue_type_script_setup_true_lang.js","sources":["../ui/FClose.vue","../ui/FModal.vue"],"sourcesContent":["<script lang=\"ts\" setup>\n// SDK-local copy of src/ui/common/FClose.vue — the SDK package must not\n// import app source, so the primitives it needs live here.\nimport { onMounted, ref } from 'vue'\n\ndefineOptions({ name: 'FClose' })\n\ndefineProps<{\n ariaLabel?: string\n}>()\n\ndefineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst inView = ref(false)\n\nonMounted(() => {\n setTimeout(() => {\n inView.value = true\n }, 100)\n})\n</script>\n\n<template>\n <button\n type=\"button\"\n :aria-label=\"ariaLabel || 'Close'\"\n class=\"close block cursor-pointer w-[60px] h-[60px] rounded-full transition-all duration-1000 ease-[cubic-bezier(0.25,1,0.33,1)] hover:scale-110 active:scale-90 hover:rotate-90\"\n @click=\"$emit('click', $event)\"\n >\n <!-- Background circle (invisible, for hover area) -->\n <span class=\"absolute inset-0 rounded-full transition-all\" />\n\n <!-- Close lines container -->\n <span class=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[28px] h-[28px] overflow-hidden\">\n <!-- Line 1 - animates from bottom-left to center, rotates 45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 rotate-45' : 'translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.15s\"\n />\n\n <!-- Line 2 - animates from top-left to center, rotates -45deg -->\n <span\n class=\"absolute h-full w-[3px] rounded-[5px] left-[13px] transition-all duration-[400ms] ease-[cubic-bezier(0.52,0.01,0.16,1)]\"\n :class=\"inView ? 'translate-y-0 translate-x-0 -rotate-45' : '-translate-y-[30px] -translate-x-[30px] rotate-0'\"\n style=\"background-color: currentColor; transition-delay: 0.45s\"\n />\n </span>\n </button>\n</template>\n","<script lang=\"ts\" setup>\n// SDK-local copy of src/ui/common/FModal.vue — the SDK package must not\n// import app source, so the primitives it needs live here.\nimport { computed, onMounted, onUnmounted, ref, watch } from 'vue'\nimport FClose from './FClose.vue'\n\ndefineOptions({ name: 'FModal' })\n\nconst {\n vis = false,\n modalClass,\n styleClass,\n fullScreen = false,\n hasClose = false,\n title = '',\n transitionMode = 'modal',\n teleportTo = 'body',\n disableTeleport = false,\n} = defineProps<{\n vis?: boolean\n modalClass?: string\n styleClass?: string\n fullScreen?: boolean\n hasClose?: boolean\n title?: string\n transitionMode?: 'modal' | 'slideUp'\n teleportTo?: string | Element\n disableTeleport?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n 'close': [value: boolean]\n 'escape': [value: boolean]\n}>()\n\nconst isMounted = ref(false)\n\nfunction close(args: { reason: 'escape' | 'reset' }): void {\n const { reason } = args\n emit('update:vis', false)\n emit('close', true)\n if (reason === 'escape')\n emit('escape', true)\n}\n\nconst classes = computed(() => {\n const cls = modalClass ? [modalClass] : ['max-w-screen-md p-24']\n const style = styleClass ? [styleClass] : ['bg-theme-0', 'shadow-xl']\n\n if (fullScreen)\n cls.push('fixed inset-0')\n else\n cls.push('rounded-2xl')\n\n return [\n 'relative',\n 'text-left',\n 'transform',\n 'transition-all',\n 'w-full',\n 'overflow-hidden',\n ...cls,\n ...style,\n ]\n})\n\nconst afterVisible = ref(false)\nconst cleanups: (() => void)[] = []\n\nfunction onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && vis)\n close({ reason: 'escape' })\n}\n\nonMounted(async () => {\n isMounted.value = true\n\n const unwatch = watch(\n () => vis,\n (vis) => {\n if (vis) {\n setTimeout(() => (afterVisible.value = true), 300)\n } else {\n afterVisible.value = false\n }\n },\n { immediate: true },\n )\n\n cleanups.push(unwatch)\n\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', onKeydown)\n cleanups.push(() => document.removeEventListener('keydown', onKeydown))\n }\n})\n\nonUnmounted(() => {\n cleanups.forEach((c) => c())\n})\n\nconst modalTransition = computed(() => {\n if (transitionMode === 'slideUp') {\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 translate-y-full scale-95',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 translate-y-full scale-95',\n }\n }\n return {\n enterActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n enterFromClass: 'opacity-0 scale-75',\n enterToClass: 'opacity-100 translate-y-0 scale-100',\n leaveActiveClass: 'ease-[cubic-bezier(0.25,1,0.33,1)] duration-500',\n leaveFromClass: 'opacity-100 translate-y-0 scale-100',\n leaveToClass: 'opacity-0 scale-75',\n }\n})\n</script>\n\n<script lang=\"ts\">\nexport default {\n inheritAttrs: false,\n}\n</script>\n\n<template>\n <Teleport v-if=\"isMounted\" :to=\"teleportTo\" :disabled=\"disableTeleport\">\n <div\n class=\"fixed inset-0 z-50\"\n aria-labelledby=\"modal-title\"\n role=\"dialog\"\n aria-modal=\"true\"\n :class=\"!vis ? 'pointer-events-none' : ''\"\n >\n <Transition\n enter-active-class=\"ease-out duration-300\"\n enter-from-class=\"opacity-0\"\n enter-to-class=\"opacity-100\"\n leave-active-class=\"ease-in duration-200\"\n leave-from-class=\"opacity-100\"\n leave-to-class=\"opacity-0\"\n >\n <div\n v-if=\"vis\"\n class=\"fixed inset-0 bg-theme-800/60 active:bg-theme-800/80 cursor-pointer dark:bg-theme-600/90 backdrop-blur-sm transition-opacity\"\n @click=\"close({ reason: 'escape' })\"\n />\n </Transition>\n <div\n class=\"fixed inset-0 z-40 overflow-y-auto overscroll-contain no-scrollbar\"\n @click=\"close({ reason: 'escape' })\"\n >\n <!-- min-h-full, never h-full: a taller-than-viewport panel must grow this\n row so the outer layer scrolls; h-full + items-center centers the\n overflow and clips the modal top unreachably. p-4 = the 1em minimum\n viewport gap for tall modals. -->\n <div class=\"flex min-h-full items-center justify-center text-center p-4\">\n <Transition v-bind=\"modalTransition\">\n <div\n v-if=\"vis\"\n :class=\"classes\"\n class=\"w-full\"\n @click.stop\n >\n <div\n v-if=\"hasClose || title || $slots.actions\"\n :class=\"!title && (hasClose || $slots.actions) ? 'absolute top-0 right-0 z-10' : 'flex justify-between items-center'\"\n >\n <h2 v-if=\"title\" class=\"text-base p-4 font-semibold\">\n {{ title }}\n </h2>\n <div v-if=\"hasClose || $slots.actions\" class=\"flex items-center gap-2 px-2\">\n <slot name=\"actions\" />\n <FClose\n v-if=\"hasClose\"\n class=\"relative\"\n data-test-id=\"close-modal\"\n @click.stop=\"close({ reason: 'escape' })\"\n />\n </div>\n </div>\n <slot />\n </div>\n </Transition>\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n"],"names":["inView","ref","onMounted","_createElementBlock","__props","_cache","$event","$emit","_createElementVNode","_hoisted_2","_normalizeClass","__default__","emit","__emit","isMounted","close","args","reason","__name","classes","computed","cls","style","afterVisible","cleanups","onKeydown","event","unwatch","watch","vis","onUnmounted","c","modalTransition","_createBlock","_Teleport","_createVNode","_Transition","_hoisted_1","$slots","_toDisplayString","_openBlock","_hoisted_3","_renderSlot","_ctx","FClose"],"mappings":"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"}
@@ -3,5 +3,7 @@ type __VLS_Props = {
3
3
  result: ChatVisualParseResult;
4
4
  inverted?: boolean;
5
5
  };
6
- declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
7
+ bodyEl: HTMLDivElement;
8
+ }, any>;
7
9
  export default _default;
@@ -1,4 +1,4 @@
1
- type ButtonTheme = 'primary' | 'green' | 'red' | 'default';
1
+ type ButtonTheme = 'primary' | 'green' | 'red' | 'default' | 'dark';
2
2
  type ButtonSize = 'sm' | 'md' | 'lg';
3
3
  type __VLS_Props = {
4
4
  theme?: ButtonTheme;
@@ -12,6 +12,8 @@ type __VLS_Props = {
12
12
  emptyStateMessage?: string;
13
13
  showHeader?: boolean;
14
14
  headerMeta?: string;
15
+ /** Center transcript + composer in a 720px column — for wide desktop shells. */
16
+ centered?: boolean;
15
17
  };
16
18
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
17
19
  chatScroller: ({
@@ -28,4 +28,12 @@ export type ChatDiagramLayout = {
28
28
  nodes: ChatDiagramLayoutNode[];
29
29
  edges: ChatDiagramLayoutEdge[];
30
30
  };
31
- export declare function layoutChatDiagram(spec: ChatDiagramVisualSpec): ChatDiagramLayout;
31
+ /**
32
+ * Width-aware entry: a horizontal flow that would not fit `maxWidth` at 1:1
33
+ * re-lays out top-down instead of shrinking below readable size. Narrow
34
+ * columns (phones, widget) are the norm, not the exception — vertical is the
35
+ * honest orientation there.
36
+ */
37
+ export declare function layoutChatDiagram(spec: ChatDiagramVisualSpec, opts?: {
38
+ maxWidth?: number;
39
+ }): ChatDiagramLayout;
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sources":["../agent/ui/AgentModal.vue","../agent/ui/AgentWidget.vue","../agent/ui/ElAgentChatPreview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../schema'\nimport FModal from '@/ui/common/FModal.vue'\nimport AgentProvider from './AgentProvider.vue'\n\ndefineOptions({ name: 'AgentModal' })\n\nconst {\n vis = false,\n sdk,\n agent,\n handle,\n context,\n firstMessage,\n} = defineProps<{\n vis?: boolean\n sdk?: PageLinesSDK\n agent?: AgentConfig\n handle?: string\n context?: string\n firstMessage?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n}>()\n</script>\n\n<template>\n <FModal\n :vis=\"vis\"\n modal-class=\"max-w-4xl p-0\"\n style-class=\"bg-transparent shadow-2xl rounded-2xl\"\n :has-close=\"false\"\n @update:vis=\"(val) => emit('update:vis', val)\"\n >\n <div class=\"relative w-full h-[80vh] md:h-[600px]\">\n <AgentProvider\n :sdk=\"sdk\"\n :agent=\"agent\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n @close=\"emit('update:vis', false)\"\n />\n </div>\n </FModal>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n"],"names":["emit","__emit","_createBlock","FModal","__props","_cache","val","_createElementVNode","_hoisted_1","_createVNode","AgentProvider","props","isOpen","ref","isAgentActive","toggle","__name","watch","newValue","nextTick","open","close","handleClose","__expose","AgentWrap","agent","resolvedSdk","_createElementBlock","_normalizeStyle","$event","_openBlock","_hoisted_2","_hoisted_4","AgentChat","_normalizeClass","_Fragment","_renderList","message","index","ChatRichText"],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sources":["../agent/ui/AgentModal.vue","../agent/ui/AgentWidget.vue","../agent/ui/ElAgentChatPreview.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport type { AgentConfig } from '../schema'\nimport FModal from '../../ui/FModal.vue'\nimport AgentProvider from './AgentProvider.vue'\n\ndefineOptions({ name: 'AgentModal' })\n\nconst {\n vis = false,\n sdk,\n agent,\n handle,\n context,\n firstMessage,\n} = defineProps<{\n vis?: boolean\n sdk?: PageLinesSDK\n agent?: AgentConfig\n handle?: string\n context?: string\n firstMessage?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:vis': [value: boolean]\n}>()\n</script>\n\n<template>\n <FModal\n :vis=\"vis\"\n modal-class=\"max-w-4xl p-0\"\n style-class=\"bg-transparent shadow-2xl rounded-2xl\"\n :has-close=\"false\"\n @update:vis=\"(val) => emit('update:vis', val)\"\n >\n <div class=\"relative w-full h-[80vh] md:h-[600px]\">\n <AgentProvider\n :sdk=\"sdk\"\n :agent=\"agent\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n @close=\"emit('update:vis', false)\"\n />\n </div>\n </FModal>\n</template>\n","<script setup lang=\"ts\">\nimport type { PageLinesSDK } from '../../sdkClient'\nimport { nextTick, ref, watch } from 'vue'\nimport AgentChat from './AgentChat.vue'\nimport AgentWrap from './AgentWrap.vue'\n\ninterface Props {\n sdk?: PageLinesSDK\n handle: string\n context?: string\n firstMessage?: string\n position?: 'bottom-right' | 'bottom-left' | 'top-right' | 'top-left'\n}\n\nconst props = defineProps<Props>()\nconst isOpen = ref(false)\nconst isAgentActive = ref(false)\n\nfunction toggle() {\n isOpen.value = !isOpen.value\n}\n\n// Watch isOpen to delay agent activation for smooth transition\nwatch(isOpen, async (newValue) => {\n if (newValue) {\n // When opening, delay agent activation until transition starts\n await nextTick()\n setTimeout(() => {\n isAgentActive.value = true\n }, 400) // Delay to let container expand first\n } else {\n // When closing, immediately deactivate agent\n isAgentActive.value = false\n }\n})\n\nfunction open() {\n isOpen.value = true\n}\n\nfunction close() {\n isOpen.value = false\n}\n\nfunction handleClose() {\n close()\n}\n\ndefineExpose({\n toggle,\n open,\n close,\n})\n</script>\n\n<template>\n <AgentWrap\n v-slot=\"{ agent, sdk: resolvedSdk }\"\n :sdk=\"sdk\"\n :handle=\"handle\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n >\n <!-- Fixed Widget Wrapper -->\n <div\n v-if=\"agent\"\n class=\"fixed z-[999999] pointer-events-auto\"\n :class=\"[\n props.position === 'bottom-left' ? 'bottom-6 left-6'\n : props.position === 'top-right' ? 'top-6 right-6'\n : props.position === 'top-left' ? 'top-6 left-6'\n : 'bottom-6 right-6',\n ]\"\n >\n <!-- Widget Content with Transition -->\n <div\n class=\"transition-all duration-500 ease-[cubic-bezier(0.25,1,0.33,1)] transform-gpu\"\n :class=\"[\n isOpen\n ? 'widget-expanded w-96 h-[600px] max-w-[calc(100vw-48px)] max-h-[calc(100vh-48px)] rounded-3xl opacity-100 scale-100'\n : 'widget-button w-[80px] h-[80px] opacity-100 scale-100 flex items-center justify-center cursor-pointer',\n ]\"\n :style=\"{\n 'transform-origin':\n props.position === 'bottom-left' ? 'bottom left'\n : props.position === 'top-right' ? 'top right'\n : props.position === 'top-left' ? 'top left'\n : 'bottom right',\n }\"\n @click=\"!isOpen ? toggle() : undefined\"\n >\n <!-- Button Content (visible when closed) -->\n <div v-if=\"!isOpen\" class=\"relative h-full w-full\">\n <div class=\"group relative h-full w-full rounded-3xl overflow-hidden shadow-lg transition-all duration-300 ease-[cubic-bezier(0.25,1,0.33,1)] hover:shadow-2xl hover:translate-y-[-1px] hover:brightness-110 active:scale-[1.06] active:-translate-y-0.5 active:duration-100\">\n <img\n :src=\"agent.avatarUrl.value\"\n :alt=\"`${agent.displayName.value} assistant`\"\n class=\"h-full w-full object-cover pointer-events-none\"\n width=\"80\"\n height=\"80\"\n />\n <!-- Gradient overlay for contrast -->\n <div class=\"absolute inset-0 pointer-events-none bg-gradient-to-br from-transparent via-black/10 to-black/40 opacity-60 transition-opacity duration-300 group-hover:opacity-40\" />\n </div>\n <!-- Online indicator -->\n <div v-if=\"agent.state.value.lifecycle === 'running'\" class=\"absolute top-0.5 right-0.5\">\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white absolute animate-ping\" style=\"animation-duration: 3s;\" />\n <div class=\"size-3 bg-green-500 rounded-full ring-2 ring-white\" />\n </div>\n </div>\n\n <!-- Chat Content (visible when open) -->\n <AgentChat\n v-if=\"isOpen && agent\"\n class=\"rounded-3xl shadow-2xl border border-white/10\"\n :sdk=\"resolvedSdk\"\n :agent=\"agent\"\n :context=\"context\"\n :first-message=\"firstMessage\"\n :has-close=\"true\"\n :is-active=\"isAgentActive\"\n @close=\"handleClose\"\n />\n </div>\n </div>\n </AgentWrap>\n</template>\n","<script setup lang=\"ts\">\nimport ChatRichText from './ChatRichText.vue'\n\nexport type ChatPreviewMessage = {\n sender: 'user' | 'agent'\n text: string\n}\n\ndefineProps<{\n messages: ChatPreviewMessage[]\n variant?: 'light' | 'dark'\n}>()\n</script>\n\n<template>\n <div\n class=\"@container/chat-preview flex flex-col gap-3\"\n :class=\"variant === 'dark' ? 'text-white' : 'text-slate-950'\"\n data-test=\"agent-chat-preview\"\n >\n <div\n v-for=\"(message, index) in messages\"\n :key=\"`${message.sender}-${index}`\"\n class=\"flex\"\n :class=\"message.sender === 'user' ? 'justify-end' : 'justify-start'\"\n data-test=\"agent-chat-preview-message\"\n :data-sender=\"message.sender\"\n >\n <div\n class=\"max-w-[88%] rounded-2xl px-4 py-3 text-sm shadow-sm @sm/chat-preview:max-w-[78%]\"\n :class=\"message.sender === 'user'\n ? 'bg-slate-950 text-white'\n : variant === 'dark'\n ? 'border border-white/10 bg-white/10 text-white'\n : 'border border-slate-200 bg-white text-slate-950'\"\n >\n <ChatRichText\n :text=\"message.text\"\n :inverted=\"message.sender === 'user' || variant === 'dark'\"\n />\n </div>\n </div>\n </div>\n</template>\n"],"names":["emit","__emit","_createBlock","FModal","__props","_cache","val","_createElementVNode","_hoisted_1","_createVNode","AgentProvider","props","isOpen","ref","isAgentActive","toggle","__name","watch","newValue","nextTick","open","close","handleClose","__expose","AgentWrap","agent","resolvedSdk","_createElementBlock","_normalizeStyle","$event","_openBlock","_hoisted_2","_hoisted_4","AgentChat","_normalizeClass","_Fragment","_renderList","message","index","ChatRichText"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { PageLinesSDK } from '../sdkClient';
2
2
  import { AgentConfig } from '@pagelines/core';
3
3
  export type { AgentConfig } from '@pagelines/core';
4
- export type { DemoAgentEntry } from '@/modules/agent/static/data';
5
- export { getStaticAgentByHandle } from '@/modules/agent/static';
4
+ export type { DemoAgentEntry } from './static/data';
5
+ export { getStaticAgentByHandle } from './static';
6
6
  /**
7
7
  * Get demo agents - mix of static data and DB-fetched entries
8
8
  * @param sdk - PageLinesSDK instance for fetching handle-only entries
@@ -116,4 +116,4 @@ export declare function getDemoAgentByHandle(handle: string): Partial<{
116
116
  detail?: string | undefined;
117
117
  } | undefined;
118
118
  }> | undefined;
119
- export { staticAgents } from '@/modules/agent/static/data';
119
+ export { staticAgents } from './static/data';
@@ -0,0 +1,15 @@
1
+ import { AgentConfig } from '@pagelines/core';
2
+ /**
3
+ * Demo agent entry - supports both static full/partial data AND handle-only entries
4
+ * Handle-only entries (e.g., { handle: 'dan' }) will be fetched from DB via SDK
5
+ */
6
+ export type DemoAgentEntry = Partial<AgentConfig> | {
7
+ handle: string;
8
+ };
9
+ /**
10
+ * Static demo agents - mix of full data and handle-only entries
11
+ * Full entries: Used as-is without DB fetch
12
+ * Handle-only entries: Fetched from DB via getDemoAgents(sdk)
13
+ * Images hosted on S3 at https://media.pagelines.com/_assets/avatars/
14
+ */
15
+ export declare const staticAgents: DemoAgentEntry[];
@@ -0,0 +1,12 @@
1
+ import { AgentConfig } from '@pagelines/core';
2
+ import { staticAgents } from './data';
3
+ /**
4
+ * Get static agent by handle - fallback when DB returns nothing
5
+ * Returns partial Agent with only essential fields populated
6
+ * Undefined fields are acceptable - consuming code should handle gracefully
7
+ */
8
+ export declare function getStaticAgentByHandle(handle: string): Partial<AgentConfig> | undefined;
9
+ /**
10
+ * Export all static agents for reference/listing
11
+ */
12
+ export { staticAgents };
package/dist/demo.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"demo.js","sources":["../../../src/modules/agent/static/data.ts","../../../src/modules/agent/static/index.ts","../demo/index.ts"],"sourcesContent":["import type { AgentConfig } from '@pagelines/core'\n\n/**\n * Demo agent entry - supports both static full/partial data AND handle-only entries\n * Handle-only entries (e.g., { handle: 'dan' }) will be fetched from DB via SDK\n */\nexport type DemoAgentEntry = Partial<AgentConfig> | { handle: string }\n\n/**\n * Static demo agents - mix of full data and handle-only entries\n * Full entries: Used as-is without DB fetch\n * Handle-only entries: Fetched from DB via getDemoAgents(sdk)\n * Images hosted on S3 at https://media.pagelines.com/_assets/avatars/\n */\nexport const staticAgents: DemoAgentEntry[] = [\n {\n agentId: '2101k200aj',\n handle: 'andrew',\n name: 'Andrew Powers',\n title: 'Co-Founder and CEO of PageLines',\n summary: '<p>Engineer turned entrepreneur with 15 years of success in digital platforms across the web, data, and AI.</p>',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-andrew.webp' },\n entityType: 'person',\n },\n {\n agentId: '5501k2nk0m',\n handle: 'morgan',\n name: 'Morgan Jones',\n title: 'Co-Founder and COO of PageLines',\n summary: `<p>Born in Vancouver, raised on rugby pitches, and refined through ventures across Asia, Europe, and beyond. After eight years in the UK and adventures in 30+ countries, I landed in Dana Point, California, where my wife and I are raising two kids between surf sessions and soccer games.</p>\n<p>I've built revenue engines for startups, turned around struggling companies, and helped founders go from zero to one, one to many. My approach is simple: authentic relationships beat aggressive tactics, great teams create great results, and if you're not having fun building something meaningful, you're doing it wrong.</p>\n<p>These days, I'm the COO at PageLines, where we're proving you can build a unicorn while maintaining work-life balance. I believe the best business decisions happen on ski lifts, breakthrough strategies come from garden walks, and the most important meetings are the ones at home. Looking to connect with leaders who understand that success without fulfillment is the ultimate failure.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-morgan.webp' },\n entityType: 'person',\n },\n {\n agentId: '7601k2x0x4',\n handle: 'edgar',\n name: 'Edgar Cheverier',\n title: 'Senior Software Engineer at PageLines',\n summary: `<p>Full-stack developer who believes elegant code is like great design - it just works. Obsessed with React, TypeScript, and the entire modern web stack, I approach every project with Steve Jobs' philosophy: the intersection of technology and liberal arts creates magic.</p>\n<p>When I'm not architecting solutions with Next.js or optimizing PostgreSQL queries, you'll find me on a trail run or climbing route, where the best debugging happens. I read voraciously - from computer science classics to philosophy - because great developers are students first, coders second.</p>\n<p>Currently building products that would make users say \"wow\" while maintaining the clean, testable code that makes fellow developers smile. Looking to connect with teams who understand that perfectionism isn't about adding more, it's about knowing what to leave out.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-edgar.webp' },\n entityType: 'person',\n },\n {\n agentId: '8901k2y0j5',\n handle: 'joey',\n name: 'Joey Mireles',\n title: 'Photographer/Digital Creator',\n summary: `<p>Orange County-based photographer and digital creator who captures life's most authentic moments. Whether it's scaling the snowy peaks of Big Bear or exploring Budapest's charming ruin bars, Joey approaches every adventure with his camera in hand and boundless enthusiasm.</p>\n<p>Known for turning ordinary moments into extraordinary stories, Joey believes the best shots happen when you're least prepared for them. His work blends technical precision with spontaneous creativity, creating images that feel both professional and deeply personal.</p>\n<p>Currently bringing that same adventurous spirit to PageLines's visual storytelling, proving that great photography isn't just about perfect lighting—it's about capturing the magic that happens when people connect with something meaningful.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-joey.webp' },\n entityType: 'person',\n },\n {\n agentId: 'ken-eliasen',\n handle: 'ken',\n name: 'Ken Eliasen',\n title: 'SVP Operations at Edwards Lifesciences',\n summary: 'Experienced Senior Vice President of R&D and Operations with 13+ years at Edwards Lifesciences and demonstrated history in the medical device industry. <strong>Currently leading operations for a Fortune 500 medical device company</strong> with expertise in DMAIC, Design Control, Verification and Validation (V&V), and medical device development. Strong development & operations professional with proven track record of launching new products and scaling manufacturing operations.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-ken.webp' },\n entityType: 'person',\n },\n {\n agentId: 'josh-powers-rime',\n handle: 'josh',\n name: 'Josh Powers',\n title: 'Founder of Rime Roofing',\n summary: `<p>Extensive experience in outside sales management and leadership. I've managed very large sales teams in multiple locations in both residential and B2B.</p>\n<p><strong>Currently running my own company for over 3 years</strong> doing all the back end stuff myself. HR, Operations, Payroll, Lead generation, Problem solving, Negotiation... You name it, I have done it.</p>\n<p>At Rime, we elevate what it means to protect and enhance your property. Our specialty is lifetime roofing with integrated, custom ventilation - ensuring every structure we touch performs at its best for decades.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-josh.webp' },\n entityType: 'person',\n },\n {\n agentId: 'vidur_mehra_01',\n handle: 'vidur',\n name: 'Vidur Mehra',\n title: 'Product Strategist at PIMCO',\n summary: 'Senior VP and product strategist on the defined contribution team at PIMCO, focusing on target date funds and retirement income solutions. <strong>Currently helping shape the future</strong> of retirement planning from Newport Beach office.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-vidur.webp' },\n entityType: 'person',\n },\n {\n agentId: 'mary-czarnecki',\n handle: 'mary',\n name: 'Mary Czarnecki',\n title: 'Strategic Storytelling Consultant & Keynote Speaker',\n summary: `<p>Strategic storytelling consultant, keynote speaker, and workshop facilitator with over 20 years in marketing and strategy roles at Johnson & Johnson, WebMD, and Accenture. <strong>Currently helping Fortune 500 companies and growth-stage businesses</strong> cut through the noise with clear, compelling messages that inspire action.</p>\n<p>I sit at the intersection of strategy, communication, and applied storytelling frameworks, bringing both the science behind why stories work and practical tools teams can use immediately. When I'm not on stage or in workshops, you'll find me in Oregon's Willamette Valley with my restaurateur husband, our two sons, and serving on boards for Women in Wine Oregon and Taste Newberg.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-mary.webp' },\n entityType: 'person',\n },\n {\n agentId: 'dean-stoecker',\n handle: 'dean',\n name: 'Dean Stoecker',\n title: 'Former CEO of Alteryx',\n summary: `<p>Built Alteryx from startup to $5B public company over 23 years, pioneering analytics automation and democratizing data science. Took the company public in 2017 and scaled from 85M to 600M+ ARR before transitioning to focus on meaningful ventures.</p>\n<p><strong>Currently leading Ranch Productions while producing family-friendly films</strong> from Colorado, including a biographical project about his father's life. I believe in patient capital, community-driven growth, and using storytelling to inspire and elevate human potential while staying grounded in values that matter.</p>\n<p>Whether it's building analytics platforms or crafting stories that inspire, I approach every venture with the long-term perspective of Warren Buffett, the product perfectionism of Steve Jobs, and the down-to-earth authenticity of the Mountain West.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-dean.webp' },\n entityType: 'person',\n },\n {\n agentId: 's7c3a9f4',\n handle: 'demo_yuki',\n name: 'Yuki Nakamura',\n title: 'Professional Cosplay Artist',\n summary: 'Art school dropout turned TikTok sensation. <strong>Currently preparing for Comic-Con</strong> while building costume commissions business.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-yuki.webp' },\n entityType: 'person',\n },\n {\n agentId: 'a7f3b2c8',\n handle: 'demo_adam',\n name: 'Adam Dvoretsky',\n title: 'International Chess Master',\n summary: 'Former national champion who coached 3 players to grandmaster level. <strong>Currently teaching strategic thinking through chess</strong> between tournaments in New York.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-adam.webp' },\n },\n {\n agentId: 'n5c9e4a8',\n handle: 'demo_isabelle',\n name: 'Isabelle Monaco',\n title: 'Luxury Real Estate Specialist',\n summary: 'Former Goldman Sachs VP turned luxury real estate. <strong>Currently selling $10M+ properties</strong> in Silicon Valley.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-isabelle.webp' },\n },\n {\n agentId: 'd8f2b4c9',\n handle: 'demo_marcus',\n name: 'Marcus Hill',\n title: 'Independent Film Producer',\n summary: 'Started in CAA mailroom, now runs indie production. <strong>5 films launched to Netflix</strong> with total budgets under $10M.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-marcus.webp' },\n },\n {\n agentId: 'g2d5b7a1',\n handle: 'demo_lars',\n name: 'Lars Andersen',\n title: 'Olympic Ski Coach',\n summary: 'Norwegian Olympic team veteran, now coaching in Colorado. <strong>Currently training next generation</strong> of elite skiers while teaching mountain safety.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-lars.webp' },\n },\n {\n agentId: 'f9c3a8e5',\n handle: 'demo_tony',\n name: 'Tony Russo',\n title: 'Restaurant Owner',\n summary: 'Grew up in family kitchen, Cornell Hotel School trained. <strong>Currently running 4 locations</strong> in North Beach with industry-leading margins.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-tony.webp' },\n },\n {\n agentId: 'j3e7a5b2',\n handle: 'demo_jonathan',\n name: 'Dr. Jonathan Blake',\n title: 'Orthopedic Surgeon',\n summary: 'Johns Hopkins trained, Mayo Clinic fellowship. <strong>Currently practicing at Cedar Sinai</strong> with focus on minimally invasive techniques.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-jonathan.webp' },\n },\n {\n agentId: 'k7b4d8f3',\n handle: 'demo_emily',\n name: 'Emily McKibban',\n title: 'Stanford CS Student',\n summary: 'Valedictorian from Cupertino, Google intern. <strong>Currently juggling CS coursework</strong> with pre-med requirements while researching AI diagnostics.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-emily.webp' },\n },\n {\n agentId: 'l9e6a2c5',\n handle: 'demo_victoria',\n name: 'Victoria Laurent',\n title: 'Fashion Designer',\n summary: 'Central Saint Martins graduate, former Dior designer. <strong>Currently building independent brand</strong> that proves luxury and sustainability coexist.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-victoria.webp' },\n },\n {\n agentId: 'm3f8b1d7',\n handle: 'demo_alexandra',\n name: 'Alexa Stone',\n title: 'M&A Partner at Wilson Sonsini',\n summary: 'Harvard Law Review, 9th Circuit clerk. <strong>Currently structuring billion-dollar acquisitions</strong> for tech companies.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-alexandra.webp' },\n },\n {\n agentId: 'v3d7e2b8',\n handle: 'demo_sofia',\n name: 'Sofia Martinez',\n title: 'Principal Product Designer',\n summary: 'RISD graduate, design lead at three unicorns. <strong>Currently running user research</strong> from Mexico City while building design systems.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-sofia.webp' },\n },\n {\n agentId: 'p8a3f7b6',\n handle: 'demo_rachel',\n name: 'Rachel Adams',\n title: 'Marketing Agency Founder',\n summary: 'Early Facebook employee turned agency founder. <strong>Currently running 50-person performance marketing shop</strong> from Austin while hosting growth podcast.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-rachel.webp' },\n },\n {\n agentId: 'h8f6c2d9',\n handle: 'demo_gabriel',\n name: 'Gabriel Santos',\n title: 'Executive Mindfulness Coach',\n summary: 'Goldman Sachs burnout turned mindfulness expert. <strong>Currently leading retreats</strong> for Fortune 500 executives.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-gabriel.webp' },\n },\n {\n agentId: 'q1d6e9c2',\n handle: 'demo_sophie',\n name: 'Sophie Greenwald',\n title: 'Sustainability Consultant',\n summary: 'MIT environmental engineering, McKinsey sustainability practice. <strong>Currently helping Fortune 500 companies</strong> achieve real carbon reduction goals.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-sophie.webp' },\n },\n {\n agentId: 'r4b8f5d1',\n handle: 'demo_david',\n name: 'David Nguyen',\n title: 'Political Campaign Manager',\n summary: 'Obama 2008 field organizer turned top Democratic strategist. <strong>Currently preparing for 2026 cycle</strong> with data-driven grassroots approach.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-david.webp' },\n },\n {\n agentId: 't2e8b5d6',\n handle: 'demo_isabelle_r',\n name: 'Isabelle Rodriguez',\n title: 'Fashion Designer',\n summary: 'FIT graduate, Balenciaga-trained, launched at 27. <strong>Currently designing next collection</strong> from Miami studio.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-isabelle_r.webp' },\n },\n {\n agentId: 'u9f1c4a7',\n handle: 'demo_arjun',\n name: 'Arjun Patel',\n title: 'Serial Entrepreneur',\n summary: 'IIT Delhi, Stanford MS, sold last company to Microsoft. <strong>Currently raising Series A</strong> for AI platform while advising other founders.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-arjun.webp' },\n },\n // Handle-only entries - fetched from DB via getDemoAgents(sdk)\n { handle: 'dan' },\n]\n","import type { AgentConfig } from '@pagelines/core'\nimport { staticAgents } from './data'\n\n/**\n * Get static agent by handle - fallback when DB returns nothing\n * Returns partial Agent with only essential fields populated\n * Undefined fields are acceptable - consuming code should handle gracefully\n */\nexport function getStaticAgentByHandle(handle: string): Partial<AgentConfig> | undefined {\n return staticAgents.find((a) => a.handle === handle)\n}\n\n/**\n * Export all static agents for reference/listing\n */\nexport { staticAgents }\n","// Re-export static demo agents from app (zero duplication)\n// App data bundled into SDK at build time via @/ alias resolution\n\nimport type { PageLinesSDK } from '../sdkClient'\nimport { getStaticAgentByHandle as appGetStaticAgentByHandle } from '@/modules/agent/static'\nimport { staticAgents as appStaticAgents } from '@/modules/agent/static/data'\nimport type { AgentConfig } from '@pagelines/core'\n\n// Re-export types\nexport type { AgentConfig } from '@pagelines/core'\nexport type { DemoAgentEntry } from '@/modules/agent/static/data'\nexport { getStaticAgentByHandle } from '@/modules/agent/static'\n\n/**\n * Type guard: detects handle-only entries for DB fetching\n */\nfunction isHandleOnly(entry: unknown): entry is { handle: string } {\n if (typeof entry !== 'object' || entry === null)\n return false\n const keys = Object.keys(entry)\n return keys.length === 1 && 'handle' in entry && typeof (entry as any).handle === 'string'\n}\n\n/**\n * Get demo agents - mix of static data and DB-fetched entries\n * @param sdk - PageLinesSDK instance for fetching handle-only entries\n * @returns Promise<Partial<AgentConfig>[]> - Array of demo agents (static + fetched)\n *\n * Handle-only entries (e.g., { handle: 'dan' }) are fetched in parallel via sdk.user.getPublicAgent()\n * Failed fetches are skipped silently with optional logging\n */\nexport async function getDemoAgents(sdk: PageLinesSDK): Promise<Partial<AgentConfig>[]> {\n // Separate static entries from handle-only entries\n const staticEntries = appStaticAgents.filter((entry): entry is Partial<AgentConfig> => !isHandleOnly(entry))\n const handleOnlyEntries = appStaticAgents.filter(isHandleOnly)\n\n // Fetch all handle-only entries in parallel (Promise.allSettled for graceful failure)\n const fetchResults = await Promise.allSettled(\n handleOnlyEntries.map(entry => sdk.user.getPublicAgent({ handle: entry.handle })),\n )\n\n // Extract successful fetches, log failures\n const fetchedAgents = fetchResults\n .map((result, index) => {\n if (result.status === 'fulfilled' && result.value) {\n return result.value\n }\n // Log failure but continue\n if (result.status === 'rejected' && sdk.logger) {\n sdk.logger.warn('Failed to fetch demo agent', {\n handle: handleOnlyEntries[index]?.handle,\n error: result.reason,\n })\n }\n return null\n })\n .filter((agent): agent is Partial<AgentConfig> => agent !== null)\n\n // Combine static + fetched\n return [...staticEntries, ...fetchedAgents]\n}\n\nexport function getDemoAgentByHandle(handle: string) {\n return appGetStaticAgentByHandle(handle)\n}\n\n// Direct re-exports\nexport { staticAgents } from '@/modules/agent/static/data'\n"],"names":["staticAgents","getStaticAgentByHandle","handle","a","__name","isHandleOnly","entry","getDemoAgents","sdk","staticEntries","appStaticAgents","handleOnlyEntries","fetchedAgents","result","index","agent","getDemoAgentByHandle","appGetStaticAgentByHandle"],"mappings":"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"}
1
+ {"version":3,"file":"demo.js","sources":["../demo/static/data.ts","../demo/static/index.ts","../demo/index.ts"],"sourcesContent":["import type { AgentConfig } from '@pagelines/core'\n\n/**\n * Demo agent entry - supports both static full/partial data AND handle-only entries\n * Handle-only entries (e.g., { handle: 'dan' }) will be fetched from DB via SDK\n */\nexport type DemoAgentEntry = Partial<AgentConfig> | { handle: string }\n\n/**\n * Static demo agents - mix of full data and handle-only entries\n * Full entries: Used as-is without DB fetch\n * Handle-only entries: Fetched from DB via getDemoAgents(sdk)\n * Images hosted on S3 at https://media.pagelines.com/_assets/avatars/\n */\nexport const staticAgents: DemoAgentEntry[] = [\n {\n agentId: '2101k200aj',\n handle: 'andrew',\n name: 'Andrew Powers',\n title: 'Co-Founder and CEO of PageLines',\n summary: '<p>Engineer turned entrepreneur with 15 years of success in digital platforms across the web, data, and AI.</p>',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-andrew.webp' },\n entityType: 'person',\n },\n {\n agentId: '5501k2nk0m',\n handle: 'morgan',\n name: 'Morgan Jones',\n title: 'Co-Founder and COO of PageLines',\n summary: `<p>Born in Vancouver, raised on rugby pitches, and refined through ventures across Asia, Europe, and beyond. After eight years in the UK and adventures in 30+ countries, I landed in Dana Point, California, where my wife and I are raising two kids between surf sessions and soccer games.</p>\n<p>I've built revenue engines for startups, turned around struggling companies, and helped founders go from zero to one, one to many. My approach is simple: authentic relationships beat aggressive tactics, great teams create great results, and if you're not having fun building something meaningful, you're doing it wrong.</p>\n<p>These days, I'm the COO at PageLines, where we're proving you can build a unicorn while maintaining work-life balance. I believe the best business decisions happen on ski lifts, breakthrough strategies come from garden walks, and the most important meetings are the ones at home. Looking to connect with leaders who understand that success without fulfillment is the ultimate failure.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-morgan.webp' },\n entityType: 'person',\n },\n {\n agentId: '7601k2x0x4',\n handle: 'edgar',\n name: 'Edgar Cheverier',\n title: 'Senior Software Engineer at PageLines',\n summary: `<p>Full-stack developer who believes elegant code is like great design - it just works. Obsessed with React, TypeScript, and the entire modern web stack, I approach every project with Steve Jobs' philosophy: the intersection of technology and liberal arts creates magic.</p>\n<p>When I'm not architecting solutions with Next.js or optimizing PostgreSQL queries, you'll find me on a trail run or climbing route, where the best debugging happens. I read voraciously - from computer science classics to philosophy - because great developers are students first, coders second.</p>\n<p>Currently building products that would make users say \"wow\" while maintaining the clean, testable code that makes fellow developers smile. Looking to connect with teams who understand that perfectionism isn't about adding more, it's about knowing what to leave out.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-edgar.webp' },\n entityType: 'person',\n },\n {\n agentId: '8901k2y0j5',\n handle: 'joey',\n name: 'Joey Mireles',\n title: 'Photographer/Digital Creator',\n summary: `<p>Orange County-based photographer and digital creator who captures life's most authentic moments. Whether it's scaling the snowy peaks of Big Bear or exploring Budapest's charming ruin bars, Joey approaches every adventure with his camera in hand and boundless enthusiasm.</p>\n<p>Known for turning ordinary moments into extraordinary stories, Joey believes the best shots happen when you're least prepared for them. His work blends technical precision with spontaneous creativity, creating images that feel both professional and deeply personal.</p>\n<p>Currently bringing that same adventurous spirit to PageLines's visual storytelling, proving that great photography isn't just about perfect lighting—it's about capturing the magic that happens when people connect with something meaningful.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-joey.webp' },\n entityType: 'person',\n },\n {\n agentId: 'ken-eliasen',\n handle: 'ken',\n name: 'Ken Eliasen',\n title: 'SVP Operations at Edwards Lifesciences',\n summary: 'Experienced Senior Vice President of R&D and Operations with 13+ years at Edwards Lifesciences and demonstrated history in the medical device industry. <strong>Currently leading operations for a Fortune 500 medical device company</strong> with expertise in DMAIC, Design Control, Verification and Validation (V&V), and medical device development. Strong development & operations professional with proven track record of launching new products and scaling manufacturing operations.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-ken.webp' },\n entityType: 'person',\n },\n {\n agentId: 'josh-powers-rime',\n handle: 'josh',\n name: 'Josh Powers',\n title: 'Founder of Rime Roofing',\n summary: `<p>Extensive experience in outside sales management and leadership. I've managed very large sales teams in multiple locations in both residential and B2B.</p>\n<p><strong>Currently running my own company for over 3 years</strong> doing all the back end stuff myself. HR, Operations, Payroll, Lead generation, Problem solving, Negotiation... You name it, I have done it.</p>\n<p>At Rime, we elevate what it means to protect and enhance your property. Our specialty is lifetime roofing with integrated, custom ventilation - ensuring every structure we touch performs at its best for decades.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-josh.webp' },\n entityType: 'person',\n },\n {\n agentId: 'vidur_mehra_01',\n handle: 'vidur',\n name: 'Vidur Mehra',\n title: 'Product Strategist at PIMCO',\n summary: 'Senior VP and product strategist on the defined contribution team at PIMCO, focusing on target date funds and retirement income solutions. <strong>Currently helping shape the future</strong> of retirement planning from Newport Beach office.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-vidur.webp' },\n entityType: 'person',\n },\n {\n agentId: 'mary-czarnecki',\n handle: 'mary',\n name: 'Mary Czarnecki',\n title: 'Strategic Storytelling Consultant & Keynote Speaker',\n summary: `<p>Strategic storytelling consultant, keynote speaker, and workshop facilitator with over 20 years in marketing and strategy roles at Johnson & Johnson, WebMD, and Accenture. <strong>Currently helping Fortune 500 companies and growth-stage businesses</strong> cut through the noise with clear, compelling messages that inspire action.</p>\n<p>I sit at the intersection of strategy, communication, and applied storytelling frameworks, bringing both the science behind why stories work and practical tools teams can use immediately. When I'm not on stage or in workshops, you'll find me in Oregon's Willamette Valley with my restaurateur husband, our two sons, and serving on boards for Women in Wine Oregon and Taste Newberg.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-mary.webp' },\n entityType: 'person',\n },\n {\n agentId: 'dean-stoecker',\n handle: 'dean',\n name: 'Dean Stoecker',\n title: 'Former CEO of Alteryx',\n summary: `<p>Built Alteryx from startup to $5B public company over 23 years, pioneering analytics automation and democratizing data science. Took the company public in 2017 and scaled from 85M to 600M+ ARR before transitioning to focus on meaningful ventures.</p>\n<p><strong>Currently leading Ranch Productions while producing family-friendly films</strong> from Colorado, including a biographical project about his father's life. I believe in patient capital, community-driven growth, and using storytelling to inspire and elevate human potential while staying grounded in values that matter.</p>\n<p>Whether it's building analytics platforms or crafting stories that inspire, I approach every venture with the long-term perspective of Warren Buffett, the product perfectionism of Steve Jobs, and the down-to-earth authenticity of the Mountain West.</p>`,\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-dean.webp' },\n entityType: 'person',\n },\n {\n agentId: 's7c3a9f4',\n handle: 'demo_yuki',\n name: 'Yuki Nakamura',\n title: 'Professional Cosplay Artist',\n summary: 'Art school dropout turned TikTok sensation. <strong>Currently preparing for Comic-Con</strong> while building costume commissions business.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-yuki.webp' },\n entityType: 'person',\n },\n {\n agentId: 'a7f3b2c8',\n handle: 'demo_adam',\n name: 'Adam Dvoretsky',\n title: 'International Chess Master',\n summary: 'Former national champion who coached 3 players to grandmaster level. <strong>Currently teaching strategic thinking through chess</strong> between tournaments in New York.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-adam.webp' },\n },\n {\n agentId: 'n5c9e4a8',\n handle: 'demo_isabelle',\n name: 'Isabelle Monaco',\n title: 'Luxury Real Estate Specialist',\n summary: 'Former Goldman Sachs VP turned luxury real estate. <strong>Currently selling $10M+ properties</strong> in Silicon Valley.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-isabelle.webp' },\n },\n {\n agentId: 'd8f2b4c9',\n handle: 'demo_marcus',\n name: 'Marcus Hill',\n title: 'Independent Film Producer',\n summary: 'Started in CAA mailroom, now runs indie production. <strong>5 films launched to Netflix</strong> with total budgets under $10M.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-marcus.webp' },\n },\n {\n agentId: 'g2d5b7a1',\n handle: 'demo_lars',\n name: 'Lars Andersen',\n title: 'Olympic Ski Coach',\n summary: 'Norwegian Olympic team veteran, now coaching in Colorado. <strong>Currently training next generation</strong> of elite skiers while teaching mountain safety.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-lars.webp' },\n },\n {\n agentId: 'f9c3a8e5',\n handle: 'demo_tony',\n name: 'Tony Russo',\n title: 'Restaurant Owner',\n summary: 'Grew up in family kitchen, Cornell Hotel School trained. <strong>Currently running 4 locations</strong> in North Beach with industry-leading margins.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-tony.webp' },\n },\n {\n agentId: 'j3e7a5b2',\n handle: 'demo_jonathan',\n name: 'Dr. Jonathan Blake',\n title: 'Orthopedic Surgeon',\n summary: 'Johns Hopkins trained, Mayo Clinic fellowship. <strong>Currently practicing at Cedar Sinai</strong> with focus on minimally invasive techniques.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-jonathan.webp' },\n },\n {\n agentId: 'k7b4d8f3',\n handle: 'demo_emily',\n name: 'Emily McKibban',\n title: 'Stanford CS Student',\n summary: 'Valedictorian from Cupertino, Google intern. <strong>Currently juggling CS coursework</strong> with pre-med requirements while researching AI diagnostics.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-emily.webp' },\n },\n {\n agentId: 'l9e6a2c5',\n handle: 'demo_victoria',\n name: 'Victoria Laurent',\n title: 'Fashion Designer',\n summary: 'Central Saint Martins graduate, former Dior designer. <strong>Currently building independent brand</strong> that proves luxury and sustainability coexist.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-victoria.webp' },\n },\n {\n agentId: 'm3f8b1d7',\n handle: 'demo_alexandra',\n name: 'Alexa Stone',\n title: 'M&A Partner at Wilson Sonsini',\n summary: 'Harvard Law Review, 9th Circuit clerk. <strong>Currently structuring billion-dollar acquisitions</strong> for tech companies.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-alexandra.webp' },\n },\n {\n agentId: 'v3d7e2b8',\n handle: 'demo_sofia',\n name: 'Sofia Martinez',\n title: 'Principal Product Designer',\n summary: 'RISD graduate, design lead at three unicorns. <strong>Currently running user research</strong> from Mexico City while building design systems.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-sofia.webp' },\n },\n {\n agentId: 'p8a3f7b6',\n handle: 'demo_rachel',\n name: 'Rachel Adams',\n title: 'Marketing Agency Founder',\n summary: 'Early Facebook employee turned agency founder. <strong>Currently running 50-person performance marketing shop</strong> from Austin while hosting growth podcast.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-rachel.webp' },\n },\n {\n agentId: 'h8f6c2d9',\n handle: 'demo_gabriel',\n name: 'Gabriel Santos',\n title: 'Executive Mindfulness Coach',\n summary: 'Goldman Sachs burnout turned mindfulness expert. <strong>Currently leading retreats</strong> for Fortune 500 executives.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-gabriel.webp' },\n },\n {\n agentId: 'q1d6e9c2',\n handle: 'demo_sophie',\n name: 'Sophie Greenwald',\n title: 'Sustainability Consultant',\n summary: 'MIT environmental engineering, McKinsey sustainability practice. <strong>Currently helping Fortune 500 companies</strong> achieve real carbon reduction goals.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-sophie.webp' },\n },\n {\n agentId: 'r4b8f5d1',\n handle: 'demo_david',\n name: 'David Nguyen',\n title: 'Political Campaign Manager',\n summary: 'Obama 2008 field organizer turned top Democratic strategist. <strong>Currently preparing for 2026 cycle</strong> with data-driven grassroots approach.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-david.webp' },\n },\n {\n agentId: 't2e8b5d6',\n handle: 'demo_isabelle_r',\n name: 'Isabelle Rodriguez',\n title: 'Fashion Designer',\n summary: 'FIT graduate, Balenciaga-trained, launched at 27. <strong>Currently designing next collection</strong> from Miami studio.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-isabelle_r.webp' },\n },\n {\n agentId: 'u9f1c4a7',\n handle: 'demo_arjun',\n name: 'Arjun Patel',\n title: 'Serial Entrepreneur',\n summary: 'IIT Delhi, Stanford MS, sold last company to Microsoft. <strong>Currently raising Series A</strong> for AI platform while advising other founders.',\n avatar: { src: 'https://media.pagelines.com/_assets/avatars/avatar-arjun.webp' },\n },\n // Handle-only entries - fetched from DB via getDemoAgents(sdk)\n { handle: 'dan' },\n]\n","import type { AgentConfig } from '@pagelines/core'\nimport { staticAgents } from './data'\n\n/**\n * Get static agent by handle - fallback when DB returns nothing\n * Returns partial Agent with only essential fields populated\n * Undefined fields are acceptable - consuming code should handle gracefully\n */\nexport function getStaticAgentByHandle(handle: string): Partial<AgentConfig> | undefined {\n return staticAgents.find((a) => a.handle === handle)\n}\n\n/**\n * Export all static agents for reference/listing\n */\nexport { staticAgents }\n","// Static demo agents live in ./static — SDK-owned so the package never\n// imports app source.\n\nimport type { PageLinesSDK } from '../sdkClient'\nimport { getStaticAgentByHandle as appGetStaticAgentByHandle } from './static'\nimport { staticAgents as appStaticAgents } from './static/data'\nimport type { AgentConfig } from '@pagelines/core'\n\n// Re-export types\nexport type { AgentConfig } from '@pagelines/core'\nexport type { DemoAgentEntry } from './static/data'\nexport { getStaticAgentByHandle } from './static'\n\n/**\n * Type guard: detects handle-only entries for DB fetching\n */\nfunction isHandleOnly(entry: unknown): entry is { handle: string } {\n if (typeof entry !== 'object' || entry === null)\n return false\n const keys = Object.keys(entry)\n return keys.length === 1 && 'handle' in entry && typeof (entry as any).handle === 'string'\n}\n\n/**\n * Get demo agents - mix of static data and DB-fetched entries\n * @param sdk - PageLinesSDK instance for fetching handle-only entries\n * @returns Promise<Partial<AgentConfig>[]> - Array of demo agents (static + fetched)\n *\n * Handle-only entries (e.g., { handle: 'dan' }) are fetched in parallel via sdk.user.getPublicAgent()\n * Failed fetches are skipped silently with optional logging\n */\nexport async function getDemoAgents(sdk: PageLinesSDK): Promise<Partial<AgentConfig>[]> {\n // Separate static entries from handle-only entries\n const staticEntries = appStaticAgents.filter((entry): entry is Partial<AgentConfig> => !isHandleOnly(entry))\n const handleOnlyEntries = appStaticAgents.filter(isHandleOnly)\n\n // Fetch all handle-only entries in parallel (Promise.allSettled for graceful failure)\n const fetchResults = await Promise.allSettled(\n handleOnlyEntries.map(entry => sdk.user.getPublicAgent({ handle: entry.handle })),\n )\n\n // Extract successful fetches, log failures\n const fetchedAgents = fetchResults\n .map((result, index) => {\n if (result.status === 'fulfilled' && result.value) {\n return result.value\n }\n // Log failure but continue\n if (result.status === 'rejected' && sdk.logger) {\n sdk.logger.warn('Failed to fetch demo agent', {\n handle: handleOnlyEntries[index]?.handle,\n error: result.reason,\n })\n }\n return null\n })\n .filter((agent): agent is Partial<AgentConfig> => agent !== null)\n\n // Combine static + fetched\n return [...staticEntries, ...fetchedAgents]\n}\n\nexport function getDemoAgentByHandle(handle: string) {\n return appGetStaticAgentByHandle(handle)\n}\n\n// Direct re-exports\nexport { staticAgents } from './static/data'\n"],"names":["staticAgents","getStaticAgentByHandle","handle","a","__name","isHandleOnly","entry","getDemoAgents","sdk","staticEntries","appStaticAgents","handleOnlyEntries","fetchedAgents","result","index","agent","getDemoAgentByHandle","appGetStaticAgentByHandle"],"mappings":"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"}