@agimon-ai/po-space 0.0.1-alpha.0 → 0.0.1-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -54,9 +54,14 @@ const api = createApiClient(routes, {
54
54
  //#endregion
55
55
  //#region src/extensions/(frontend)/_lib/spaceApi.native.ts
56
56
  const MAX_MEDIA_BYTES = 5242880;
57
+ /** The computer said this person may not see its space. Asking again changes nothing, so a poller stops. */
58
+ var SpaceDenied = class extends Error {};
59
+ function failure(result, fallback) {
60
+ return result.status === 403 ? new SpaceDenied(result.error || fallback) : new Error(result.error || fallback);
61
+ }
57
62
  async function fetchSpaces(signal) {
58
63
  const result = await api.host.spaces({ signal });
59
- if (!result.ok) throw new Error(result.error || "Spaces could not be loaded.");
64
+ if (!result.ok) throw failure(result, "Spaces could not be loaded.");
60
65
  return result.data.spaces;
61
66
  }
62
67
  async function fetchSpaceFiles(space, signal) {
@@ -64,7 +69,7 @@ async function fetchSpaceFiles(space, signal) {
64
69
  query: { space },
65
70
  signal
66
71
  });
67
- if (!result.ok) throw new Error(result.error || "Files could not be loaded.");
72
+ if (!result.ok) throw failure(result, "Files could not be loaded.");
68
73
  return result.data;
69
74
  }
70
75
  /** One space on one paired computer, through the transport the native shell seals for it. */
@@ -80,7 +85,7 @@ async function fetchComputerFiles(hostId, space, signal) {
80
85
  query: { space },
81
86
  signal
82
87
  });
83
- if (!result.ok) throw new Error(result.error || "Files could not be loaded.");
88
+ if (!result.ok) throw failure(result, "Files could not be loaded.");
84
89
  return result.data;
85
90
  }
86
91
  async function fetchSpacePreview(space, path, signal) {
@@ -179,6 +184,7 @@ function useSpace(space) {
179
184
  const controller = new AbortController();
180
185
  let timer;
181
186
  const refresh = async () => {
187
+ let denied = false;
182
188
  try {
183
189
  const [spaces, listing] = await Promise.all([fetchSpaces(controller.signal), fetchSpaceFiles(space, controller.signal)]);
184
190
  if (!controller.signal.aborted) setState({
@@ -187,6 +193,7 @@ function useSpace(space) {
187
193
  listing
188
194
  });
189
195
  } catch (error) {
196
+ denied = error instanceof SpaceDenied;
190
197
  if (!controller.signal.aborted) setState((current) => ({
191
198
  space,
192
199
  spaces: current.spaces,
@@ -196,7 +203,7 @@ function useSpace(space) {
196
203
  }
197
204
  }));
198
205
  } finally {
199
- if (!controller.signal.aborted) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);
206
+ if (!controller.signal.aborted && !denied) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);
200
207
  }
201
208
  };
202
209
  refresh();
@@ -251,20 +258,28 @@ function useComputers(computers) {
251
258
  useEffect(() => {
252
259
  const controller = new AbortController();
253
260
  let timer;
254
- const reachable = JSON.parse(key).filter(([, connected]) => connected);
261
+ let reachable = JSON.parse(key).filter(([, connected]) => connected);
255
262
  const refresh = async () => {
256
- const results = await Promise.allSettled(reachable.map(([hostId]) => fetchComputerFiles(hostId, PERSONAL.id, controller.signal)));
263
+ const asked = reachable;
264
+ const results = await Promise.allSettled(asked.map(([hostId]) => fetchComputerFiles(hostId, PERSONAL.id, controller.signal)));
257
265
  if (controller.signal.aborted) return;
258
- setListings((before) => Object.fromEntries(results.map((result, index) => {
259
- const hostId = reachable[index][0];
260
- if (result.status === "fulfilled") return [hostId, result.value];
261
- const error = result.reason instanceof Error ? result.reason.message : String(result.reason);
262
- return [hostId, {
263
- items: before[hostId]?.items ?? [],
264
- error
265
- }];
266
- })));
267
- timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);
266
+ setListings((before) => ({
267
+ ...before,
268
+ ...Object.fromEntries(results.map((result, index) => {
269
+ const hostId = asked[index][0];
270
+ if (result.status === "fulfilled") return [hostId, result.value];
271
+ const error = result.reason instanceof Error ? result.reason.message : String(result.reason);
272
+ return [hostId, {
273
+ items: before[hostId]?.items ?? [],
274
+ error
275
+ }];
276
+ }))
277
+ }));
278
+ reachable = asked.filter((_, index) => {
279
+ const result = results[index];
280
+ return !(result.status === "rejected" && result.reason instanceof SpaceDenied);
281
+ });
282
+ if (reachable.length > 0) timer = setTimeout(() => void refresh(), SPACE_REFRESH_MS);
268
283
  };
269
284
  refresh();
270
285
  return () => {
@@ -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","computersOfOwner","PairedComputer","PERSONAL","id","label","useSpace","space","state","setState","spaces","listing","controller","AbortController","timer","ReturnType","setTimeout","refresh","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","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\nexport async function fetchSpaces(signal: AbortSignal): Promise<SpaceSummary[]> {\n const result = await api.host.spaces({ signal });\n if (!result.ok) throw new Error(result.error || '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 new Error(result.error || '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 new Error(result.error || '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 { 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 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 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) 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 const reachable = (JSON.parse(key) as [string, boolean][]).filter(([, connected]) => connected);\n const refresh = async () => {\n const results = await Promise.allSettled(\n reachable.map(([hostId]) => fetchComputerFiles(hostId, PERSONAL.id, controller.signal)),\n );\n if (controller.signal.aborted) return;\n setListings((before) =>\n Object.fromEntries(\n results.map((result, index): [string, SpaceListing] => {\n const hostId = reachable[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 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/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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-space",
3
- "version": "0.0.1-alpha.0",
3
+ "version": "0.0.1-alpha.1",
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.156",
68
- "@agimon-ai/po-core": "0.0.0-alpha.157",
69
- "@agimon-ai/po-web-components": "0.0.0-alpha.157",
70
- "@agimon-ai/po-web-security": "0.0.0-alpha.157",
67
+ "@agimon-ai/po-artifact": "0.0.0-alpha.157",
68
+ "@agimon-ai/po-core": "0.0.0-alpha.158",
69
+ "@agimon-ai/po-web-components": "0.0.0-alpha.158",
70
+ "@agimon-ai/po-web-security": "0.0.0-alpha.158",
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.157",
77
- "@agimon-ai/po-native-components": "0.0.0-alpha.157",
78
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.157",
76
+ "@agimon-ai/po-build": "0.0.0-alpha.158",
77
+ "@agimon-ai/po-native-components": "0.0.0-alpha.158",
78
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.158",
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.157",
95
+ "@agimon-ai/po-native-components": "0.0.0-alpha.158",
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"