@agimon-ai/po-artifact 0.0.0-alpha.1
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/LICENSE +21 -0
- package/README.md +18 -0
- package/dist/apiContracts.cjs +112 -0
- package/dist/apiContracts.cjs.map +1 -0
- package/dist/apiContracts.d.mts +53 -0
- package/dist/apiContracts.d.mts.map +1 -0
- package/dist/apiContracts.mjs +107 -0
- package/dist/apiContracts.mjs.map +1 -0
- package/dist/extensions/native.mjs +700 -0
- package/dist/extensions/native.mjs.map +1 -0
- package/dist/extensions/server.cjs +561 -0
- package/dist/extensions/server.cjs.map +1 -0
- package/dist/extensions/server.d.mts +5 -0
- package/dist/extensions/server.d.mts.map +1 -0
- package/dist/extensions/server.mjs +532 -0
- package/dist/extensions/server.mjs.map +1 -0
- package/dist/extensions/web.mjs +507 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/index.cjs +0 -0
- package/dist/index.d.mts +22 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +1 -0
- package/package.json +152 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["Button","FolderIcon","fontOf","PoNativeTheme","StyleSheet","ArtifactItem","ArtifactListProps","items","onOpen","path","loading","error","grid","ArtifactList","styles","list","meta","length","map","item","label","name","size","toLocaleString","create","theme","gap","spacing","uni__dependencies","minHeight","justifyContent","alignItems","flex","minWidth","fontFamily","sans","fontWeight","fontSize","base","color","colors","text","mono","sm","dim","red","styles","WebPluginSlotProps","CodeBlock","Markdown","fontOf","PoNativeTheme","StyleSheet","ArtifactPreview","Preview","artifactAssetPath","artifactPreviewMode","ArtifactPreviewProps","preview","sessionId","renderFilePreview","renderMediaPreview","media","data","mimeType","mediaError","onOpen","path","mode","styles","error","meta","key","title","unavailable","reason","html","content","resolved","undefined","split","at","text","create","theme","minHeight","spacing","uni__dependencies","fontFamily","mono","fontSize","sm","lineHeight","color","colors","sans","dim","red","styles","WebPluginSlotProps","Button","fontOf","PoNativeTheme","useEffect","useRef","useState","StyleSheet","ArtifactPreview","Preview","fetchArtifactMedia","fetchArtifactPreview","prepareArtifactSave","artifactPreviewMode","artifactTabId","useArtifacts","Loaded","key","preview","error","media","data","mimeType","mediaError","ArtifactPanel","path","props","snapshot","sessionId","item","items","find","version","modifiedAt","size","downloadKey","loaded","setLoaded","controller","AbortController","signal","then","aborted","renderMediaPreview","Error","message","String","catch","abort","current","undefined","downloadController","download","setDownload","saving","note","save","nativeSaveFile","file","styles","content","actions","meta","renderFilePreview","openTransientTab","artifactTab","Parameters","id","label","split","at","panel","create","theme","padding","spacing","gap","uni__dependencies","flexDirection","flexWrap","fontFamily","mono","fontSize","sm","color","colors","dim","sans","red","styles","WebPluginSlotProps","fontOf","PoNativeTheme","StyleSheet","useArtifacts","ArtifactList","artifactTab","ArtifactsPanel","props","snapshot","sessionId","styles","content","heading","items","loaded","error","path","openTransientTab","ArtifactsActivitySection","slice","artifactsTab","Parameters","id","label","panel","create","theme","padding","spacing","gap","uni__dependencies","fontFamily","sans","fontWeight","fontSize","lg","color","colors","hi","activityGroupArtifacts","channelArtifacts","fillArtifacts"],"sources":["../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactView.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsApi.native.ts","../../src/types/artifacts.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/artifactHooks.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactList.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPreview.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactsPanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { ArtifactPreview, ArtifactSnapshot } from './artifacts';\n\nconst routes = {\n list: {\n method: 'GET',\n path: '/',\n response: undefined as unknown as ApiResponseOf<ArtifactSnapshot>,\n },\n preview: {\n method: 'GET',\n path: '/preview',\n query: ['path'],\n response: undefined as unknown as ApiResponseOf<ArtifactPreview>,\n },\n content: {\n method: 'GET',\n path: '/content',\n query: ['path'],\n raw: true,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'artifacts' at. */\nexport const apiScopes = ['session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'artifacts',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import type { ArtifactItem, ArtifactSnapshot } from '../../../../../types/artifacts';\n\nexport function sortedArtifacts(items: readonly ArtifactItem[]): ArtifactItem[] {\n return [...items].sort(\n (left, right) =>\n right.modifiedAt - left.modifiedAt || (left.path < right.path ? -1 : left.path > right.path ? 1 : 0),\n );\n}\n\nexport function artifactTabId(sessionId: string, path: string): string {\n return `artifact:${encodeURIComponent(sessionId)}:${encodeURIComponent(path)}`;\n}\n\nexport function artifactsTabId(sessionId: string): string {\n return `artifacts-${encodeURIComponent(sessionId)}`;\n}\n\n/** Resolves document assets within the artifact folder, never into another filesystem root. */\nexport function artifactAssetPath(documentPath: string, imagePath: string): string {\n if (!imagePath || imagePath.startsWith('/') || imagePath.includes('\\\\') || /^[a-z][a-z0-9+.-]*:/iu.test(imagePath))\n throw new Error('Artifact images must use a relative path.');\n const segments = documentPath.split('/').slice(0, -1);\n for (const segment of imagePath.split('/')) {\n if (segment === '' || segment === '.') continue;\n if (segment === '..') {\n if (segments.length === 0) throw new Error('The image is outside this artifact folder.');\n segments.pop();\n } else segments.push(segment);\n }\n if (segments.length === 0) throw new Error('The image path is empty.');\n return segments.join('/');\n}\n\nexport function artifactPreviewMode(path: string): 'markdown' | 'html' | 'media' | 'code' | 'text' {\n if (/\\.(?:png|jpe?g|gif|webp|avif|bmp|svg|ico|mp3|wav|m4a|ogg|mp4|mov|webm|pdf)$/iu.test(path)) return 'media';\n if (/\\.(?:md|markdown)$/iu.test(path)) return 'markdown';\n if (/\\.html?$/iu.test(path)) return 'html';\n if (/\\.(?:[cm]?[jt]sx?|json|ya?ml|css|scss|py|sh|bash|go|rs|rb|java|c|cpp|h|sql|xml|toml)$/iu.test(path))\n return 'code';\n return 'text';\n}\n\n/** A malformed channel frame must not replace the current session's known inventory. */\nexport function parseArtifactSnapshot(input: unknown): ArtifactSnapshot | null {\n if (typeof input !== 'object' || input === null || !('items' in input) || !Array.isArray(input.items)) return null;\n if ('error' in input && input.error !== undefined && typeof input.error !== 'string') return null;\n const items: ArtifactItem[] = [];\n for (const item of input.items) {\n if (\n typeof item !== 'object' ||\n item === null ||\n typeof item.path !== 'string' ||\n !item.path ||\n item.path.startsWith('/') ||\n item.path.includes('\\\\') ||\n item.path.split('/').some((part: string) => part === '..' || part === '.') ||\n typeof item.name !== 'string' ||\n !item.name ||\n typeof item.size !== 'number' ||\n !Number.isFinite(item.size) ||\n item.size < 0 ||\n typeof item.modifiedAt !== 'number' ||\n !Number.isFinite(item.modifiedAt) ||\n item.modifiedAt < 0\n )\n return null;\n items.push({ path: item.path, name: item.name, size: item.size, modifiedAt: item.modifiedAt });\n }\n return {\n items: sortedArtifacts(items),\n ...('error' in input && typeof input.error === 'string' ? { error: input.error } : {}),\n };\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\n\nimport { api } from '../../../../../../generated/client.native';\nimport type { ArtifactPreview, ArtifactSnapshot } from '../../../../../types/artifacts';\nimport { parseArtifactSnapshot } from './artifactView';\n\nconst MAX_MEDIA_BYTES = 5 * 1024 * 1024;\n\nexport async function fetchArtifacts(sessionId: string, signal: AbortSignal): Promise<ArtifactSnapshot> {\n const result = await api.session(sessionId).list({ signal });\n if (!result.ok) throw new Error(result.error || 'Artifacts could not be loaded.');\n const snapshot = parseArtifactSnapshot(result.data);\n if (!snapshot) throw new Error('The session returned an invalid artifact list.');\n return snapshot;\n}\n\nexport async function fetchArtifactPreview(\n sessionId: string,\n path: string,\n signal: AbortSignal,\n): Promise<ArtifactPreview> {\n const result = await api.session(sessionId).preview({ query: { path }, signal });\n if (!result.ok) throw new Error(result.error || 'This artifact could not be read.');\n const preview = result.data;\n if (\n !preview ||\n typeof preview.path !== 'string' ||\n typeof preview.content !== 'string' ||\n typeof preview.mimeType !== 'string'\n )\n throw new Error('The session returned an invalid artifact preview.');\n return preview;\n}\n\n/** No browser btoa or Node Buffer is available in an independently loaded native plugin. */\nfunction base64(bytes: Uint8Array): string {\n const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n const parts: string[] = [];\n let chunk = '';\n for (let offset = 0; offset < bytes.length; offset += 3) {\n const first = bytes[offset]!;\n const second = bytes[offset + 1];\n const third = bytes[offset + 2];\n chunk +=\n alphabet[first >> 2]! +\n alphabet[((first & 3) << 4) | ((second ?? 0) >> 4)]! +\n (second === undefined ? '=' : alphabet[((second & 15) << 2) | ((third ?? 0) >> 6)]!) +\n (third === undefined ? '=' : alphabet[third & 63]!);\n if (chunk.length >= 8192) {\n parts.push(chunk);\n chunk = '';\n }\n }\n parts.push(chunk);\n return parts.join('');\n}\n\nexport async function fetchArtifactMedia(\n sessionId: string,\n path: string,\n signal: AbortSignal,\n): Promise<{ data: string; mimeType: string }> {\n const result = await api.session(sessionId).content({ query: { path }, signal });\n if (!result.ok) throw new Error(result.error || 'This media could not be loaded.');\n const declaredLength = result.response.headers.get('content-length');\n const length = declaredLength !== null && /^\\d+$/u.test(declaredLength) ? Number(declaredLength) : NaN;\n if (!Number.isSafeInteger(length) || length < 0 || length > MAX_MEDIA_BYTES)\n throw new Error('This media is too large to preview.');\n const bytes = new Uint8Array(await result.response.arrayBuffer());\n if (signal.aborted) throw new Error('Media loading cancelled.');\n if (bytes.byteLength > MAX_MEDIA_BYTES) throw new Error('This media is too large to preview.');\n const mimeType = result.response.headers.get('content-type')?.split(';')[0]?.trim().toLowerCase() ?? '';\n if (!/^(?:image\\/[a-z0-9.+-]+|audio\\/[a-z0-9.+-]+|video\\/[a-z0-9.+-]+|application\\/pdf)$/u.test(mimeType))\n throw new Error('This media type cannot be previewed.');\n return { data: base64(bytes), mimeType };\n}\n\n/** The native host owns saving, with bounded version-checked reads supplied by this package. */\nexport async function prepareArtifactSave(\n sessionId: string,\n path: string,\n signal: AbortSignal,\n): Promise<Parameters<NonNullable<WebPluginSlotProps['nativeSaveFile']>>[0]> {\n const load = async (headers: Record<string, string>, signal: AbortSignal): Promise<Response> => {\n if (signal.aborted) throw new Error('Download cancelled.');\n const result = await api.session(sessionId).content({ query: { path }, headers, signal });\n if (!result.ok && result.status !== 416) throw new Error(result.error || 'This artifact could not be read.');\n if (!result.response) throw new Error('This artifact could not be read.');\n return result.response;\n };\n const probe = await load({ Range: 'bytes=0-0' }, signal);\n const range = /^bytes 0-0\\/(\\d+)$/u.exec(probe.headers.get('content-range') ?? '');\n const empty =\n (probe.status === 416 && probe.headers.get('content-range') === 'bytes */0') ||\n (probe.status === 200 && probe.headers.get('content-length') === '0');\n if (!empty && (probe.status !== 206 || !range)) throw new Error('This artifact does not support bounded downloads.');\n const size = empty ? 0 : Number(range![1]);\n if (!Number.isSafeInteger(size) || size < 0) throw new Error('Invalid artifact size.');\n if ((await probe.arrayBuffer()).byteLength !== (empty ? 0 : 1)) throw new Error('Invalid artifact response.');\n if (signal.aborted) throw new Error('Download cancelled.');\n const version = probe.headers.get('etag');\n if (!version) throw new Error('The artifact has no version validator.');\n return {\n name: path.split('/').at(-1) ?? 'artifact',\n mimeType: probe.headers.get('content-type')?.split(';')[0]?.trim() || 'application/octet-stream',\n size,\n signal,\n read: async (offset, count, signal) => {\n if (\n !Number.isSafeInteger(offset) ||\n !Number.isSafeInteger(count) ||\n offset < 0 ||\n count < 1 ||\n count > 1024 * 1024 ||\n offset + count > size\n )\n throw new Error('Invalid download range.');\n const end = offset + count - 1;\n const response = await load({ Range: `bytes=${offset}-${end}`, 'If-Match': version }, signal);\n if (\n response.status !== 206 ||\n response.headers.get('etag') !== version ||\n response.headers.get('content-range') !== `bytes ${offset}-${end}/${size}`\n )\n throw new Error('The artifact changed or its range response is invalid.');\n const bytes = new Uint8Array(await response.arrayBuffer());\n if (signal.aborted) throw new Error('Download cancelled.');\n if (bytes.byteLength !== count) throw new Error('The artifact response is incomplete.');\n return bytes;\n },\n };\n}\n","export interface ArtifactItem {\n /** Relative to the current session's artifact directory. */\n path: string;\n name: string;\n size: number;\n modifiedAt: number;\n}\n\nexport interface ArtifactSnapshot {\n items: ArtifactItem[];\n error?: string;\n}\n\nexport interface ArtifactPreview {\n path: string;\n content: string;\n mimeType: string;\n unavailable?: boolean;\n reason?: string;\n}\n\nexport const artifactsChannelType = 'artifacts';\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { artifactsChannelType, type ArtifactSnapshot } from '../../../../../types/artifacts';\nimport { parseArtifactSnapshot, sortedArtifacts } from './artifactView';\n\nexport interface ArtifactsSession extends ArtifactSnapshot {\n loaded: boolean;\n}\n\nexport const artifacts = defineSessionStore<ArtifactsSession>({ items: [], loaded: false });\n\nexport const artifactsChannel = artifacts.channel<ArtifactSnapshot>({\n channel: artifactsChannelType,\n parse: parseArtifactSnapshot,\n reduce: (_current, snapshot) => ({ ...snapshot, items: sortedArtifacts(snapshot.items), loaded: true }),\n});\n\n/** An idle library remains reachable, without marking it as background work. */\nexport const artifactActivitySource = {\n subscribe: (listener: () => void) => {\n const subscription = artifacts.store.subscribe(listener);\n return () => subscription.unsubscribe();\n },\n isActive: () => false,\n};\n","import { useEffect, useSyncExternalStore } from 'react';\n\nimport { fetchArtifacts } from '../_lib/artifactsApi.native';\nimport { artifactActivitySource, artifacts } from '../_lib/artifactsStore.native';\n\n/** A fresh grid read complements the live session channel and seeds a newly attached rail. */\nexport function useArtifacts(sessionId: string | null, refreshOnMount = false) {\n const snapshot = useSyncExternalStore(artifactActivitySource.subscribe, () =>\n artifacts.select(artifacts.store.state, sessionId),\n );\n useEffect(() => {\n if (sessionId === null) return;\n const before = artifacts.select(artifacts.store.state, sessionId);\n if (before.loaded && !refreshOnMount) return;\n const controller = new AbortController();\n void fetchArtifacts(sessionId, controller.signal)\n .then((next) => {\n if (!controller.signal.aborted)\n artifacts.update(sessionId, (current) => (current === before ? { ...next, loaded: true } : current));\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n artifacts.update(sessionId, (current) =>\n current === before\n ? { ...current, loaded: true, error: error instanceof Error ? error.message : String(error) }\n : current,\n );\n });\n return () => controller.abort();\n }, [sessionId, refreshOnMount]);\n return snapshot;\n}\n","import { Button, FolderIcon, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { ArtifactItem } from '../../../../../types/artifacts';\n\nexport interface ArtifactListProps {\n items: readonly ArtifactItem[];\n onOpen: (path: string) => void;\n loading?: boolean;\n error?: string;\n grid?: boolean;\n}\n\n/** Presentation only. The session store and guarded API belong to the containers. */\nexport function ArtifactList({ items, onOpen, loading, error, grid = false }: ArtifactListProps) {\n return (\n <View testID={grid ? 'artifacts-grid' : 'artifacts-recent'} style={styles.list}>\n {error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {error}\n </Text>\n ) : null}\n {loading ? <Text style={styles.meta}>Loading artifacts...</Text> : null}\n {!loading && !error && items.length === 0 ? (\n <Text style={styles.meta}>Documents saved for this session will appear here.</Text>\n ) : null}\n {items.map((item) => (\n <Button\n key={item.path}\n variant={grid ? 'outline' : 'ghost'}\n size=\"card\"\n accessibilityLabel={`Open ${item.path}`}\n testID={`artifact-${item.path}`}\n onPress={() => onOpen(item.path)}\n style={styles.item}\n >\n <FolderIcon size={18} color=\"dim\" />\n <View style={styles.label}>\n <Text numberOfLines={2} style={styles.name}>\n {item.name}\n </Text>\n {grid || item.path !== item.name ? (\n <Text numberOfLines={2} style={styles.path}>\n {item.path}\n </Text>\n ) : null}\n {grid ? <Text style={styles.meta}>{item.size.toLocaleString('en-US')} bytes</Text> : null}\n </View>\n </Button>\n ))}\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n list: { gap: theme.spacing(2) },\n item: { minHeight: 44, justifyContent: 'flex-start', alignItems: 'center', gap: theme.spacing(2) },\n label: { flex: 1, gap: theme.spacing(1), minWidth: 0 },\n name: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontWeight: '600',\n fontSize: theme.fontSize.base,\n color: theme.colors.text,\n },\n path: { fontFamily: fontOf(theme.fontFamily.mono), fontSize: theme.fontSize.sm, color: theme.colors.dim },\n meta: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.dim },\n error: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.red },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { CodeBlock, Markdown, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { ArtifactPreview as Preview } from '../../../../../types/artifacts';\nimport { artifactAssetPath, artifactPreviewMode } from '../_lib/artifactView';\n\nexport interface ArtifactPreviewProps {\n preview: Preview;\n sessionId: string;\n renderFilePreview?: WebPluginSlotProps['renderFilePreview'];\n renderMediaPreview?: WebPluginSlotProps['renderMediaPreview'];\n media?: { data: string; mimeType: string };\n mediaError?: string;\n onOpen: (path: string) => void;\n}\n\n/** The host receives only content fetched through the artifact's bounded route. */\nexport function ArtifactPreview({\n preview,\n sessionId,\n renderFilePreview,\n renderMediaPreview,\n media,\n mediaError,\n onOpen,\n}: ArtifactPreviewProps) {\n const mode = artifactPreviewMode(preview.path);\n if (mode === 'media') {\n if (mediaError)\n return (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {mediaError}\n </Text>\n );\n if (!renderMediaPreview) return <Text style={styles.meta}>This host cannot display this media preview.</Text>;\n if (!media) return <Text style={styles.meta}>Loading media...</Text>;\n return (\n <>\n {renderMediaPreview({\n key: `artifact-media-${sessionId}-${preview.path}`,\n title: preview.path,\n path: preview.path,\n data: media.data,\n mimeType: media.mimeType,\n })}\n </>\n );\n }\n if (preview.unavailable)\n return <Text style={styles.meta}>{preview.reason ?? 'This artifact cannot be previewed.'}</Text>;\n if (mode === 'html') {\n return renderFilePreview ? (\n <View style={styles.html}>\n {renderFilePreview({\n key: `artifact-html-${sessionId}-${preview.path}`,\n html: preview.content,\n title: preview.path,\n })}\n </View>\n ) : (\n <Text style={styles.meta}>This host cannot display HTML previews.</Text>\n );\n }\n if (mode === 'markdown') {\n return (\n <Markdown\n text={preview.content}\n onFileLink={(path) => {\n try {\n const resolved = artifactAssetPath(preview.path, path);\n return () => onOpen(resolved);\n } catch {\n // An out-of-folder or non-file link is not an artifact action.\n return undefined;\n }\n }}\n />\n );\n }\n if (mode === 'code') return <CodeBlock text={preview.content} language={preview.path.split('.').at(-1)} />;\n return (\n <Text selectable style={styles.text}>\n {preview.content}\n </Text>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n html: { minHeight: theme.spacing(90) },\n text: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n color: theme.colors.text,\n },\n meta: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.dim },\n error: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.red },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { Button, fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useEffect, useRef, useState } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport type { ArtifactPreview as Preview } from '../../../../../types/artifacts';\nimport { fetchArtifactMedia, fetchArtifactPreview, prepareArtifactSave } from '../_lib/artifactsApi.native';\nimport { artifactPreviewMode, artifactTabId } from '../_lib/artifactView';\nimport { useArtifacts } from './artifactHooks.native';\nimport { ArtifactPreview } from './ArtifactPreview.native';\n\ninterface Loaded {\n key: string;\n preview?: Preview;\n error?: string;\n media?: { data: string; mimeType: string };\n mediaError?: string;\n}\n\nexport function ArtifactPanel({ path, ...props }: WebPluginSlotProps & { path: string }) {\n const snapshot = useArtifacts(props.sessionId);\n const item = snapshot.items.find((item) => item.path === path);\n const version = `${item?.modifiedAt ?? ''}:${item?.size ?? ''}`;\n const downloadKey = `${props.sessionId}:${path}`;\n const key = `${downloadKey}:${version}`;\n const [loaded, setLoaded] = useState<Loaded>();\n useEffect(() => {\n if (props.sessionId === null) return;\n const sessionId = props.sessionId;\n const controller = new AbortController();\n void fetchArtifactPreview(sessionId, path, controller.signal)\n .then(async (preview) => {\n if (controller.signal.aborted) return;\n setLoaded({ key, preview });\n if (artifactPreviewMode(path) !== 'media' || !props.renderMediaPreview) return;\n try {\n const media = await fetchArtifactMedia(sessionId, path, controller.signal);\n if (!controller.signal.aborted) setLoaded({ key, preview, media });\n } catch (error) {\n if (!controller.signal.aborted)\n setLoaded({ key, preview, mediaError: error instanceof Error ? error.message : String(error) });\n }\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ key, error: error instanceof Error ? error.message : String(error) });\n });\n return () => controller.abort();\n }, [props.sessionId, path, key, props.renderMediaPreview]);\n const current = loaded?.key === key ? loaded : undefined;\n const downloadController = useRef<AbortController | undefined>(undefined);\n const [download, setDownload] = useState<{ key: string; saving?: boolean; note?: string }>();\n useEffect(\n () => () => {\n downloadController.current?.abort();\n downloadController.current = undefined;\n },\n [props.sessionId, path],\n );\n const saving = download?.key === downloadKey && download.saving === true;\n const save = async () => {\n if (props.sessionId === null || !props.nativeSaveFile || downloadController.current) return;\n const controller = new AbortController();\n downloadController.current = controller;\n setDownload({ key: downloadKey, saving: true });\n try {\n const file = await prepareArtifactSave(props.sessionId, path, controller.signal);\n if (controller.signal.aborted || downloadController.current !== controller) return;\n await props.nativeSaveFile(file);\n if (!controller.signal.aborted && downloadController.current === controller)\n setDownload({ key: downloadKey, note: 'Saved.' });\n } catch (error) {\n if (!controller.signal.aborted && downloadController.current === controller)\n setDownload({ key: downloadKey, note: error instanceof Error ? error.message : String(error) });\n } finally {\n if (downloadController.current === controller) downloadController.current = undefined;\n }\n };\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text selectable style={styles.path}>\n {path}\n </Text>\n {props.nativeSaveFile ? (\n <View style={styles.actions}>\n <Button variant=\"outline\" disabled={saving || props.sessionId === null} onPress={() => void save()}>\n Download\n </Button>\n {saving ? (\n <Button\n variant=\"ghost\"\n onPress={() => {\n downloadController.current?.abort();\n downloadController.current = undefined;\n setDownload({ key: downloadKey, note: 'Download cancelled.' });\n }}\n >\n Cancel download\n </Button>\n ) : null}\n </View>\n ) : (\n <Text style={styles.meta}>This host cannot save artifact downloads.</Text>\n )}\n {download?.key === downloadKey && download.note ? (\n <Text accessibilityLiveRegion=\"polite\" style={styles.meta}>\n {download.note}\n </Text>\n ) : null}\n {props.sessionId === null ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n The session is unavailable.\n </Text>\n ) : current?.error ? (\n <Text accessibilityRole=\"alert\" style={styles.error}>\n {current.error}\n </Text>\n ) : current?.preview ? (\n <ArtifactPreview\n preview={current.preview}\n sessionId={props.sessionId}\n renderFilePreview={props.renderFilePreview}\n renderMediaPreview={props.renderMediaPreview}\n media={current.media}\n mediaError={current.mediaError}\n onOpen={(path) => {\n if (props.sessionId !== null) props.openTransientTab(artifactTab(props.sessionId, path));\n }}\n />\n ) : (\n <Text style={styles.meta}>Reading this artifact...</Text>\n )}\n </ScrollView>\n );\n}\n\nexport function artifactTab(sessionId: string, path: string): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return {\n id: artifactTabId(sessionId, path),\n label: path.split('/').at(-1) ?? path,\n panel: (props) => <ArtifactPanel {...props} sessionId={sessionId} path={path} />,\n };\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n content: { padding: theme.spacing(4), gap: theme.spacing(3) },\n actions: { flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(2) },\n path: { fontFamily: fontOf(theme.fontFamily.mono), fontSize: theme.fontSize.sm, color: theme.colors.dim },\n meta: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.dim },\n error: { fontFamily: fontOf(theme.fontFamily.sans), fontSize: theme.fontSize.sm, color: theme.colors.red },\n}));\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport { fontOf } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { ScrollView, Text } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { useArtifacts } from './artifactHooks.native';\nimport { ArtifactList } from './ArtifactList.native';\nimport { artifactTab } from './ArtifactPanel.native';\n\nexport function ArtifactsPanel(props: WebPluginSlotProps) {\n const snapshot = useArtifacts(props.sessionId, true);\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text accessibilityRole=\"header\" style={styles.heading}>\n Artifacts\n </Text>\n <ArtifactList\n grid\n items={snapshot.items}\n loading={!snapshot.loaded}\n error={props.sessionId === null ? 'The session is unavailable.' : snapshot.error}\n onOpen={(path) => {\n if (props.sessionId !== null) props.openTransientTab(artifactTab(props.sessionId, path));\n }}\n />\n </ScrollView>\n );\n}\n\nexport function ArtifactsActivitySection(props: WebPluginSlotProps) {\n const snapshot = useArtifacts(props.sessionId);\n return (\n <ArtifactList\n items={snapshot.items.slice(0, 3)}\n loading={!snapshot.loaded}\n error={props.sessionId === null ? 'The session is unavailable.' : snapshot.error}\n onOpen={(path) => {\n if (props.sessionId !== null) props.openTransientTab(artifactTab(props.sessionId, path));\n }}\n />\n );\n}\n\nexport function artifactsTab(): Parameters<WebPluginSlotProps['openTransientTab']>[0] {\n return {\n id: 'artifacts',\n label: 'Artifacts',\n panel: ArtifactsPanel,\n };\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n content: { padding: theme.spacing(4), gap: theme.spacing(4) },\n heading: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontWeight: '600',\n fontSize: theme.fontSize.lg,\n color: theme.colors.hi,\n },\n}));\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\n\nimport { artifactsTab } from '../_components/ArtifactsPanel.native';\nimport { artifactActivitySource } from '../_lib/artifactsStore.native';\n\nexport default defineActivityGroup({\n name: 'artifacts',\n keys: '',\n activeSource: artifactActivitySource,\n marksBackgroundWork: false,\n transientTab: artifactsTab,\n order: 15,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { artifactsChannel } from '../_lib/artifactsStore.native';\n\nexport default defineChannelFile(artifactsChannel);\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { ArtifactsActivitySection } from '../_components/ArtifactsPanel.native';\n\nexport default defineFill({ slot: 'activity.artifacts', id: 'artifacts', component: ArtifactsActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport activityGroupArtifacts from '../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.native';\nimport channelArtifacts from '../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.native';\nimport fillArtifacts from '../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.native';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const nativePlugin = defineNativePlugin({\n id: 'artifacts',\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'artifacts' }, activityGroupArtifacts)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'artifacts' }, channelArtifacts)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.artifacts', id: 'artifacts' }, fillArtifacts)]; },\n },\n});\n"],"mappings":"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"}
|