@agimon-ai/po-artifact 0.0.0-alpha.4 → 0.0.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { createApiClient, defineActivityGroup, defineChannelFile, defineFill, defineSessionStore, defineWebPlugin, sessionApiAddress } from "@agimon-ai/po-core/web";
1
+ import { createApiClient, defineActivityGroup, defineChannelFile, defineFileLinks, defineFill, defineSessionStore, defineWebPlugin, sessionApiAddress } from "@agimon-ai/po-core/web";
2
2
  import { Breadcrumb, Button, CodeEditor, EmptyState, FileIcon, Markdown, MediaPreview } from "@agimon-ai/po-web-components";
3
3
  import { useStore } from "@tanstack/react-store";
4
4
  import { useCallback, useEffect, useState } from "react";
@@ -463,7 +463,7 @@ function ArtifactsPanel({ sessionId, openTransientTab }) {
463
463
  }
464
464
  //#endregion
465
465
  //#region src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.web.ts
466
- var artifacts_web_default$1 = defineActivityGroup({
466
+ var artifacts_web_default$2 = defineActivityGroup({
467
467
  icon: FileIcon,
468
468
  keys: "",
469
469
  statusKey: "po-artifacts",
@@ -474,7 +474,20 @@ var artifacts_web_default$1 = defineActivityGroup({
474
474
  });
475
475
  //#endregion
476
476
  //#region src/extensions/workspaces/sessions/(frontend)/channel/artifacts.web.ts
477
- var artifacts_web_default = defineChannelFile(artifactsChannel);
477
+ var artifacts_web_default$1 = defineChannelFile(artifactsChannel);
478
+ //#endregion
479
+ //#region src/extensions/workspaces/sessions/(frontend)/file-links/artifacts.web.ts
480
+ /** Artifact references belong to the session store, never the repository file API. */
481
+ var artifacts_web_default = defineFileLinks({
482
+ subscribe: () => () => {},
483
+ fingerprint: () => "",
484
+ resolve(sessionId, path) {
485
+ const reference = path.trim();
486
+ if (sessionId === null || !reference.startsWith("artifact:")) return void 0;
487
+ const relative = reference.slice(9);
488
+ return relative === "" ? void 0 : artifactTab(sessionId, relative);
489
+ }
490
+ });
478
491
  //#endregion
479
492
  //#region src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.web.tsx
480
493
  var Artifacts_activity_artifacts_web_default = defineFill({ component: ArtifactsActivitySection });
@@ -488,10 +501,13 @@ const webPlugin = defineWebPlugin({
488
501
  id: "artifacts",
489
502
  session: {
490
503
  get activityGroups() {
491
- return [via({ name: "artifacts" }, artifacts_web_default$1)];
504
+ return [via({ name: "artifacts" }, artifacts_web_default$2)];
492
505
  },
493
506
  get channels() {
494
- return [via({ channel: "artifacts" }, artifacts_web_default)];
507
+ return [via({ channel: "artifacts" }, artifacts_web_default$1)];
508
+ },
509
+ get fileLinks() {
510
+ return artifacts_web_default;
495
511
  },
496
512
  get fills() {
497
513
  return [via({
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","names":["activityGroupArtifacts","channelArtifacts","fillArtifacts"],"sources":["../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/types/artifacts.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactView.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsStore.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPreviewView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPreviewPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactsView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactsPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.web.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.web.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.web.tsx","../../generated/web.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, sessionApiAddress } from '@agimon-ai/po-core/web';\nimport { sealedTransport } from '@agimon-ai/po-web-security/browser';\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: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\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 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 { defineSessionStore } from '@agimon-ai/po-core/web';\n\nimport { artifactsChannelType, type ArtifactSnapshot } from '../../../../../types/artifacts';\nimport { parseArtifactSnapshot } from './artifactView';\n\nexport const artifacts = defineSessionStore<ArtifactSnapshot & { loaded: boolean }>({ items: [], loaded: false });\n\nexport const artifactsChannel = artifacts.channel<ArtifactSnapshot>({\n channel: artifactsChannelType,\n parse: parseArtifactSnapshot,\n reduce: (_current, snapshot) => ({ ...snapshot, loaded: true }),\n});\n\n/** Artifact documents are outcomes, not background work. The source also keeps the empty launcher visible. */\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 { api } from '../../../../../../generated/client';\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifacts } from './artifactsStore';\nimport { artifactAssetPath, parseArtifactSnapshot } from './artifactView';\n\nexport async function refreshArtifacts(sessionId: string, signal: AbortSignal): Promise<void> {\n const before = artifacts.select(artifacts.store.state, sessionId);\n try {\n const result = await api.session(sessionId).list({ signal });\n if (signal.aborted || artifacts.select(artifacts.store.state, sessionId) !== before) return;\n const snapshot = result.ok ? parseArtifactSnapshot(result.data) : null;\n artifacts.update(sessionId, () =>\n snapshot\n ? { ...snapshot, loaded: true }\n : {\n ...before,\n loaded: true,\n error: result.ok\n ? 'The session answered with no artifact list.'\n : result.error || 'Artifacts could not be loaded.',\n },\n );\n } catch (error) {\n if (!signal.aborted && artifacts.select(artifacts.store.state, sessionId) === before)\n artifacts.update(sessionId, () => ({\n ...before,\n loaded: true,\n error: error instanceof Error ? error.message : String(error),\n }));\n }\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 answered with no artifact.');\n return preview;\n}\n\n/** Generated raw calls keep media and Markdown asset reads on the sealed artifact transport. */\nexport async function artifactBlob(sessionId: string, path: string, signal?: AbortSignal): Promise<Blob> {\n const result = await api.session(sessionId).content({ query: { path }, ...(signal ? { signal } : {}) });\n if (!result.ok) throw new Error(result.error || 'This artifact could not be loaded.');\n return result.response.blob();\n}\n\nexport async function loadArtifactImage(sessionId: string, documentPath: string, imagePath: string) {\n const blob = await artifactBlob(sessionId, artifactAssetPath(documentPath, imagePath));\n if (!blob.type.startsWith('image/')) throw new Error('This artifact asset is not an image.');\n const url = URL.createObjectURL(blob);\n return { url, dispose: () => URL.revokeObjectURL(url) };\n}\n","import { Breadcrumb, CodeEditor, Markdown } from '@agimon-ai/po-web-components';\nimport type { ReactNode } from 'react';\n\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifactPreviewMode } from '../_lib/artifactView';\n\ninterface ArtifactPreviewViewProps {\n path: string;\n preview?: ArtifactPreview;\n error?: string;\n media?: ReactNode;\n loadImage?: (path: string) => Promise<{ url: string; dispose: () => void }>;\n}\n\nexport function ArtifactPreviewView({ path, preview, error, media, loadImage }: ArtifactPreviewViewProps) {\n const mode = artifactPreviewMode(path);\n return (\n <div\n data-testid=\"artifact-preview\"\n data-artifact-path={path}\n className=\"flex min-h-0 flex-1 flex-col bg-po-bg text-po-text\"\n >\n <header className=\"flex shrink-0 items-center gap-2 border-b border-po-border px-4 py-3\">\n <Breadcrumb path={path} className=\"min-w-0 flex-1\" />\n <span className=\"text-sm text-po-dim\">Artifact</span>\n </header>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : !preview ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Reading this artifact...\n </p>\n ) : mode === 'media' ? (\n media\n ) : preview.unavailable ? (\n <p className=\"text-sm text-po-dim\">{preview.reason ?? 'This artifact cannot be previewed.'}</p>\n ) : mode === 'markdown' ? (\n <Markdown text={preview.content} loadImage={loadImage} />\n ) : mode === 'html' ? (\n <iframe\n title={path}\n sandbox=\"\"\n srcDoc={preview.content}\n className=\"h-96 w-full rounded-md border border-po-border bg-po-deep\"\n />\n ) : mode === 'code' ? (\n <CodeEditor\n value={preview.content}\n path={path}\n readOnly\n className=\"min-h-64 rounded-md border border-po-border\"\n />\n ) : (\n <pre className=\"whitespace-pre-wrap break-words font-mono text-sm text-po-text\">{preview.content}</pre>\n )}\n </div>\n </div>\n );\n}\n","import type { TransientTab, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { MediaPreview } from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifactBlob, fetchArtifactPreview, loadArtifactImage } from '../_lib/artifactsApi';\nimport { artifacts } from '../_lib/artifactsStore';\nimport { artifactTabId } from '../_lib/artifactView';\nimport { ArtifactPreviewView } from './ArtifactPreviewView';\n\nfunction ArtifactMedia({ sessionId, path, revision }: { sessionId: string; path: string; revision: string }) {\n const [loaded, setLoaded] = useState<{ source: string; url?: string; mimeType?: string; error?: string }>();\n const source = `${sessionId}:${path}:${revision}`;\n useEffect(() => {\n const controller = new AbortController();\n let url: string | undefined;\n void artifactBlob(sessionId, path, controller.signal)\n .then((blob) => {\n if (controller.signal.aborted) return;\n url = URL.createObjectURL(blob);\n setLoaded({ source, url, mimeType: blob.type });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ source, error: error instanceof Error ? error.message : String(error) });\n });\n return () => {\n controller.abort();\n if (url !== undefined) URL.revokeObjectURL(url);\n };\n }, [sessionId, path, source]);\n const current = loaded?.source === source ? loaded : undefined;\n return current?.url ? (\n <MediaPreview src={current.url} path={path} contentType={current.mimeType} />\n ) : (\n <p\n role={current?.error ? 'alert' : 'status'}\n className={current?.error ? 'text-sm text-po-red' : 'text-sm text-po-dim'}\n >\n {current?.error ?? 'Loading artifact media...'}\n </p>\n );\n}\n\nexport function ArtifactPreviewPanel({ path, sessionId }: WebPluginSlotProps & { path: string }) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n const item = snapshot.items.find((candidate) => candidate.path === path);\n const revision = item ? `${item.modifiedAt}:${item.size}` : snapshot.loaded ? 'missing' : 'initial';\n const [loaded, setLoaded] = useState<{\n sessionId: string;\n path: string;\n revision: string;\n preview?: ArtifactPreview;\n error?: string;\n }>();\n useEffect(() => {\n if (sessionId === null || revision === 'missing') return;\n const controller = new AbortController();\n void fetchArtifactPreview(sessionId, path, controller.signal)\n .then((preview) => {\n if (!controller.signal.aborted) setLoaded({ sessionId, path, revision, preview });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ sessionId, path, revision, error: error instanceof Error ? error.message : String(error) });\n });\n return () => controller.abort();\n }, [sessionId, path, revision]);\n const current =\n loaded?.sessionId === sessionId && loaded.path === path && loaded.revision === revision ? loaded : undefined;\n const loadImage = useCallback(\n (imagePath: string) => {\n if (sessionId === null) return Promise.reject(new Error('The session is unavailable.'));\n return loadArtifactImage(sessionId, path, imagePath);\n },\n [sessionId, path],\n );\n return (\n <ArtifactPreviewView\n path={path}\n preview={current?.preview}\n error={\n sessionId === null\n ? 'The session is unavailable.'\n : revision === 'missing'\n ? 'This artifact no longer exists.'\n : current?.error\n }\n loadImage={loadImage}\n media={sessionId === null ? undefined : <ArtifactMedia sessionId={sessionId} path={path} revision={revision} />}\n />\n );\n}\n\nexport function artifactTab(sessionId: string, path: string): TransientTab {\n return {\n id: artifactTabId(sessionId, path),\n label: path.split('/').at(-1) ?? path,\n panel: (props) => <ArtifactPreviewPanel {...props} sessionId={sessionId} path={path} />,\n };\n}\n","import { Button, EmptyState, FileIcon } from '@agimon-ai/po-web-components';\n\nimport type { ArtifactItem } from '../../../../../types/artifacts';\nimport { sortedArtifacts } from '../_lib/artifactView';\n\ninterface ArtifactsViewProps {\n items: readonly ArtifactItem[];\n loading?: boolean;\n error?: string;\n onOpen: (item: ArtifactItem) => void;\n}\n\nfunction sizeLabel(size: number): string {\n return size < 1024\n ? `${size} B`\n : size < 1024 * 1024\n ? `${Math.ceil(size / 1024)} KB`\n : `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function RecentArtifactsView({ items, loading, error, onOpen }: ArtifactsViewProps) {\n return (\n <div data-testid=\"artifacts-recent-items\" className=\"flex flex-col gap-1\">\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n {loading ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Loading artifacts...\n </p>\n ) : null}\n {!loading && !error && items.length === 0 ? <p className=\"text-sm text-po-dim\">No artifacts yet</p> : null}\n {sortedArtifacts(items)\n .slice(0, 3)\n .map((item) => (\n <Button\n key={item.path}\n variant=\"ghost\"\n size=\"card\"\n data-artifact-path={item.path}\n onClick={() => onOpen(item)}\n className=\"gap-0.5 px-2 py-1.5\"\n >\n <span className=\"flex min-w-0 items-center gap-2 text-base text-po-text\">\n <FileIcon aria-hidden className=\"size-3.5 text-po-dim\" />\n <span className=\"truncate\">{item.name}</span>\n </span>\n <span className=\"truncate font-mono text-sm text-po-dim\" title={item.path}>\n {item.path}\n </span>\n </Button>\n ))}\n </div>\n );\n}\n\nexport function ArtifactGridView({ items, loading, error, onOpen }: ArtifactsViewProps) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto bg-po-bg text-po-text\">\n <header className=\"flex shrink-0 items-center gap-3 border-b border-po-border px-4 py-3\">\n <h1 className=\"text-lg font-semibold text-po-hi\">Artifacts</h1>\n <span data-testid=\"artifacts-count\" className=\"text-sm text-po-dim\">\n {items.length} {items.length === 1 ? 'artifact' : 'artifacts'}\n </span>\n </header>\n {error ? (\n <p role=\"alert\" className=\"px-4 py-3 text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n {loading ? (\n <p role=\"status\" className=\"px-4 py-3 text-sm text-po-dim\">\n Loading artifacts...\n </p>\n ) : null}\n {!loading && !error && items.length === 0 ? (\n <EmptyState\n title=\"No artifacts yet\"\n description=\"Documents Po prepares for this session will appear here.\"\n className=\"px-4 py-8\"\n />\n ) : null}\n <div data-testid=\"artifacts-grid\" className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2 xl:grid-cols-3\">\n {sortedArtifacts(items).map((item) => (\n <Button\n key={item.path}\n variant=\"outline\"\n size=\"card\"\n data-artifact-path={item.path}\n onClick={() => onOpen(item)}\n className=\"min-w-0 gap-2 p-4\"\n >\n <FileIcon aria-hidden className=\"size-5 text-po-green\" />\n <span className=\"truncate text-base font-semibold text-po-hi\" title={item.name}>\n {item.name}\n </span>\n <span className=\"truncate font-mono text-sm text-po-dim\" title={item.path}>\n {item.path}\n </span>\n <span className=\"text-sm text-po-dim\">{sizeLabel(item.size)}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { TransientTab, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect } from 'react';\n\nimport { refreshArtifacts } from '../_lib/artifactsApi';\nimport { artifacts } from '../_lib/artifactsStore';\nimport { artifactTab } from './ArtifactPreviewPanel';\nimport { ArtifactGridView, RecentArtifactsView } from './ArtifactsView';\n\nexport function artifactsTab(): TransientTab {\n // The host stores transient tabs per session, including this heading factory's fixed id.\n return { id: 'artifacts-grid', label: 'Artifacts', panel: ArtifactsPanel };\n}\n\nexport function ArtifactsActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n useEffect(() => {\n if (sessionId === null || snapshot.loaded) return;\n const controller = new AbortController();\n void refreshArtifacts(sessionId, controller.signal);\n return () => controller.abort();\n }, [sessionId, snapshot.loaded]);\n return (\n <RecentArtifactsView\n items={snapshot.items}\n loading={!snapshot.loaded}\n error={snapshot.error}\n onOpen={(item) => {\n if (sessionId !== null) openTransientTab(artifactTab(sessionId, item.path));\n }}\n />\n );\n}\n\nexport function ArtifactsPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n useEffect(() => {\n if (sessionId === null) return;\n const controller = new AbortController();\n void refreshArtifacts(sessionId, controller.signal);\n return () => controller.abort();\n }, [sessionId]);\n return (\n <ArtifactGridView\n items={snapshot.items}\n loading={!snapshot.loaded && sessionId !== null}\n error={sessionId === null ? 'The session is unavailable.' : snapshot.error}\n onOpen={(item) => {\n if (sessionId !== null) openTransientTab(artifactTab(sessionId, item.path));\n }}\n />\n );\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/web';\nimport { FileIcon } from '@agimon-ai/po-web-components';\n\nimport { artifactsTab } from '../_components/ArtifactsPanel';\nimport { artifactActivitySource } from '../_lib/artifactsStore';\nexport default defineActivityGroup({\n icon: FileIcon,\n keys: '',\n statusKey: 'po-artifacts',\n activeSource: artifactActivitySource,\n transientTab: artifactsTab,\n marksBackgroundWork: false,\n order: 15,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/web';\n\nimport { artifactsChannel } from '../_lib/artifactsStore';\nexport default defineChannelFile(artifactsChannel);\n","import { defineFill } from '@agimon-ai/po-core/web';\n\nimport { ArtifactsActivitySection } from '../_components/ArtifactsPanel';\nexport default defineFill({ component: ArtifactsActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport activityGroupArtifacts from '../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.web';\nimport channelArtifacts from '../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.web';\nimport fillArtifacts from '../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\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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"}
1
+ {"version":3,"file":"web.mjs","names":["activityGroupArtifacts","channelArtifacts","fileLinksArtifacts","fillArtifacts"],"sources":["../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/types/artifacts.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactView.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsStore.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/artifactsApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPreviewView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactPreviewPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactsView.tsx","../../src/extensions/workspaces/sessions/(frontend)/_components/ArtifactsPanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.web.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.web.ts","../../src/extensions/workspaces/sessions/(frontend)/file-links/artifacts.web.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.web.tsx","../../generated/web.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, sessionApiAddress } from '@agimon-ai/po-core/web';\nimport { sealedTransport } from '@agimon-ai/po-web-security/browser';\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: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\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 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 { defineSessionStore } from '@agimon-ai/po-core/web';\n\nimport { artifactsChannelType, type ArtifactSnapshot } from '../../../../../types/artifacts';\nimport { parseArtifactSnapshot } from './artifactView';\n\nexport const artifacts = defineSessionStore<ArtifactSnapshot & { loaded: boolean }>({ items: [], loaded: false });\n\nexport const artifactsChannel = artifacts.channel<ArtifactSnapshot>({\n channel: artifactsChannelType,\n parse: parseArtifactSnapshot,\n reduce: (_current, snapshot) => ({ ...snapshot, loaded: true }),\n});\n\n/** Artifact documents are outcomes, not background work. The source also keeps the empty launcher visible. */\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 { api } from '../../../../../../generated/client';\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifacts } from './artifactsStore';\nimport { artifactAssetPath, parseArtifactSnapshot } from './artifactView';\n\nexport async function refreshArtifacts(sessionId: string, signal: AbortSignal): Promise<void> {\n const before = artifacts.select(artifacts.store.state, sessionId);\n try {\n const result = await api.session(sessionId).list({ signal });\n if (signal.aborted || artifacts.select(artifacts.store.state, sessionId) !== before) return;\n const snapshot = result.ok ? parseArtifactSnapshot(result.data) : null;\n artifacts.update(sessionId, () =>\n snapshot\n ? { ...snapshot, loaded: true }\n : {\n ...before,\n loaded: true,\n error: result.ok\n ? 'The session answered with no artifact list.'\n : result.error || 'Artifacts could not be loaded.',\n },\n );\n } catch (error) {\n if (!signal.aborted && artifacts.select(artifacts.store.state, sessionId) === before)\n artifacts.update(sessionId, () => ({\n ...before,\n loaded: true,\n error: error instanceof Error ? error.message : String(error),\n }));\n }\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 answered with no artifact.');\n return preview;\n}\n\n/** Generated raw calls keep media and Markdown asset reads on the sealed artifact transport. */\nexport async function artifactBlob(sessionId: string, path: string, signal?: AbortSignal): Promise<Blob> {\n const result = await api.session(sessionId).content({ query: { path }, ...(signal ? { signal } : {}) });\n if (!result.ok) throw new Error(result.error || 'This artifact could not be loaded.');\n return result.response.blob();\n}\n\nexport async function loadArtifactImage(sessionId: string, documentPath: string, imagePath: string) {\n const blob = await artifactBlob(sessionId, artifactAssetPath(documentPath, imagePath));\n if (!blob.type.startsWith('image/')) throw new Error('This artifact asset is not an image.');\n const url = URL.createObjectURL(blob);\n return { url, dispose: () => URL.revokeObjectURL(url) };\n}\n","import { Breadcrumb, CodeEditor, Markdown } from '@agimon-ai/po-web-components';\nimport type { ReactNode } from 'react';\n\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifactPreviewMode } from '../_lib/artifactView';\n\ninterface ArtifactPreviewViewProps {\n path: string;\n preview?: ArtifactPreview;\n error?: string;\n media?: ReactNode;\n loadImage?: (path: string) => Promise<{ url: string; dispose: () => void }>;\n}\n\nexport function ArtifactPreviewView({ path, preview, error, media, loadImage }: ArtifactPreviewViewProps) {\n const mode = artifactPreviewMode(path);\n return (\n <div\n data-testid=\"artifact-preview\"\n data-artifact-path={path}\n className=\"flex min-h-0 flex-1 flex-col bg-po-bg text-po-text\"\n >\n <header className=\"flex shrink-0 items-center gap-2 border-b border-po-border px-4 py-3\">\n <Breadcrumb path={path} className=\"min-w-0 flex-1\" />\n <span className=\"text-sm text-po-dim\">Artifact</span>\n </header>\n <div className=\"min-h-0 flex-1 overflow-auto p-4\">\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : !preview ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Reading this artifact...\n </p>\n ) : mode === 'media' ? (\n media\n ) : preview.unavailable ? (\n <p className=\"text-sm text-po-dim\">{preview.reason ?? 'This artifact cannot be previewed.'}</p>\n ) : mode === 'markdown' ? (\n <Markdown text={preview.content} loadImage={loadImage} />\n ) : mode === 'html' ? (\n <iframe\n title={path}\n sandbox=\"\"\n srcDoc={preview.content}\n className=\"h-96 w-full rounded-md border border-po-border bg-po-deep\"\n />\n ) : mode === 'code' ? (\n <CodeEditor\n value={preview.content}\n path={path}\n readOnly\n className=\"min-h-64 rounded-md border border-po-border\"\n />\n ) : (\n <pre className=\"whitespace-pre-wrap break-words font-mono text-sm text-po-text\">{preview.content}</pre>\n )}\n </div>\n </div>\n );\n}\n","import type { TransientTab, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { MediaPreview } from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useCallback, useEffect, useState } from 'react';\n\nimport type { ArtifactPreview } from '../../../../../types/artifacts';\nimport { artifactBlob, fetchArtifactPreview, loadArtifactImage } from '../_lib/artifactsApi';\nimport { artifacts } from '../_lib/artifactsStore';\nimport { artifactTabId } from '../_lib/artifactView';\nimport { ArtifactPreviewView } from './ArtifactPreviewView';\n\nfunction ArtifactMedia({ sessionId, path, revision }: { sessionId: string; path: string; revision: string }) {\n const [loaded, setLoaded] = useState<{ source: string; url?: string; mimeType?: string; error?: string }>();\n const source = `${sessionId}:${path}:${revision}`;\n useEffect(() => {\n const controller = new AbortController();\n let url: string | undefined;\n void artifactBlob(sessionId, path, controller.signal)\n .then((blob) => {\n if (controller.signal.aborted) return;\n url = URL.createObjectURL(blob);\n setLoaded({ source, url, mimeType: blob.type });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ source, error: error instanceof Error ? error.message : String(error) });\n });\n return () => {\n controller.abort();\n if (url !== undefined) URL.revokeObjectURL(url);\n };\n }, [sessionId, path, source]);\n const current = loaded?.source === source ? loaded : undefined;\n return current?.url ? (\n <MediaPreview src={current.url} path={path} contentType={current.mimeType} />\n ) : (\n <p\n role={current?.error ? 'alert' : 'status'}\n className={current?.error ? 'text-sm text-po-red' : 'text-sm text-po-dim'}\n >\n {current?.error ?? 'Loading artifact media...'}\n </p>\n );\n}\n\nexport function ArtifactPreviewPanel({ path, sessionId }: WebPluginSlotProps & { path: string }) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n const item = snapshot.items.find((candidate) => candidate.path === path);\n const revision = item ? `${item.modifiedAt}:${item.size}` : snapshot.loaded ? 'missing' : 'initial';\n const [loaded, setLoaded] = useState<{\n sessionId: string;\n path: string;\n revision: string;\n preview?: ArtifactPreview;\n error?: string;\n }>();\n useEffect(() => {\n if (sessionId === null || revision === 'missing') return;\n const controller = new AbortController();\n void fetchArtifactPreview(sessionId, path, controller.signal)\n .then((preview) => {\n if (!controller.signal.aborted) setLoaded({ sessionId, path, revision, preview });\n })\n .catch((error: unknown) => {\n if (!controller.signal.aborted)\n setLoaded({ sessionId, path, revision, error: error instanceof Error ? error.message : String(error) });\n });\n return () => controller.abort();\n }, [sessionId, path, revision]);\n const current =\n loaded?.sessionId === sessionId && loaded.path === path && loaded.revision === revision ? loaded : undefined;\n const loadImage = useCallback(\n (imagePath: string) => {\n if (sessionId === null) return Promise.reject(new Error('The session is unavailable.'));\n return loadArtifactImage(sessionId, path, imagePath);\n },\n [sessionId, path],\n );\n return (\n <ArtifactPreviewView\n path={path}\n preview={current?.preview}\n error={\n sessionId === null\n ? 'The session is unavailable.'\n : revision === 'missing'\n ? 'This artifact no longer exists.'\n : current?.error\n }\n loadImage={loadImage}\n media={sessionId === null ? undefined : <ArtifactMedia sessionId={sessionId} path={path} revision={revision} />}\n />\n );\n}\n\nexport function artifactTab(sessionId: string, path: string): TransientTab {\n return {\n id: artifactTabId(sessionId, path),\n label: path.split('/').at(-1) ?? path,\n panel: (props) => <ArtifactPreviewPanel {...props} sessionId={sessionId} path={path} />,\n };\n}\n","import { Button, EmptyState, FileIcon } from '@agimon-ai/po-web-components';\n\nimport type { ArtifactItem } from '../../../../../types/artifacts';\nimport { sortedArtifacts } from '../_lib/artifactView';\n\ninterface ArtifactsViewProps {\n items: readonly ArtifactItem[];\n loading?: boolean;\n error?: string;\n onOpen: (item: ArtifactItem) => void;\n}\n\nfunction sizeLabel(size: number): string {\n return size < 1024\n ? `${size} B`\n : size < 1024 * 1024\n ? `${Math.ceil(size / 1024)} KB`\n : `${(size / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function RecentArtifactsView({ items, loading, error, onOpen }: ArtifactsViewProps) {\n return (\n <div data-testid=\"artifacts-recent-items\" className=\"flex flex-col gap-1\">\n {error ? (\n <p role=\"alert\" className=\"text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n {loading ? (\n <p role=\"status\" className=\"text-sm text-po-dim\">\n Loading artifacts...\n </p>\n ) : null}\n {!loading && !error && items.length === 0 ? <p className=\"text-sm text-po-dim\">No artifacts yet</p> : null}\n {sortedArtifacts(items)\n .slice(0, 3)\n .map((item) => (\n <Button\n key={item.path}\n variant=\"ghost\"\n size=\"card\"\n data-artifact-path={item.path}\n onClick={() => onOpen(item)}\n className=\"gap-0.5 px-2 py-1.5\"\n >\n <span className=\"flex min-w-0 items-center gap-2 text-base text-po-text\">\n <FileIcon aria-hidden className=\"size-3.5 text-po-dim\" />\n <span className=\"truncate\">{item.name}</span>\n </span>\n <span className=\"truncate font-mono text-sm text-po-dim\" title={item.path}>\n {item.path}\n </span>\n </Button>\n ))}\n </div>\n );\n}\n\nexport function ArtifactGridView({ items, loading, error, onOpen }: ArtifactsViewProps) {\n return (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-auto bg-po-bg text-po-text\">\n <header className=\"flex shrink-0 items-center gap-3 border-b border-po-border px-4 py-3\">\n <h1 className=\"text-lg font-semibold text-po-hi\">Artifacts</h1>\n <span data-testid=\"artifacts-count\" className=\"text-sm text-po-dim\">\n {items.length} {items.length === 1 ? 'artifact' : 'artifacts'}\n </span>\n </header>\n {error ? (\n <p role=\"alert\" className=\"px-4 py-3 text-sm text-po-red\">\n {error}\n </p>\n ) : null}\n {loading ? (\n <p role=\"status\" className=\"px-4 py-3 text-sm text-po-dim\">\n Loading artifacts...\n </p>\n ) : null}\n {!loading && !error && items.length === 0 ? (\n <EmptyState\n title=\"No artifacts yet\"\n description=\"Documents Po prepares for this session will appear here.\"\n className=\"px-4 py-8\"\n />\n ) : null}\n <div data-testid=\"artifacts-grid\" className=\"grid grid-cols-1 gap-3 p-4 sm:grid-cols-2 xl:grid-cols-3\">\n {sortedArtifacts(items).map((item) => (\n <Button\n key={item.path}\n variant=\"outline\"\n size=\"card\"\n data-artifact-path={item.path}\n onClick={() => onOpen(item)}\n className=\"min-w-0 gap-2 p-4\"\n >\n <FileIcon aria-hidden className=\"size-5 text-po-green\" />\n <span className=\"truncate text-base font-semibold text-po-hi\" title={item.name}>\n {item.name}\n </span>\n <span className=\"truncate font-mono text-sm text-po-dim\" title={item.path}>\n {item.path}\n </span>\n <span className=\"text-sm text-po-dim\">{sizeLabel(item.size)}</span>\n </Button>\n ))}\n </div>\n </div>\n );\n}\n","import type { TransientTab, WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect } from 'react';\n\nimport { refreshArtifacts } from '../_lib/artifactsApi';\nimport { artifacts } from '../_lib/artifactsStore';\nimport { artifactTab } from './ArtifactPreviewPanel';\nimport { ArtifactGridView, RecentArtifactsView } from './ArtifactsView';\n\nexport function artifactsTab(): TransientTab {\n // The host stores transient tabs per session, including this heading factory's fixed id.\n return { id: 'artifacts-grid', label: 'Artifacts', panel: ArtifactsPanel };\n}\n\nexport function ArtifactsActivitySection({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n useEffect(() => {\n if (sessionId === null || snapshot.loaded) return;\n const controller = new AbortController();\n void refreshArtifacts(sessionId, controller.signal);\n return () => controller.abort();\n }, [sessionId, snapshot.loaded]);\n return (\n <RecentArtifactsView\n items={snapshot.items}\n loading={!snapshot.loaded}\n error={snapshot.error}\n onOpen={(item) => {\n if (sessionId !== null) openTransientTab(artifactTab(sessionId, item.path));\n }}\n />\n );\n}\n\nexport function ArtifactsPanel({ sessionId, openTransientTab }: WebPluginSlotProps) {\n const snapshot = useStore(artifacts.store, (state) => artifacts.select(state, sessionId));\n useEffect(() => {\n if (sessionId === null) return;\n const controller = new AbortController();\n void refreshArtifacts(sessionId, controller.signal);\n return () => controller.abort();\n }, [sessionId]);\n return (\n <ArtifactGridView\n items={snapshot.items}\n loading={!snapshot.loaded && sessionId !== null}\n error={sessionId === null ? 'The session is unavailable.' : snapshot.error}\n onOpen={(item) => {\n if (sessionId !== null) openTransientTab(artifactTab(sessionId, item.path));\n }}\n />\n );\n}\n","import { defineActivityGroup } from '@agimon-ai/po-core/web';\nimport { FileIcon } from '@agimon-ai/po-web-components';\n\nimport { artifactsTab } from '../_components/ArtifactsPanel';\nimport { artifactActivitySource } from '../_lib/artifactsStore';\nexport default defineActivityGroup({\n icon: FileIcon,\n keys: '',\n statusKey: 'po-artifacts',\n activeSource: artifactActivitySource,\n transientTab: artifactsTab,\n marksBackgroundWork: false,\n order: 15,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/web';\n\nimport { artifactsChannel } from '../_lib/artifactsStore';\nexport default defineChannelFile(artifactsChannel);\n","import { defineFileLinks } from '@agimon-ai/po-core/web';\n\nimport { artifactTab } from '../_components/ArtifactPreviewPanel';\n\n/** Artifact references belong to the session store, never the repository file API. */\nexport default defineFileLinks({\n subscribe: () => () => {},\n fingerprint: () => '',\n resolve(sessionId, path) {\n const reference = path.trim();\n if (sessionId === null || !reference.startsWith('artifact:')) return undefined;\n const relative = reference.slice('artifact:'.length);\n return relative === '' ? undefined : artifactTab(sessionId, relative);\n },\n});\n","import { defineFill } from '@agimon-ai/po-core/web';\n\nimport { ArtifactsActivitySection } from '../_components/ArtifactsPanel';\nexport default defineFill({ component: ArtifactsActivitySection });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport activityGroupArtifacts from '../src/extensions/workspaces/sessions/(frontend)/activity-group/artifacts.web';\nimport channelArtifacts from '../src/extensions/workspaces/sessions/(frontend)/channel/artifacts.web';\nimport fileLinksArtifacts from '../src/extensions/workspaces/sessions/(frontend)/file-links/artifacts.web';\nimport fillArtifacts from '../src/extensions/workspaces/sessions/(frontend)/fill/Artifacts.activity.artifacts.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\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 fileLinks(): WebPluginContributions['fileLinks'] { return fileLinksArtifacts; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.artifacts', id: 'artifacts' }, fillArtifacts)]; },\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-artifact",
3
- "version": "0.0.0-alpha.4",
3
+ "version": "0.0.0-alpha.6",
4
4
  "description": "Durable session artifacts, prompt guidance, and web/native artifact views.",
5
5
  "keywords": [
6
6
  "ai",
@@ -65,17 +65,17 @@
65
65
  "registry": "https://registry.npmjs.org/"
66
66
  },
67
67
  "dependencies": {
68
- "@agimon-ai/po-core": "0.0.0-alpha.5",
69
- "@agimon-ai/po-web-components": "0.0.0-alpha.5",
70
- "@agimon-ai/po-web-security": "0.0.0-alpha.5",
68
+ "@agimon-ai/po-core": "0.0.0-alpha.7",
69
+ "@agimon-ai/po-web-components": "0.0.0-alpha.7",
70
+ "@agimon-ai/po-web-security": "0.0.0-alpha.7",
71
71
  "@deepseek-ai/cordis": "4.0.4",
72
72
  "hono": "4.13.13",
73
73
  "typebox": "1.3.37"
74
74
  },
75
75
  "devDependencies": {
76
- "@agimon-ai/po-build": "0.0.0-alpha.5",
77
- "@agimon-ai/po-native-components": "0.0.0-alpha.5",
78
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.5",
76
+ "@agimon-ai/po-build": "0.0.0-alpha.7",
77
+ "@agimon-ai/po-native-components": "0.0.0-alpha.7",
78
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.7",
79
79
  "@earendil-works/pi-coding-agent": "1.2.0",
80
80
  "@tanstack/react-store": "0.11.2",
81
81
  "@tanstack/store": "0.11.2",
@@ -92,7 +92,7 @@
92
92
  "vitest": "5.0.4"
93
93
  },
94
94
  "peerDependencies": {
95
- "@agimon-ai/po-native-components": "0.0.0-alpha.5",
95
+ "@agimon-ai/po-native-components": "0.0.0-alpha.7",
96
96
  "@earendil-works/pi-coding-agent": "1.2.0",
97
97
  "react-native": "0.86.3",
98
98
  "react-native-unistyles": "^3.5.3"