@agimon-ai/po-space 0.0.1-alpha.1 → 0.0.1-alpha.3
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.
|
@@ -52,16 +52,22 @@ const api = createApiClient(routes, {
|
|
|
52
52
|
sessionAddress: sessionApiAddress
|
|
53
53
|
});
|
|
54
54
|
//#endregion
|
|
55
|
-
//#region src/extensions/(frontend)/_lib/
|
|
56
|
-
const MAX_MEDIA_BYTES = 5242880;
|
|
55
|
+
//#region src/extensions/(frontend)/_lib/spaceDenied.ts
|
|
57
56
|
/** The computer said this person may not see its space. Asking again changes nothing, so a poller stops. */
|
|
58
57
|
var SpaceDenied = class extends Error {};
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
/**
|
|
59
|
+
* The error for a failed space read: a refusal is marked, anything else stays retryable. 403 is a teammate the
|
|
60
|
+
* computer knows; 401 is a device its team cannot name, which only signing in or pairing again changes.
|
|
61
|
+
*/
|
|
62
|
+
function spaceFailure(result, fallback) {
|
|
63
|
+
return result.status === 403 || result.status === 401 ? new SpaceDenied(result.error || fallback) : new Error(result.error || fallback);
|
|
61
64
|
}
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/extensions/(frontend)/_lib/spaceApi.native.ts
|
|
67
|
+
const MAX_MEDIA_BYTES = 5242880;
|
|
62
68
|
async function fetchSpaces(signal) {
|
|
63
69
|
const result = await api.host.spaces({ signal });
|
|
64
|
-
if (!result.ok) throw
|
|
70
|
+
if (!result.ok) throw spaceFailure(result, "Spaces could not be loaded.");
|
|
65
71
|
return result.data.spaces;
|
|
66
72
|
}
|
|
67
73
|
async function fetchSpaceFiles(space, signal) {
|
|
@@ -69,7 +75,7 @@ async function fetchSpaceFiles(space, signal) {
|
|
|
69
75
|
query: { space },
|
|
70
76
|
signal
|
|
71
77
|
});
|
|
72
|
-
if (!result.ok) throw
|
|
78
|
+
if (!result.ok) throw spaceFailure(result, "Files could not be loaded.");
|
|
73
79
|
return result.data;
|
|
74
80
|
}
|
|
75
81
|
/** One space on one paired computer, through the transport the native shell seals for it. */
|
|
@@ -85,7 +91,7 @@ async function fetchComputerFiles(hostId, space, signal) {
|
|
|
85
91
|
query: { space },
|
|
86
92
|
signal
|
|
87
93
|
});
|
|
88
|
-
if (!result.ok) throw
|
|
94
|
+
if (!result.ok) throw spaceFailure(result, "Files could not be loaded.");
|
|
89
95
|
return result.data;
|
|
90
96
|
}
|
|
91
97
|
async function fetchSpacePreview(space, path, signal) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.mjs","names":["WebPluginSlotProps","Badge","Button","FileIcon","FileList","FileViewer","fontOf","ListRow","Panel","FileItem","PoNativeTheme","useEffect","useState","StyleSheet","SPACE_REFRESH_MS","SpaceListing","fetchComputerFiles","fetchSpaceFiles","fetchSpaceMedia","fetchSpacePreview","fetchSpaces","prepareSpaceSave","SpaceDenied","computersOfOwner","PairedComputer","PERSONAL","id","label","useSpace","space","state","setState","spaces","listing","controller","AbortController","timer","ReturnType","setTimeout","refresh","denied","Promise","all","signal","aborted","error","current","items","Error","message","String","abort","clearTimeout","undefined","SpaceComputer","offline","SpaceHomeCardView","computers","onOpen","several","length","files","flatMap","computer","map","item","newest","sort","a","b","modifiedAt","slice","loading","every","failed","filter","away","path","name","useComputers","listings","setListings","Record","key","JSON","stringify","hostId","connected","reachable","parse","asked","results","allSettled","before","Object","fromEntries","result","index","status","value","reason","_","CombinedHomeCard","LocalHomeCard","SpaceHomeCard","props","host","connectedHosts","openPage","SpaceHostPageView","onSpaceChange","styles","content","title","entry","selected","find","SpaceHostPage","setSpace","setPath","screen","nativeSaveFile","renderFilePreview","renderMediaPreview","setTabHeader","SpaceFileTab","opened","setOpened","create","theme","flex","padding","spacing","gap","uni__dependencies","flexDirection","flexWrap","fontFamily","sans","fontSize","fontWeight","color","colors","hi","fileLinksSpace","fillSpace","fillSpace2"],"sources":["../../src/constants/space.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/(frontend)/_lib/spaceApi.native.ts","../../src/extensions/(frontend)/_lib/spaceView.ts","../../src/extensions/(frontend)/_components/SpaceHost.native.tsx","../../src/extensions/(frontend)/file-links/space.native.tsx","../../src/extensions/(frontend)/fill/Space.home-apps.native.tsx","../../src/extensions/(frontend)/fill/Space.page.native.tsx","../../generated/native.ts"],"sourcesContent":["/** One read of a space file; matches the guarded artifact reader that serves it. */\nexport const MAX_CONTENT_BYTES = 25 * 1024 * 1024;\n/** Videos up to this size are served, but only through range requests of at most MAX_CONTENT_BYTES. */\nexport const MAX_RANGED_VIDEO_BYTES = 128 * 1024 * 1024;\n/** How often a visible Space page refreshes its list. */\nexport const SPACE_REFRESH_MS = 3000;\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { SpaceListing, SpacePreview, SpaceSummary } from './space';\n\n/** Where a host mounts this package's API; the segment after /api/plugin/. */\nexport const API_BASE_PATH = 'space';\n\nexport const routes = {\n spaces: {\n method: 'GET',\n path: '/spaces',\n response: undefined as unknown as ApiResponseOf<{ spaces: SpaceSummary[] }>,\n },\n list: {\n method: 'GET',\n path: '/',\n query: ['space'],\n response: undefined as unknown as ApiResponseOf<SpaceListing>,\n },\n preview: {\n method: 'GET',\n path: '/preview',\n query: ['space', 'path'],\n response: undefined as unknown as ApiResponseOf<SpacePreview>,\n },\n content: {\n method: 'GET',\n path: '/content',\n query: ['space', 'path'],\n raw: true,\n },\n} as const satisfies ApiRoutes;\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 'space' at. */\nexport const apiScopes = ['host', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'space',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import * as nativeHost from '@agimon-ai/po-core/native';\nimport { createApiClient, encodeBase64, sessionApiAddress, type ApiTransport } from '@agimon-ai/po-core/native';\nimport { boundedFileSource, readMediaBytes, type BoundedFileSource } from '@agimon-ai/po-native-components';\n\nimport { api, apiScopes } from '../../../../generated/client.native';\nimport { routes } from '../../../types/apiRoutes';\nimport type { SpaceListing, SpacePreview, SpaceSummary } from '../../../types/space';\n\nconst MAX_MEDIA_BYTES = 5 * 1024 * 1024;\n\n/** The computer said this person may not see its space. Asking again changes nothing, so a poller stops. */\nexport class SpaceDenied extends Error {}\n\nfunction failure(result: { status: number; error: string }, fallback: string): Error {\n return result.status === 403 ? new SpaceDenied(result.error || fallback) : new Error(result.error || fallback);\n}\n\nexport async function fetchSpaces(signal: AbortSignal): Promise<SpaceSummary[]> {\n const result = await api.host.spaces({ signal });\n if (!result.ok) throw failure(result, 'Spaces could not be loaded.');\n return result.data.spaces;\n}\n\nexport async function fetchSpaceFiles(space: string, signal: AbortSignal): Promise<SpaceListing> {\n const result = await api.host.list({ query: { space }, signal });\n if (!result.ok) throw failure(result, 'Files could not be loaded.');\n return result.data;\n}\n\n/** One space on one paired computer, through the transport the native shell seals for it. */\nexport async function fetchComputerFiles(hostId: string, space: string, signal: AbortSignal): Promise<SpaceListing> {\n const transportForHost = (nativeHost as typeof nativeHost & { transportForHost?: (hostId: string) => ApiTransport })\n .transportForHost;\n if (!transportForHost) throw new Error('This app cannot reach other computers yet.');\n const client = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'space',\n transport: transportForHost(hostId),\n sessionAddress: sessionApiAddress,\n });\n const result = await client.host.list({ query: { space }, signal });\n if (!result.ok) throw failure(result, 'Files could not be loaded.');\n return result.data;\n}\n\nexport async function fetchSpacePreview(space: string, path: string, signal: AbortSignal): Promise<SpacePreview> {\n const result = await api.host.preview({ query: { space, path }, signal });\n if (!result.ok) throw new Error(result.error || 'This file could not be read.');\n return result.data;\n}\n\n/** The native host owns saving, with bounded version-checked reads of one space file. */\nexport function prepareSpaceSave(space: string, path: string, signal: AbortSignal): Promise<BoundedFileSource> {\n return boundedFileSource(\n path,\n async (headers, signal) => {\n if (signal.aborted) throw new Error('Download cancelled.');\n const result = await api.host.content({ query: { space, path }, headers, signal });\n if (!result.ok && result.status !== 416) throw new Error(result.error || 'This file could not be read.');\n if (!result.response) throw new Error('This file could not be read.');\n return result.response;\n },\n signal,\n );\n}\n\nexport async function fetchSpaceMedia(\n space: string,\n path: string,\n signal: AbortSignal,\n): Promise<{ data: string; mimeType: string }> {\n const media = await readMediaBytes(await prepareSpaceSave(space, path, signal), MAX_MEDIA_BYTES, signal);\n return { data: encodeBase64(media.bytes), mimeType: media.mimeType };\n}\n","const SPACE_ID = /^[a-z][a-z0-9-]{0,39}$/u;\nconst LEGACY_SHELF = 'artifact:host/';\nconst SPACE_PREFIX = 'space:';\n\n/**\n * `space:<id>/<path>` names a file in a space. The older `artifact:host/<path>` meant the host shelf,\n * which is Personal now, so it keeps opening the same file.\n */\nexport function parseSpaceReference(reference: string): { space: string; path: string } | undefined {\n const trimmed = reference.trim().replace(/^@/u, '');\n let space: string;\n let path: string;\n if (trimmed.startsWith(LEGACY_SHELF)) {\n space = 'personal';\n path = trimmed.slice(LEGACY_SHELF.length);\n } else if (trimmed.startsWith(SPACE_PREFIX)) {\n const body = trimmed.slice(SPACE_PREFIX.length);\n const slash = body.indexOf('/');\n if (slash < 0) return undefined;\n space = body.slice(0, slash);\n path = body.slice(slash + 1);\n } else return undefined;\n // oxlint-disable-next-line no-control-regex -- control characters never name a file a person can see.\n if (!SPACE_ID.test(space) || path.includes('\\\\') || /[\\u0000-\\u001f\\u007f]/u.test(path)) return undefined;\n if (path.split('/').some((part) => part === '' || part === '.' || part === '..')) return undefined;\n return { space, path };\n}\n\nexport function spaceTabId(space: string, path: string): string {\n return `space:${encodeURIComponent(space)}:${encodeURIComponent(path)}`;\n}\n\nexport interface PairedComputer {\n hostId: string;\n label: string;\n person?: { issuer: string; subject: string };\n connected?: boolean;\n}\n\n/**\n * The computers one combined Home card covers: those of the card's person, grouped exactly as\n * Home groups a `combinesComputers` card. Unlinked computers join the phone's one account, or\n * each other when the phone holds several. Another person's computer is never read.\n */\nexport function computersOfOwner(computers: readonly PairedComputer[], hostId: string | undefined): PairedComputer[] {\n const people = new Set(computers.flatMap((computer) => (computer.person ? [JSON.stringify(computer.person)] : [])));\n const unlinked = people.size === 1 ? [...people][0]! : 'unlinked';\n const owner = (computer: PairedComputer) => (computer.person ? JSON.stringify(computer.person) : unlinked);\n const own = computers.find((computer) => computer.hostId === hostId);\n return own ? computers.filter((computer) => owner(computer) === owner(own)) : [];\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n FileIcon,\n FileList,\n FileViewer,\n fontOf,\n ListRow,\n Panel,\n type FileItem,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useEffect, useState } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { SPACE_REFRESH_MS } from '../../../constants/space';\nimport type { SpaceListing } from '../../../types/space';\nimport {\n fetchComputerFiles,\n fetchSpaceFiles,\n fetchSpaceMedia,\n fetchSpacePreview,\n fetchSpaces,\n prepareSpaceSave,\n SpaceDenied,\n} from '../_lib/spaceApi.native';\nimport { computersOfOwner, type PairedComputer } from '../_lib/spaceView';\n\nconst PERSONAL = { id: 'personal', label: 'Personal' };\n\n/** Poll independently of sessions, including when no session is running. */\nfunction useSpace(space: string) {\n const [state, setState] = useState<{\n space: string;\n spaces: { id: string; label: string }[];\n listing?: SpaceListing;\n }>({\n space,\n spaces: [PERSONAL],\n });\n useEffect(() => {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout>;\n const refresh = async () => {\n let denied = false;\n try {\n const [spaces, listing] = await Promise.all([\n fetchSpaces(controller.signal),\n fetchSpaceFiles(space, controller.signal),\n ]);\n if (!controller.signal.aborted) setState({ space, spaces, listing });\n } catch (error) {\n denied = error instanceof SpaceDenied;\n if (!controller.signal.aborted)\n setState((current) => ({\n space,\n spaces: current.spaces,\n listing: {\n items: current.space === space ? (current.listing?.items ?? []) : [],\n error: error instanceof Error ? error.message : String(error),\n },\n }));\n } finally {\n if (!controller.signal.aborted && !denied) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);\n }\n };\n void refresh();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [space]);\n return { spaces: state.spaces, listing: state.space === space ? state.listing : undefined };\n}\n\n/** One paired computer's spaces as the Home card sees them. */\nexport interface SpaceComputer {\n label: string;\n listing?: SpaceListing;\n offline?: boolean;\n}\n\n/** One card for every paired computer: the newest files across them, named with their computer when there are several. */\nexport function SpaceHomeCardView({ computers, onOpen }: { computers: readonly SpaceComputer[]; onOpen?: () => void }) {\n const several = computers.length > 1;\n const files = computers.flatMap((computer) =>\n (computer.listing?.items ?? []).map((item) => ({ ...item, computer: computer.label })),\n );\n const newest = files.sort((a, b) => b.modifiedAt - a.modifiedAt).slice(0, 3);\n const loading = computers.every((computer) => !computer.offline && !computer.listing);\n const failed = computers.filter((computer) => computer.listing?.error !== undefined);\n const away = computers.filter((computer) => computer.offline);\n return (\n <Panel>\n <ListRow\n title=\"Space\"\n leading={<FileIcon color=\"hi\" />}\n trailing={<Badge>{files.length} files</Badge>}\n onPress={onOpen}\n disclosure\n accessibilityLabel=\"Open Space\"\n />\n {loading ? (\n <ListRow title=\"Loading files...\" />\n ) : newest.length === 0 && failed.length === 0 && away.length === 0 ? (\n <ListRow title=\"No files yet\" description=\"Move a session file to Space to keep it here.\" />\n ) : (\n newest.map((item) => (\n <ListRow\n key={`${item.computer}:${item.path}`}\n title={item.name}\n description={several ? `${item.computer} · ${item.path}` : item.path}\n />\n ))\n )}\n {failed.map((computer) => (\n <ListRow\n key={`error:${computer.label}`}\n title={several ? `${computer.label}: ${computer.listing?.error}` : (computer.listing?.error ?? '')}\n />\n ))}\n {away.map((computer) => (\n <ListRow\n key={`offline:${computer.label}`}\n title={`${computer.label} is offline`}\n description=\"Its files show here again when it reconnects.\"\n />\n ))}\n </Panel>\n );\n}\n\n/** Every computer's Personal space, polled together; a computer that is not connected shows as offline. */\nfunction useComputers(computers: readonly PairedComputer[]): SpaceComputer[] {\n const [listings, setListings] = useState<Record<string, SpaceListing>>({});\n const key = JSON.stringify(computers.map((computer) => [computer.hostId, computer.connected !== false]));\n useEffect(() => {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout>;\n // A computer that refused is not asked again until its connection changes.\n let reachable = (JSON.parse(key) as [string, boolean][]).filter(([, connected]) => connected);\n const refresh = async () => {\n const asked = reachable;\n const results = await Promise.allSettled(\n asked.map(([hostId]) => fetchComputerFiles(hostId, PERSONAL.id, controller.signal)),\n );\n if (controller.signal.aborted) return;\n setListings((before) => ({\n ...before,\n ...Object.fromEntries(\n results.map((result, index): [string, SpaceListing] => {\n const hostId = asked[index]![0];\n if (result.status === 'fulfilled') return [hostId, result.value];\n const error = result.reason instanceof Error ? result.reason.message : String(result.reason);\n return [hostId, { items: before[hostId]?.items ?? [], error }];\n }),\n ),\n }));\n reachable = asked.filter((_, index) => {\n const result = results[index]!;\n return !(result.status === 'rejected' && result.reason instanceof SpaceDenied);\n });\n if (reachable.length > 0) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);\n };\n void refresh();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [key]);\n return computers.map((computer) =>\n computer.connected === false\n ? { label: computer.label, offline: true }\n : { label: computer.label, listing: listings[computer.hostId] },\n );\n}\n\nfunction CombinedHomeCard({ computers, onOpen }: { computers: readonly PairedComputer[]; onOpen: () => void }) {\n return <SpaceHomeCardView computers={useComputers(computers)} onOpen={onOpen} />;\n}\n\nfunction LocalHomeCard({ onOpen }: { onOpen: () => void }) {\n const { listing } = useSpace(PERSONAL.id);\n return <SpaceHomeCardView computers={[{ label: 'This computer', listing }]} onOpen={onOpen} />;\n}\n\n/** The native shell passes the paired computers; without them the card reads this computer only. */\nexport function SpaceHomeCard(\n props: WebPluginSlotProps & { host?: { hostId?: string; connectedHosts: readonly PairedComputer[] } },\n) {\n const computers = computersOfOwner(props.host?.connectedHosts ?? [], props.host?.hostId);\n const onOpen = () => props.openPage?.('space');\n return computers.length > 0 ? (\n <CombinedHomeCard computers={computers} onOpen={onOpen} />\n ) : (\n <LocalHomeCard onOpen={onOpen} />\n );\n}\n\nexport function SpaceHostPageView({\n spaces,\n space,\n onSpaceChange,\n listing,\n onOpen,\n}: {\n spaces: readonly { id: string; label: string }[];\n space: string;\n onSpaceChange: (space: string) => void;\n listing?: SpaceListing;\n onOpen: (path: string) => void;\n}) {\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Space\n </Text>\n {spaces.length > 1 ? (\n <View style={styles.spaces}>\n {spaces.map((entry) => (\n <Button\n key={entry.id}\n size=\"sm\"\n variant={entry.id === space ? 'primary' : 'outline'}\n accessibilityState={{ selected: entry.id === space }}\n onPress={() => onSpaceChange(entry.id)}\n >\n {entry.label}\n </Button>\n ))}\n </View>\n ) : null}\n <FileList\n label={spaces.find((entry) => entry.id === space)?.label ?? 'Space'}\n emptyText=\"Files you move here from a session are kept for every session.\"\n items={listing?.items ?? []}\n loading={!listing}\n error={listing?.error}\n onOpen={onOpen}\n grid\n />\n </ScrollView>\n );\n}\n\nexport function SpaceHostPage(props: WebPluginSlotProps) {\n const [space, setSpace] = useState(PERSONAL.id);\n const { spaces, listing } = useSpace(space);\n const [path, setPath] = useState<string>();\n const item: FileItem | undefined = listing?.items.find((entry) => entry.path === path);\n if (path !== undefined)\n return (\n <View style={styles.screen}>\n <Button variant=\"ghost\" onPress={() => setPath(undefined)}>\n Close preview\n </Button>\n <FileViewer\n key={`${space}:${path}`}\n path={path}\n item={item}\n scopeKey={`space:${space}`}\n loadPreview={(signal) => fetchSpacePreview(space, path, signal)}\n loadMedia={(signal) => fetchSpaceMedia(space, path, signal)}\n prepareSave={(signal) => prepareSpaceSave(space, path, signal)}\n nativeSaveFile={props.nativeSaveFile}\n renderFilePreview={props.renderFilePreview}\n renderMediaPreview={props.renderMediaPreview}\n setTabHeader={props.setTabHeader}\n onOpenPath={setPath}\n />\n </View>\n );\n return (\n <SpaceHostPageView spaces={spaces} space={space} onSpaceChange={setSpace} listing={listing} onOpen={setPath} />\n );\n}\n\n/** One space file opened from a transcript, as a transient tab. */\nexport function SpaceFileTab({ space, path, ...props }: WebPluginSlotProps & { space: string; path: string }) {\n const [opened, setOpened] = useState(path);\n return (\n <FileViewer\n key={`${space}:${opened}`}\n path={opened}\n scopeKey={`space:${space}`}\n loadPreview={(signal) => fetchSpacePreview(space, opened, signal)}\n loadMedia={(signal) => fetchSpaceMedia(space, opened, signal)}\n prepareSave={(signal) => prepareSpaceSave(space, opened, signal)}\n nativeSaveFile={props.nativeSaveFile}\n renderFilePreview={props.renderFilePreview}\n renderMediaPreview={props.renderMediaPreview}\n setTabHeader={props.setTabHeader}\n onOpenPath={setOpened}\n />\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n screen: { flex: 1 },\n content: { padding: theme.spacing(4), gap: theme.spacing(3) },\n spaces: { flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(2) },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n}));\n","import { defineFileLinks } from '@agimon-ai/po-core/native';\n\nimport { SpaceFileTab } from '../_components/SpaceHost.native';\nimport { parseSpaceReference, spaceTabId } from '../_lib/spaceView';\n\n/** Space references open the space's file, from any session or none. */\nexport default defineFileLinks({\n subscribe: () => () => undefined,\n fingerprint: () => '',\n resolve(_sessionId, reference) {\n const file = parseSpaceReference(reference);\n if (!file) return undefined;\n return {\n id: spaceTabId(file.space, file.path),\n label: file.path.split('/').at(-1) ?? file.path,\n panel: (props) => <SpaceFileTab {...props} space={file.space} path={file.path} />,\n };\n },\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { SpaceHomeCard } from '../_components/SpaceHost.native';\n\n// The card reads every computer of one person, so the phone shows one card, not one per computer.\nexport default defineFill({\n slot: 'home-apps',\n id: 'space',\n data: { combinesComputers: true },\n component: SpaceHomeCard,\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { SpaceHostPage } from '../_components/SpaceHost.native';\n\nexport default defineFill({ slot: 'page', id: 'space', component: SpaceHostPage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fileLinksSpace from '../src/extensions/(frontend)/file-links/space.native';\nimport fillSpace from '../src/extensions/(frontend)/fill/Space.home-apps.native';\nimport fillSpace2 from '../src/extensions/(frontend)/fill/Space.page.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: 'space',\n packageName: '@agimon-ai/po-space',\n host: {\n get fileLinks(): WebPluginContributions['fileLinks'] { return fileLinksSpace; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home-apps', id: 'space' }, fillSpace), via({ slot: 'page', id: 'space' }, fillSpace2)]; },\n },\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["WebPluginSlotProps","Badge","Button","FileIcon","FileList","FileViewer","fontOf","ListRow","Panel","FileItem","PoNativeTheme","useEffect","useState","StyleSheet","SPACE_REFRESH_MS","SpaceListing","fetchComputerFiles","fetchSpaceFiles","fetchSpaceMedia","fetchSpacePreview","fetchSpaces","prepareSpaceSave","SpaceDenied","computersOfOwner","PairedComputer","PERSONAL","id","label","useSpace","space","state","setState","spaces","listing","controller","AbortController","timer","ReturnType","setTimeout","refresh","denied","Promise","all","signal","aborted","error","current","items","Error","message","String","abort","clearTimeout","undefined","SpaceComputer","offline","SpaceHomeCardView","computers","onOpen","several","length","files","flatMap","computer","map","item","newest","sort","a","b","modifiedAt","slice","loading","every","failed","filter","away","path","name","useComputers","listings","setListings","Record","key","JSON","stringify","hostId","connected","reachable","parse","asked","results","allSettled","before","Object","fromEntries","result","index","status","value","reason","_","CombinedHomeCard","LocalHomeCard","SpaceHomeCard","props","host","connectedHosts","openPage","SpaceHostPageView","onSpaceChange","styles","content","title","entry","selected","find","SpaceHostPage","setSpace","setPath","screen","nativeSaveFile","renderFilePreview","renderMediaPreview","setTabHeader","SpaceFileTab","opened","setOpened","create","theme","flex","padding","spacing","gap","uni__dependencies","flexDirection","flexWrap","fontFamily","sans","fontSize","fontWeight","color","colors","hi","fileLinksSpace","fillSpace","fillSpace2"],"sources":["../../src/constants/space.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/(frontend)/_lib/spaceDenied.ts","../../src/extensions/(frontend)/_lib/spaceApi.native.ts","../../src/extensions/(frontend)/_lib/spaceView.ts","../../src/extensions/(frontend)/_components/SpaceHost.native.tsx","../../src/extensions/(frontend)/file-links/space.native.tsx","../../src/extensions/(frontend)/fill/Space.home-apps.native.tsx","../../src/extensions/(frontend)/fill/Space.page.native.tsx","../../generated/native.ts"],"sourcesContent":["/** One read of a space file; matches the guarded artifact reader that serves it. */\nexport const MAX_CONTENT_BYTES = 25 * 1024 * 1024;\n/** Videos up to this size are served, but only through range requests of at most MAX_CONTENT_BYTES. */\nexport const MAX_RANGED_VIDEO_BYTES = 128 * 1024 * 1024;\n/** How often a visible Space page refreshes its list. */\nexport const SPACE_REFRESH_MS = 3000;\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport type { SpaceListing, SpacePreview, SpaceSummary } from './space';\n\n/** Where a host mounts this package's API; the segment after /api/plugin/. */\nexport const API_BASE_PATH = 'space';\n\nexport const routes = {\n spaces: {\n method: 'GET',\n path: '/spaces',\n response: undefined as unknown as ApiResponseOf<{ spaces: SpaceSummary[] }>,\n },\n list: {\n method: 'GET',\n path: '/',\n query: ['space'],\n response: undefined as unknown as ApiResponseOf<SpaceListing>,\n },\n preview: {\n method: 'GET',\n path: '/preview',\n query: ['space', 'path'],\n response: undefined as unknown as ApiResponseOf<SpacePreview>,\n },\n content: {\n method: 'GET',\n path: '/content',\n query: ['space', 'path'],\n raw: true,\n },\n} as const satisfies ApiRoutes;\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 'space' at. */\nexport const apiScopes = ['host', 'workspace', 'session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'space',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","/** The computer said this person may not see its space. Asking again changes nothing, so a poller stops. */\nexport class SpaceDenied extends Error {}\n\n/**\n * The error for a failed space read: a refusal is marked, anything else stays retryable. 403 is a teammate the\n * computer knows; 401 is a device its team cannot name, which only signing in or pairing again changes.\n */\nexport function spaceFailure(result: { status: number; error: string }, fallback: string): Error {\n return result.status === 403 || result.status === 401\n ? new SpaceDenied(result.error || fallback)\n : new Error(result.error || fallback);\n}\n","import * as nativeHost from '@agimon-ai/po-core/native';\nimport { createApiClient, encodeBase64, sessionApiAddress, type ApiTransport } from '@agimon-ai/po-core/native';\nimport { boundedFileSource, readMediaBytes, type BoundedFileSource } from '@agimon-ai/po-native-components';\n\nimport { api, apiScopes } from '../../../../generated/client.native';\nimport { routes } from '../../../types/apiRoutes';\nimport type { SpaceListing, SpacePreview, SpaceSummary } from '../../../types/space';\nimport { spaceFailure } from './spaceDenied';\n\nconst MAX_MEDIA_BYTES = 5 * 1024 * 1024;\n\nexport async function fetchSpaces(signal: AbortSignal): Promise<SpaceSummary[]> {\n const result = await api.host.spaces({ signal });\n if (!result.ok) throw spaceFailure(result, 'Spaces could not be loaded.');\n return result.data.spaces;\n}\n\nexport async function fetchSpaceFiles(space: string, signal: AbortSignal): Promise<SpaceListing> {\n const result = await api.host.list({ query: { space }, signal });\n if (!result.ok) throw spaceFailure(result, 'Files could not be loaded.');\n return result.data;\n}\n\n/** One space on one paired computer, through the transport the native shell seals for it. */\nexport async function fetchComputerFiles(hostId: string, space: string, signal: AbortSignal): Promise<SpaceListing> {\n const transportForHost = (nativeHost as typeof nativeHost & { transportForHost?: (hostId: string) => ApiTransport })\n .transportForHost;\n if (!transportForHost) throw new Error('This app cannot reach other computers yet.');\n const client = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'space',\n transport: transportForHost(hostId),\n sessionAddress: sessionApiAddress,\n });\n const result = await client.host.list({ query: { space }, signal });\n if (!result.ok) throw spaceFailure(result, 'Files could not be loaded.');\n return result.data;\n}\n\nexport async function fetchSpacePreview(space: string, path: string, signal: AbortSignal): Promise<SpacePreview> {\n const result = await api.host.preview({ query: { space, path }, signal });\n if (!result.ok) throw new Error(result.error || 'This file could not be read.');\n return result.data;\n}\n\n/** The native host owns saving, with bounded version-checked reads of one space file. */\nexport function prepareSpaceSave(space: string, path: string, signal: AbortSignal): Promise<BoundedFileSource> {\n return boundedFileSource(\n path,\n async (headers, signal) => {\n if (signal.aborted) throw new Error('Download cancelled.');\n const result = await api.host.content({ query: { space, path }, headers, signal });\n if (!result.ok && result.status !== 416) throw new Error(result.error || 'This file could not be read.');\n if (!result.response) throw new Error('This file could not be read.');\n return result.response;\n },\n signal,\n );\n}\n\nexport async function fetchSpaceMedia(\n space: string,\n path: string,\n signal: AbortSignal,\n): Promise<{ data: string; mimeType: string }> {\n const media = await readMediaBytes(await prepareSpaceSave(space, path, signal), MAX_MEDIA_BYTES, signal);\n return { data: encodeBase64(media.bytes), mimeType: media.mimeType };\n}\n","const SPACE_ID = /^[a-z][a-z0-9-]{0,39}$/u;\nconst LEGACY_SHELF = 'artifact:host/';\nconst SPACE_PREFIX = 'space:';\n\n/**\n * `space:<id>/<path>` names a file in a space. The older `artifact:host/<path>` meant the host shelf,\n * which is Personal now, so it keeps opening the same file.\n */\nexport function parseSpaceReference(reference: string): { space: string; path: string } | undefined {\n const trimmed = reference.trim().replace(/^@/u, '');\n let space: string;\n let path: string;\n if (trimmed.startsWith(LEGACY_SHELF)) {\n space = 'personal';\n path = trimmed.slice(LEGACY_SHELF.length);\n } else if (trimmed.startsWith(SPACE_PREFIX)) {\n const body = trimmed.slice(SPACE_PREFIX.length);\n const slash = body.indexOf('/');\n if (slash < 0) return undefined;\n space = body.slice(0, slash);\n path = body.slice(slash + 1);\n } else return undefined;\n // oxlint-disable-next-line no-control-regex -- control characters never name a file a person can see.\n if (!SPACE_ID.test(space) || path.includes('\\\\') || /[\\u0000-\\u001f\\u007f]/u.test(path)) return undefined;\n if (path.split('/').some((part) => part === '' || part === '.' || part === '..')) return undefined;\n return { space, path };\n}\n\nexport function spaceTabId(space: string, path: string): string {\n return `space:${encodeURIComponent(space)}:${encodeURIComponent(path)}`;\n}\n\nexport interface PairedComputer {\n hostId: string;\n label: string;\n person?: { issuer: string; subject: string };\n connected?: boolean;\n}\n\n/**\n * The computers one combined Home card covers: those of the card's person, grouped exactly as\n * Home groups a `combinesComputers` card. Unlinked computers join the phone's one account, or\n * each other when the phone holds several. Another person's computer is never read.\n */\nexport function computersOfOwner(computers: readonly PairedComputer[], hostId: string | undefined): PairedComputer[] {\n const people = new Set(computers.flatMap((computer) => (computer.person ? [JSON.stringify(computer.person)] : [])));\n const unlinked = people.size === 1 ? [...people][0]! : 'unlinked';\n const owner = (computer: PairedComputer) => (computer.person ? JSON.stringify(computer.person) : unlinked);\n const own = computers.find((computer) => computer.hostId === hostId);\n return own ? computers.filter((computer) => owner(computer) === owner(own)) : [];\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Badge,\n Button,\n FileIcon,\n FileList,\n FileViewer,\n fontOf,\n ListRow,\n Panel,\n type FileItem,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useEffect, useState } from 'react';\nimport { ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { SPACE_REFRESH_MS } from '../../../constants/space';\nimport type { SpaceListing } from '../../../types/space';\nimport {\n fetchComputerFiles,\n fetchSpaceFiles,\n fetchSpaceMedia,\n fetchSpacePreview,\n fetchSpaces,\n prepareSpaceSave,\n} from '../_lib/spaceApi.native';\nimport { SpaceDenied } from '../_lib/spaceDenied';\nimport { computersOfOwner, type PairedComputer } from '../_lib/spaceView';\n\nconst PERSONAL = { id: 'personal', label: 'Personal' };\n\n/** Poll independently of sessions, including when no session is running. */\nfunction useSpace(space: string) {\n const [state, setState] = useState<{\n space: string;\n spaces: { id: string; label: string }[];\n listing?: SpaceListing;\n }>({\n space,\n spaces: [PERSONAL],\n });\n useEffect(() => {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout>;\n const refresh = async () => {\n let denied = false;\n try {\n const [spaces, listing] = await Promise.all([\n fetchSpaces(controller.signal),\n fetchSpaceFiles(space, controller.signal),\n ]);\n if (!controller.signal.aborted) setState({ space, spaces, listing });\n } catch (error) {\n denied = error instanceof SpaceDenied;\n if (!controller.signal.aborted)\n setState((current) => ({\n space,\n spaces: current.spaces,\n listing: {\n items: current.space === space ? (current.listing?.items ?? []) : [],\n error: error instanceof Error ? error.message : String(error),\n },\n }));\n } finally {\n if (!controller.signal.aborted && !denied) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);\n }\n };\n void refresh();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [space]);\n return { spaces: state.spaces, listing: state.space === space ? state.listing : undefined };\n}\n\n/** One paired computer's spaces as the Home card sees them. */\nexport interface SpaceComputer {\n label: string;\n listing?: SpaceListing;\n offline?: boolean;\n}\n\n/** One card for every paired computer: the newest files across them, named with their computer when there are several. */\nexport function SpaceHomeCardView({ computers, onOpen }: { computers: readonly SpaceComputer[]; onOpen?: () => void }) {\n const several = computers.length > 1;\n const files = computers.flatMap((computer) =>\n (computer.listing?.items ?? []).map((item) => ({ ...item, computer: computer.label })),\n );\n const newest = files.sort((a, b) => b.modifiedAt - a.modifiedAt).slice(0, 3);\n const loading = computers.every((computer) => !computer.offline && !computer.listing);\n const failed = computers.filter((computer) => computer.listing?.error !== undefined);\n const away = computers.filter((computer) => computer.offline);\n return (\n <Panel>\n <ListRow\n title=\"Space\"\n leading={<FileIcon color=\"hi\" />}\n trailing={<Badge>{files.length} files</Badge>}\n onPress={onOpen}\n disclosure\n accessibilityLabel=\"Open Space\"\n />\n {loading ? (\n <ListRow title=\"Loading files...\" />\n ) : newest.length === 0 && failed.length === 0 && away.length === 0 ? (\n <ListRow title=\"No files yet\" description=\"Move a session file to Space to keep it here.\" />\n ) : (\n newest.map((item) => (\n <ListRow\n key={`${item.computer}:${item.path}`}\n title={item.name}\n description={several ? `${item.computer} · ${item.path}` : item.path}\n />\n ))\n )}\n {failed.map((computer) => (\n <ListRow\n key={`error:${computer.label}`}\n title={several ? `${computer.label}: ${computer.listing?.error}` : (computer.listing?.error ?? '')}\n />\n ))}\n {away.map((computer) => (\n <ListRow\n key={`offline:${computer.label}`}\n title={`${computer.label} is offline`}\n description=\"Its files show here again when it reconnects.\"\n />\n ))}\n </Panel>\n );\n}\n\n/** Every computer's Personal space, polled together; a computer that is not connected shows as offline. */\nfunction useComputers(computers: readonly PairedComputer[]): SpaceComputer[] {\n const [listings, setListings] = useState<Record<string, SpaceListing>>({});\n const key = JSON.stringify(computers.map((computer) => [computer.hostId, computer.connected !== false]));\n useEffect(() => {\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout>;\n // A computer that refused is not asked again until its connection changes.\n let reachable = (JSON.parse(key) as [string, boolean][]).filter(([, connected]) => connected);\n const refresh = async () => {\n const asked = reachable;\n const results = await Promise.allSettled(\n asked.map(([hostId]) => fetchComputerFiles(hostId, PERSONAL.id, controller.signal)),\n );\n if (controller.signal.aborted) return;\n setListings((before) => ({\n ...before,\n ...Object.fromEntries(\n results.map((result, index): [string, SpaceListing] => {\n const hostId = asked[index]![0];\n if (result.status === 'fulfilled') return [hostId, result.value];\n const error = result.reason instanceof Error ? result.reason.message : String(result.reason);\n return [hostId, { items: before[hostId]?.items ?? [], error }];\n }),\n ),\n }));\n reachable = asked.filter((_, index) => {\n const result = results[index]!;\n return !(result.status === 'rejected' && result.reason instanceof SpaceDenied);\n });\n if (reachable.length > 0) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);\n };\n void refresh();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [key]);\n return computers.map((computer) =>\n computer.connected === false\n ? { label: computer.label, offline: true }\n : { label: computer.label, listing: listings[computer.hostId] },\n );\n}\n\nfunction CombinedHomeCard({ computers, onOpen }: { computers: readonly PairedComputer[]; onOpen: () => void }) {\n return <SpaceHomeCardView computers={useComputers(computers)} onOpen={onOpen} />;\n}\n\nfunction LocalHomeCard({ onOpen }: { onOpen: () => void }) {\n const { listing } = useSpace(PERSONAL.id);\n return <SpaceHomeCardView computers={[{ label: 'This computer', listing }]} onOpen={onOpen} />;\n}\n\n/** The native shell passes the paired computers; without them the card reads this computer only. */\nexport function SpaceHomeCard(\n props: WebPluginSlotProps & { host?: { hostId?: string; connectedHosts: readonly PairedComputer[] } },\n) {\n const computers = computersOfOwner(props.host?.connectedHosts ?? [], props.host?.hostId);\n const onOpen = () => props.openPage?.('space');\n return computers.length > 0 ? (\n <CombinedHomeCard computers={computers} onOpen={onOpen} />\n ) : (\n <LocalHomeCard onOpen={onOpen} />\n );\n}\n\nexport function SpaceHostPageView({\n spaces,\n space,\n onSpaceChange,\n listing,\n onOpen,\n}: {\n spaces: readonly { id: string; label: string }[];\n space: string;\n onSpaceChange: (space: string) => void;\n listing?: SpaceListing;\n onOpen: (path: string) => void;\n}) {\n return (\n <ScrollView contentContainerStyle={styles.content}>\n <Text accessibilityRole=\"header\" style={styles.title}>\n Space\n </Text>\n {spaces.length > 1 ? (\n <View style={styles.spaces}>\n {spaces.map((entry) => (\n <Button\n key={entry.id}\n size=\"sm\"\n variant={entry.id === space ? 'primary' : 'outline'}\n accessibilityState={{ selected: entry.id === space }}\n onPress={() => onSpaceChange(entry.id)}\n >\n {entry.label}\n </Button>\n ))}\n </View>\n ) : null}\n <FileList\n label={spaces.find((entry) => entry.id === space)?.label ?? 'Space'}\n emptyText=\"Files you move here from a session are kept for every session.\"\n items={listing?.items ?? []}\n loading={!listing}\n error={listing?.error}\n onOpen={onOpen}\n grid\n />\n </ScrollView>\n );\n}\n\nexport function SpaceHostPage(props: WebPluginSlotProps) {\n const [space, setSpace] = useState(PERSONAL.id);\n const { spaces, listing } = useSpace(space);\n const [path, setPath] = useState<string>();\n const item: FileItem | undefined = listing?.items.find((entry) => entry.path === path);\n if (path !== undefined)\n return (\n <View style={styles.screen}>\n <Button variant=\"ghost\" onPress={() => setPath(undefined)}>\n Close preview\n </Button>\n <FileViewer\n key={`${space}:${path}`}\n path={path}\n item={item}\n scopeKey={`space:${space}`}\n loadPreview={(signal) => fetchSpacePreview(space, path, signal)}\n loadMedia={(signal) => fetchSpaceMedia(space, path, signal)}\n prepareSave={(signal) => prepareSpaceSave(space, path, signal)}\n nativeSaveFile={props.nativeSaveFile}\n renderFilePreview={props.renderFilePreview}\n renderMediaPreview={props.renderMediaPreview}\n setTabHeader={props.setTabHeader}\n onOpenPath={setPath}\n />\n </View>\n );\n return (\n <SpaceHostPageView spaces={spaces} space={space} onSpaceChange={setSpace} listing={listing} onOpen={setPath} />\n );\n}\n\n/** One space file opened from a transcript, as a transient tab. */\nexport function SpaceFileTab({ space, path, ...props }: WebPluginSlotProps & { space: string; path: string }) {\n const [opened, setOpened] = useState(path);\n return (\n <FileViewer\n key={`${space}:${opened}`}\n path={opened}\n scopeKey={`space:${space}`}\n loadPreview={(signal) => fetchSpacePreview(space, opened, signal)}\n loadMedia={(signal) => fetchSpaceMedia(space, opened, signal)}\n prepareSave={(signal) => prepareSpaceSave(space, opened, signal)}\n nativeSaveFile={props.nativeSaveFile}\n renderFilePreview={props.renderFilePreview}\n renderMediaPreview={props.renderMediaPreview}\n setTabHeader={props.setTabHeader}\n onOpenPath={setOpened}\n />\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n screen: { flex: 1 },\n content: { padding: theme.spacing(4), gap: theme.spacing(3) },\n spaces: { flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(2) },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize['2xl'],\n fontWeight: '600',\n color: theme.colors.hi,\n },\n}));\n","import { defineFileLinks } from '@agimon-ai/po-core/native';\n\nimport { SpaceFileTab } from '../_components/SpaceHost.native';\nimport { parseSpaceReference, spaceTabId } from '../_lib/spaceView';\n\n/** Space references open the space's file, from any session or none. */\nexport default defineFileLinks({\n subscribe: () => () => undefined,\n fingerprint: () => '',\n resolve(_sessionId, reference) {\n const file = parseSpaceReference(reference);\n if (!file) return undefined;\n return {\n id: spaceTabId(file.space, file.path),\n label: file.path.split('/').at(-1) ?? file.path,\n panel: (props) => <SpaceFileTab {...props} space={file.space} path={file.path} />,\n };\n },\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { SpaceHomeCard } from '../_components/SpaceHost.native';\n\n// The card reads every computer of one person, so the phone shows one card, not one per computer.\nexport default defineFill({\n slot: 'home-apps',\n id: 'space',\n data: { combinesComputers: true },\n component: SpaceHomeCard,\n});\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { SpaceHostPage } from '../_components/SpaceHost.native';\n\nexport default defineFill({ slot: 'page', id: 'space', component: SpaceHostPage });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport fileLinksSpace from '../src/extensions/(frontend)/file-links/space.native';\nimport fillSpace from '../src/extensions/(frontend)/fill/Space.home-apps.native';\nimport fillSpace2 from '../src/extensions/(frontend)/fill/Space.page.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: 'space',\n packageName: '@agimon-ai/po-space',\n host: {\n get fileLinks(): WebPluginContributions['fileLinks'] { return fileLinksSpace; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'home-apps', id: 'space' }, fillSpace), via({ slot: 'page', id: 'space' }, fillSpace2)]; },\n },\n});\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/po-space",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.3",
|
|
4
4
|
"description": "Personal and provider-added spaces where Po keeps files beyond one session",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -64,18 +64,18 @@
|
|
|
64
64
|
"registry": "https://registry.npmjs.org/"
|
|
65
65
|
},
|
|
66
66
|
"dependencies": {
|
|
67
|
-
"@agimon-ai/po-artifact": "0.0.0-alpha.
|
|
68
|
-
"@agimon-ai/po-core": "0.0.0-alpha.
|
|
69
|
-
"@agimon-ai/po-web-components": "0.0.0-alpha.
|
|
70
|
-
"@agimon-ai/po-web-security": "0.0.0-alpha.
|
|
67
|
+
"@agimon-ai/po-artifact": "0.0.0-alpha.159",
|
|
68
|
+
"@agimon-ai/po-core": "0.0.0-alpha.160",
|
|
69
|
+
"@agimon-ai/po-web-components": "0.0.0-alpha.160",
|
|
70
|
+
"@agimon-ai/po-web-security": "0.0.0-alpha.160",
|
|
71
71
|
"@deepseek-ai/cordis": "4.0.5",
|
|
72
72
|
"hono": "4.13.13",
|
|
73
73
|
"typebox": "1.4.2"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
|
-
"@agimon-ai/po-build": "0.0.0-alpha.
|
|
77
|
-
"@agimon-ai/po-native-components": "0.0.0-alpha.
|
|
78
|
-
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.
|
|
76
|
+
"@agimon-ai/po-build": "0.0.0-alpha.160",
|
|
77
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.160",
|
|
78
|
+
"@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.160",
|
|
79
79
|
"@earendil-works/pi-coding-agent": "1.5.1",
|
|
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.
|
|
95
|
+
"@agimon-ai/po-native-components": "0.0.0-alpha.160",
|
|
96
96
|
"@earendil-works/pi-coding-agent": "1.5.1",
|
|
97
97
|
"react-native": "0.88.1",
|
|
98
98
|
"react-native-unistyles": "^3.5.3"
|