@agimon-ai/po-template-advanced 0.0.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/extensions/native.mjs +344 -0
- package/dist/extensions/native.mjs.map +1 -0
- package/dist/extensions/web.mjs +1271 -0
- package/dist/extensions/web.mjs.map +1 -0
- package/dist/webClient.cjs +1272 -0
- package/dist/webClient.cjs.map +1 -0
- package/dist/webClient.d.mts +4 -0
- package/dist/webClient.d.mts.map +1 -0
- package/dist/webClient.mjs +1271 -0
- package/dist/webClient.mjs.map +1 -0
- package/llms.txt +5 -0
- package/package.json +120 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Vuong Ngo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Po Advanced template
|
|
2
|
+
|
|
3
|
+
An independently installable, slot-based web template with persistent desktop session navigation and an activity dock. Mobile panels use accessible drawers.
|
|
4
|
+
|
|
5
|
+
Append `@agimon-ai/po-template-advanced` to the existing `default.packages` list in `~/.po/modes.yaml` or your repository's `.po/modes.yaml`. Keep the other entries. A repository `default` replaces the personal list rather than merging individual packages.
|
|
6
|
+
|
|
7
|
+
Packages can also live in a layer selected by a major mode. Refresh the composition with `po sync` after adding or removing packages.
|
|
8
|
+
|
|
9
|
+
Open **Settings > Appearance > Template**, choose the configuration scope, select **Advanced**, and click **Set as default**. The equivalent configuration is:
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
web:
|
|
13
|
+
template: po-template-advanced
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Global defaults live in `~/.po/config.yaml`. Workspace defaults live in `.po/config.yaml` and override the global value. Clearing a workspace default restores inheritance.
|
|
17
|
+
|
|
18
|
+
A template changes presentation, not the active tools, session runtime, or color theme. The host supplies header, notices, content, composer, session controls, and activity slots, plus the session rail as data and actions (`rail`). The template renders the rail itself: workspaces, session cards, and the add-workspace dialog (render that dialog at the layout root so it opens while a drawer is closed). The new-session, resume, and remote-access dialogs, the keyboard shortcuts, approval and security overlays stay with the host.
|
|
19
|
+
|
|
20
|
+
## Package contract
|
|
21
|
+
|
|
22
|
+
The routed `template/*.web.ts` contributions are compiled by `@agimon-ai/po-build`. The generated Pi entry admits the package through normal `modes.yaml` resolution but registers no tools or minor modes. Browser code is emitted to `dist/extensions/web.mjs` and discovered through `poWeb` metadata.
|
|
23
|
+
|
|
24
|
+
The layout implements `WebTemplateProps` and template contract version 1 from `@agimon-ai/po-core/web`. There is no dependency on the web client's private stores or router.
|
|
25
|
+
|
|
26
|
+
## Development
|
|
27
|
+
|
|
28
|
+
```sh
|
|
29
|
+
pnpm exec nx run-many -t lint typecheck build test -p @agimon-ai/po-template-advanced --parallel=2
|
|
30
|
+
```
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { defineNativePlugin, defineNativeTemplate } from "@agimon-ai/po-core/native";
|
|
2
|
+
import { View } from "react-native-unistyles/components/native/View";
|
|
3
|
+
import { Text } from "react-native-unistyles/components/native/Text";
|
|
4
|
+
import { ScrollView } from "react-native-unistyles/components/native/ScrollView";
|
|
5
|
+
import { Pressable } from "react-native-unistyles/components/native/Pressable";
|
|
6
|
+
import { AlertIcon, BranchIcon, EmptyState, FolderIcon, Spinner, fontOf } from "@agimon-ai/po-native-components";
|
|
7
|
+
import { StyleSheet } from "react-native-unistyles";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/extensions/(frontend)/template/_components/AdvancedSessions.native.tsx
|
|
10
|
+
/** The same reading of the status line as the cockpit card. */
|
|
11
|
+
function statusTone(status) {
|
|
12
|
+
if (status.startsWith("failed") || status.includes(" failed")) return "failed";
|
|
13
|
+
if (status.startsWith("running")) return "running";
|
|
14
|
+
return "quiet";
|
|
15
|
+
}
|
|
16
|
+
function SessionCard({ session, onOpen }) {
|
|
17
|
+
const tone = statusTone(session.status);
|
|
18
|
+
const name = session.name || "Untitled";
|
|
19
|
+
return /* @__PURE__ */ jsxs(Pressable, {
|
|
20
|
+
accessibilityRole: "button",
|
|
21
|
+
accessibilityLabel: `Open ${name}`,
|
|
22
|
+
onPress: () => onOpen(session.id),
|
|
23
|
+
style: ({ pressed }) => [
|
|
24
|
+
styles.card,
|
|
25
|
+
session.nested && styles.nested,
|
|
26
|
+
pressed && styles.cardPressed,
|
|
27
|
+
session.active && styles.cardActive
|
|
28
|
+
],
|
|
29
|
+
children: [
|
|
30
|
+
/* @__PURE__ */ jsxs(View, {
|
|
31
|
+
style: styles.cardHead,
|
|
32
|
+
children: [session.profile ? /* @__PURE__ */ jsx(View, {
|
|
33
|
+
style: styles.avatar,
|
|
34
|
+
accessibilityLabel: session.profile.label,
|
|
35
|
+
children: /* @__PURE__ */ jsx(Text, {
|
|
36
|
+
style: styles.initials,
|
|
37
|
+
children: session.profile.initials
|
|
38
|
+
})
|
|
39
|
+
}) : null, /* @__PURE__ */ jsxs(View, {
|
|
40
|
+
style: styles.cardText,
|
|
41
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
42
|
+
style: styles.name,
|
|
43
|
+
numberOfLines: 2,
|
|
44
|
+
children: name
|
|
45
|
+
}), /* @__PURE__ */ jsxs(View, {
|
|
46
|
+
style: styles.statusRow,
|
|
47
|
+
children: [session.awaitingInput ? /* @__PURE__ */ jsx(AlertIcon, {
|
|
48
|
+
size: 12,
|
|
49
|
+
color: "magenta",
|
|
50
|
+
accessibilityLabel: "Waiting for your input"
|
|
51
|
+
}) : tone === "running" ? /* @__PURE__ */ jsx(Spinner, {
|
|
52
|
+
size: "small",
|
|
53
|
+
color: "yellow"
|
|
54
|
+
}) : tone === "failed" ? /* @__PURE__ */ jsx(AlertIcon, {
|
|
55
|
+
size: 12,
|
|
56
|
+
color: "red"
|
|
57
|
+
}) : null, /* @__PURE__ */ jsx(Text, {
|
|
58
|
+
style: styles.status(tone),
|
|
59
|
+
numberOfLines: 1,
|
|
60
|
+
children: session.status
|
|
61
|
+
})]
|
|
62
|
+
})]
|
|
63
|
+
})]
|
|
64
|
+
}),
|
|
65
|
+
session.git ? /* @__PURE__ */ jsxs(View, {
|
|
66
|
+
style: [styles.branchRow, session.profile && styles.underAvatar],
|
|
67
|
+
children: [
|
|
68
|
+
/* @__PURE__ */ jsx(BranchIcon, {
|
|
69
|
+
size: 13,
|
|
70
|
+
color: "dim"
|
|
71
|
+
}),
|
|
72
|
+
/* @__PURE__ */ jsx(Text, {
|
|
73
|
+
style: styles.branch,
|
|
74
|
+
numberOfLines: 1,
|
|
75
|
+
children: session.git.branch
|
|
76
|
+
}),
|
|
77
|
+
session.git.dirty ? /* @__PURE__ */ jsx(Text, {
|
|
78
|
+
style: styles.modified,
|
|
79
|
+
children: "modified"
|
|
80
|
+
}) : null
|
|
81
|
+
]
|
|
82
|
+
}) : null,
|
|
83
|
+
session.pendingSetups.map((setup) => /* @__PURE__ */ jsxs(View, {
|
|
84
|
+
style: [styles.setup, session.profile && styles.underAvatar],
|
|
85
|
+
children: [/* @__PURE__ */ jsxs(Text, {
|
|
86
|
+
style: styles.setupStatus(setup.failed),
|
|
87
|
+
numberOfLines: 2,
|
|
88
|
+
children: [
|
|
89
|
+
setup.name,
|
|
90
|
+
" · ",
|
|
91
|
+
setup.status
|
|
92
|
+
]
|
|
93
|
+
}), setup.recovery ? /* @__PURE__ */ jsx(Text, {
|
|
94
|
+
style: styles.recovery,
|
|
95
|
+
children: setup.recovery
|
|
96
|
+
}) : null]
|
|
97
|
+
}, setup.id)),
|
|
98
|
+
session.error ? /* @__PURE__ */ jsx(Text, {
|
|
99
|
+
style: styles.error,
|
|
100
|
+
numberOfLines: 3,
|
|
101
|
+
children: session.error
|
|
102
|
+
}) : null
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function WorkspaceGroup({ workspace, onOpen }) {
|
|
107
|
+
return /* @__PURE__ */ jsxs(View, {
|
|
108
|
+
style: styles.group,
|
|
109
|
+
children: [
|
|
110
|
+
/* @__PURE__ */ jsxs(View, {
|
|
111
|
+
style: styles.groupHead,
|
|
112
|
+
accessibilityRole: "header",
|
|
113
|
+
children: [/* @__PURE__ */ jsx(FolderIcon, {
|
|
114
|
+
size: 16,
|
|
115
|
+
color: "dim"
|
|
116
|
+
}), /* @__PURE__ */ jsxs(View, {
|
|
117
|
+
style: styles.groupText,
|
|
118
|
+
children: [/* @__PURE__ */ jsx(Text, {
|
|
119
|
+
style: styles.groupName,
|
|
120
|
+
numberOfLines: 1,
|
|
121
|
+
children: workspace.name
|
|
122
|
+
}), /* @__PURE__ */ jsx(Text, {
|
|
123
|
+
style: styles.groupRoot,
|
|
124
|
+
numberOfLines: 1,
|
|
125
|
+
ellipsizeMode: "middle",
|
|
126
|
+
children: workspace.root
|
|
127
|
+
})]
|
|
128
|
+
})]
|
|
129
|
+
}),
|
|
130
|
+
!workspace.available ? /* @__PURE__ */ jsx(Text, {
|
|
131
|
+
style: styles.unavailable,
|
|
132
|
+
children: "Workspace unavailable"
|
|
133
|
+
}) : null,
|
|
134
|
+
workspace.sessions.length === 0 ? /* @__PURE__ */ jsx(Text, {
|
|
135
|
+
style: styles.noSessions,
|
|
136
|
+
children: "No sessions yet. Start or resume one."
|
|
137
|
+
}) : workspace.sessions.map((session) => /* @__PURE__ */ jsx(SessionCard, {
|
|
138
|
+
session,
|
|
139
|
+
onOpen
|
|
140
|
+
}, session.id))
|
|
141
|
+
]
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** The Advanced template's session list: the cockpit rail's workspace groups and cards, sized for a phone. */
|
|
145
|
+
function AdvancedSessions({ workspaces, openSession }) {
|
|
146
|
+
if (workspaces.length === 0) return /* @__PURE__ */ jsx(EmptyState, {
|
|
147
|
+
title: "No sessions yet.",
|
|
148
|
+
description: "Start one in Po on your computer."
|
|
149
|
+
});
|
|
150
|
+
return /* @__PURE__ */ jsx(ScrollView, {
|
|
151
|
+
style: styles.screen,
|
|
152
|
+
contentContainerStyle: styles.content,
|
|
153
|
+
contentInsetAdjustmentBehavior: "automatic",
|
|
154
|
+
children: workspaces.map((workspace) => /* @__PURE__ */ jsx(WorkspaceGroup, {
|
|
155
|
+
workspace,
|
|
156
|
+
onOpen: openSession
|
|
157
|
+
}, workspace.id))
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
const styles = StyleSheet.create((theme) => {
|
|
161
|
+
const sans = fontOf(theme.fontFamily.sans);
|
|
162
|
+
const text = (size, color) => ({
|
|
163
|
+
fontFamily: sans,
|
|
164
|
+
fontSize: theme.fontSize[size],
|
|
165
|
+
lineHeight: theme.lineHeight[size],
|
|
166
|
+
color
|
|
167
|
+
});
|
|
168
|
+
return {
|
|
169
|
+
screen: {
|
|
170
|
+
flex: 1,
|
|
171
|
+
backgroundColor: theme.colors.rail,
|
|
172
|
+
uni__dependencies: [0]
|
|
173
|
+
},
|
|
174
|
+
content: {
|
|
175
|
+
padding: theme.spacing(4),
|
|
176
|
+
gap: theme.spacing(6),
|
|
177
|
+
uni__dependencies: [0]
|
|
178
|
+
},
|
|
179
|
+
group: {
|
|
180
|
+
gap: theme.spacing(1),
|
|
181
|
+
uni__dependencies: [0]
|
|
182
|
+
},
|
|
183
|
+
groupHead: {
|
|
184
|
+
flexDirection: "row",
|
|
185
|
+
alignItems: "flex-start",
|
|
186
|
+
gap: theme.spacing(2),
|
|
187
|
+
paddingHorizontal: theme.spacing(1),
|
|
188
|
+
paddingBottom: theme.spacing(2),
|
|
189
|
+
uni__dependencies: [0]
|
|
190
|
+
},
|
|
191
|
+
groupText: {
|
|
192
|
+
flex: 1,
|
|
193
|
+
minWidth: 0
|
|
194
|
+
},
|
|
195
|
+
groupName: {
|
|
196
|
+
...text("base", theme.colors.hi),
|
|
197
|
+
fontWeight: theme.fontWeight.semibold,
|
|
198
|
+
uni__dependencies: [0]
|
|
199
|
+
},
|
|
200
|
+
groupRoot: {
|
|
201
|
+
...text("sm", theme.colors.dim),
|
|
202
|
+
fontFamily: fontOf(theme.fontFamily.mono),
|
|
203
|
+
uni__dependencies: [0]
|
|
204
|
+
},
|
|
205
|
+
noSessions: {
|
|
206
|
+
...text("sm", theme.colors.dim),
|
|
207
|
+
paddingHorizontal: theme.spacing(1),
|
|
208
|
+
paddingBottom: theme.spacing(2),
|
|
209
|
+
uni__dependencies: [0]
|
|
210
|
+
},
|
|
211
|
+
unavailable: {
|
|
212
|
+
...text("sm", theme.colors.red),
|
|
213
|
+
paddingHorizontal: theme.spacing(1),
|
|
214
|
+
uni__dependencies: [0]
|
|
215
|
+
},
|
|
216
|
+
card: {
|
|
217
|
+
gap: theme.spacing(2),
|
|
218
|
+
padding: theme.spacing(3),
|
|
219
|
+
borderRadius: theme.borderRadius.lg,
|
|
220
|
+
borderWidth: 1,
|
|
221
|
+
borderColor: "transparent",
|
|
222
|
+
uni__dependencies: [0]
|
|
223
|
+
},
|
|
224
|
+
cardPressed: {
|
|
225
|
+
backgroundColor: theme.colors.panel,
|
|
226
|
+
uni__dependencies: [0]
|
|
227
|
+
},
|
|
228
|
+
cardActive: {
|
|
229
|
+
backgroundColor: theme.colors["tint-green"],
|
|
230
|
+
borderColor: theme.colors["edge-green"],
|
|
231
|
+
uni__dependencies: [0]
|
|
232
|
+
},
|
|
233
|
+
nested: {
|
|
234
|
+
marginLeft: theme.spacing(5),
|
|
235
|
+
uni__dependencies: [0]
|
|
236
|
+
},
|
|
237
|
+
cardHead: {
|
|
238
|
+
flexDirection: "row",
|
|
239
|
+
alignItems: "flex-start",
|
|
240
|
+
gap: theme.spacing(2.5),
|
|
241
|
+
uni__dependencies: [0]
|
|
242
|
+
},
|
|
243
|
+
avatar: {
|
|
244
|
+
width: 32,
|
|
245
|
+
height: 32,
|
|
246
|
+
borderRadius: 16,
|
|
247
|
+
alignItems: "center",
|
|
248
|
+
justifyContent: "center",
|
|
249
|
+
backgroundColor: theme.colors["tint-green"],
|
|
250
|
+
uni__dependencies: [0]
|
|
251
|
+
},
|
|
252
|
+
initials: {
|
|
253
|
+
...text("xs", theme.colors.green),
|
|
254
|
+
fontWeight: theme.fontWeight.semibold,
|
|
255
|
+
uni__dependencies: [0]
|
|
256
|
+
},
|
|
257
|
+
cardText: {
|
|
258
|
+
flex: 1,
|
|
259
|
+
minWidth: 0,
|
|
260
|
+
gap: theme.spacing(1),
|
|
261
|
+
uni__dependencies: [0]
|
|
262
|
+
},
|
|
263
|
+
name: {
|
|
264
|
+
...text("base", theme.colors.hi),
|
|
265
|
+
fontWeight: theme.fontWeight.semibold,
|
|
266
|
+
uni__dependencies: [0]
|
|
267
|
+
},
|
|
268
|
+
statusRow: {
|
|
269
|
+
flexDirection: "row",
|
|
270
|
+
alignItems: "center",
|
|
271
|
+
gap: theme.spacing(1.5),
|
|
272
|
+
uni__dependencies: [0]
|
|
273
|
+
},
|
|
274
|
+
status: (tone) => ({
|
|
275
|
+
...text("sm", tone === "failed" ? theme.colors.red : tone === "running" ? theme.colors.yellow : theme.colors.dim),
|
|
276
|
+
flexShrink: 1,
|
|
277
|
+
uni__dependencies: [0]
|
|
278
|
+
}),
|
|
279
|
+
underAvatar: {
|
|
280
|
+
paddingLeft: 32 + theme.spacing(2.5),
|
|
281
|
+
uni__dependencies: [0]
|
|
282
|
+
},
|
|
283
|
+
branchRow: {
|
|
284
|
+
flexDirection: "row",
|
|
285
|
+
alignItems: "center",
|
|
286
|
+
gap: theme.spacing(1.5),
|
|
287
|
+
uni__dependencies: [0]
|
|
288
|
+
},
|
|
289
|
+
branch: {
|
|
290
|
+
...text("sm", theme.colors.dim),
|
|
291
|
+
fontFamily: fontOf(theme.fontFamily.mono),
|
|
292
|
+
flexShrink: 1,
|
|
293
|
+
uni__dependencies: [0]
|
|
294
|
+
},
|
|
295
|
+
modified: text("sm", theme.colors.yellow),
|
|
296
|
+
setup: {
|
|
297
|
+
gap: theme.spacing(.5),
|
|
298
|
+
uni__dependencies: [0]
|
|
299
|
+
},
|
|
300
|
+
setupStatus: (failed) => text("sm", failed ? theme.colors.red : theme.colors.dim),
|
|
301
|
+
recovery: text("sm", theme.colors.dim),
|
|
302
|
+
error: text("sm", theme.colors.red)
|
|
303
|
+
};
|
|
304
|
+
});
|
|
305
|
+
//#endregion
|
|
306
|
+
//#region src/extensions/(frontend)/template/_lib/nativeDefinition.native.ts
|
|
307
|
+
/** The phone half of Advanced. Screens it leaves out stay the app's own. */
|
|
308
|
+
const advancedNativeTemplate = {
|
|
309
|
+
label: "Advanced",
|
|
310
|
+
description: "Workspace-grouped session cards, matching the cockpit rail.",
|
|
311
|
+
contractVersion: 1,
|
|
312
|
+
screens: { sessions: AdvancedSessions }
|
|
313
|
+
};
|
|
314
|
+
//#endregion
|
|
315
|
+
//#region src/extensions/(frontend)/template/po-template-advanced.native.ts
|
|
316
|
+
var po_template_advanced_native_default$2 = defineNativeTemplate(advancedNativeTemplate);
|
|
317
|
+
//#endregion
|
|
318
|
+
//#region src/extensions/workspaces/(frontend)/template/po-template-advanced.native.ts
|
|
319
|
+
var po_template_advanced_native_default$1 = defineNativeTemplate(advancedNativeTemplate);
|
|
320
|
+
//#endregion
|
|
321
|
+
//#region src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native.ts
|
|
322
|
+
var po_template_advanced_native_default = defineNativeTemplate(advancedNativeTemplate);
|
|
323
|
+
//#endregion
|
|
324
|
+
//#region generated/native.ts
|
|
325
|
+
const via = (identity, value) => value === void 0 ? void 0 : {
|
|
326
|
+
...identity,
|
|
327
|
+
...value
|
|
328
|
+
};
|
|
329
|
+
const nativePlugin = defineNativePlugin({
|
|
330
|
+
id: "template-advanced",
|
|
331
|
+
global: { get nativeTemplates() {
|
|
332
|
+
return [via({ id: "po-template-advanced" }, po_template_advanced_native_default$2)];
|
|
333
|
+
} },
|
|
334
|
+
workspace: { get nativeTemplates() {
|
|
335
|
+
return [via({ id: "po-template-advanced" }, po_template_advanced_native_default$1)];
|
|
336
|
+
} },
|
|
337
|
+
session: { get nativeTemplates() {
|
|
338
|
+
return [via({ id: "po-template-advanced" }, po_template_advanced_native_default)];
|
|
339
|
+
} }
|
|
340
|
+
});
|
|
341
|
+
//#endregion
|
|
342
|
+
export { nativePlugin };
|
|
343
|
+
|
|
344
|
+
//# sourceMappingURL=native.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.mjs","names":["NativeTemplateSessionsProps","WebTemplateRailSession","WebTemplateRailWorkspace","AlertIcon","BranchIcon","EmptyState","FolderIcon","fontOf","Spinner","StyleSheet","StatusTone","statusTone","status","startsWith","includes","SessionCard","session","onOpen","id","tone","name","pressed","styles","card","nested","cardPressed","active","cardActive","cardHead","profile","avatar","label","initials","cardText","statusRow","awaitingInput","git","branchRow","underAvatar","branch","dirty","modified","pendingSetups","map","setup","setupStatus","failed","recovery","error","WorkspaceGroup","workspace","group","groupHead","groupText","groupName","groupRoot","root","available","unavailable","sessions","length","noSessions","AdvancedSessions","workspaces","openSession","screen","content","create","theme","sans","fontFamily","text","size","color","fontSize","lineHeight","flex","backgroundColor","colors","rail","uni__dependencies","padding","spacing","gap","flexDirection","alignItems","paddingHorizontal","paddingBottom","minWidth","hi","fontWeight","semibold","dim","mono","red","borderRadius","lg","borderWidth","borderColor","panel","marginLeft","width","height","justifyContent","green","yellow","flexShrink","paddingLeft","templatePoTemplateAdvanced","templatePoTemplateAdvanced2","templatePoTemplateAdvanced3"],"sources":["../../src/extensions/(frontend)/template/_components/AdvancedSessions.native.tsx","../../src/extensions/(frontend)/template/_lib/nativeDefinition.native.ts","../../src/extensions/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/(frontend)/template/po-template-advanced.native.ts","../../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.native.ts","../../generated/native.ts"],"sourcesContent":["import type {\n NativeTemplateSessionsProps,\n WebTemplateRailSession,\n WebTemplateRailWorkspace,\n} from '@agimon-ai/po-core/native';\nimport { AlertIcon, BranchIcon, EmptyState, FolderIcon, fontOf, Spinner } from '@agimon-ai/po-native-components';\nimport { Pressable, ScrollView, Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\ntype StatusTone = 'failed' | 'running' | 'quiet';\n\n/** The same reading of the status line as the cockpit card. */\nfunction statusTone(status: string): StatusTone {\n if (status.startsWith('failed') || status.includes(' failed')) return 'failed';\n if (status.startsWith('running')) return 'running';\n return 'quiet';\n}\n\nfunction SessionCard({ session, onOpen }: { session: WebTemplateRailSession; onOpen: (id: string) => void }) {\n const tone = statusTone(session.status);\n const name = session.name || 'Untitled';\n return (\n <Pressable\n accessibilityRole=\"button\"\n accessibilityLabel={`Open ${name}`}\n onPress={() => onOpen(session.id)}\n style={({ pressed }) => [\n styles.card,\n session.nested && styles.nested,\n pressed && styles.cardPressed,\n session.active && styles.cardActive,\n ]}\n >\n <View style={styles.cardHead}>\n {session.profile ? (\n <View style={styles.avatar} accessibilityLabel={session.profile.label}>\n <Text style={styles.initials}>{session.profile.initials}</Text>\n </View>\n ) : null}\n <View style={styles.cardText}>\n <Text style={styles.name} numberOfLines={2}>\n {name}\n </Text>\n <View style={styles.statusRow}>\n {session.awaitingInput ? (\n <AlertIcon size={12} color=\"magenta\" accessibilityLabel=\"Waiting for your input\" />\n ) : tone === 'running' ? (\n <Spinner size=\"small\" color=\"yellow\" />\n ) : tone === 'failed' ? (\n <AlertIcon size={12} color=\"red\" />\n ) : null}\n <Text style={styles.status(tone)} numberOfLines={1}>\n {session.status}\n </Text>\n </View>\n </View>\n </View>\n {session.git ? (\n <View style={[styles.branchRow, session.profile && styles.underAvatar]}>\n <BranchIcon size={13} color=\"dim\" />\n <Text style={styles.branch} numberOfLines={1}>\n {session.git.branch}\n </Text>\n {session.git.dirty ? <Text style={styles.modified}>modified</Text> : null}\n </View>\n ) : null}\n {session.pendingSetups.map((setup) => (\n <View key={setup.id} style={[styles.setup, session.profile && styles.underAvatar]}>\n <Text style={styles.setupStatus(setup.failed)} numberOfLines={2}>\n {setup.name} · {setup.status}\n </Text>\n {setup.recovery ? <Text style={styles.recovery}>{setup.recovery}</Text> : null}\n </View>\n ))}\n {session.error ? (\n <Text style={styles.error} numberOfLines={3}>\n {session.error}\n </Text>\n ) : null}\n </Pressable>\n );\n}\n\nfunction WorkspaceGroup({ workspace, onOpen }: { workspace: WebTemplateRailWorkspace; onOpen: (id: string) => void }) {\n return (\n <View style={styles.group}>\n <View style={styles.groupHead} accessibilityRole=\"header\">\n <FolderIcon size={16} color=\"dim\" />\n <View style={styles.groupText}>\n <Text style={styles.groupName} numberOfLines={1}>\n {workspace.name}\n </Text>\n <Text style={styles.groupRoot} numberOfLines={1} ellipsizeMode=\"middle\">\n {workspace.root}\n </Text>\n </View>\n </View>\n {!workspace.available ? <Text style={styles.unavailable}>Workspace unavailable</Text> : null}\n {workspace.sessions.length === 0 ? (\n <Text style={styles.noSessions}>No sessions yet. Start or resume one.</Text>\n ) : (\n workspace.sessions.map((session) => <SessionCard key={session.id} session={session} onOpen={onOpen} />)\n )}\n </View>\n );\n}\n\n/** The Advanced template's session list: the cockpit rail's workspace groups and cards, sized for a phone. */\nexport function AdvancedSessions({ workspaces, openSession }: NativeTemplateSessionsProps) {\n if (workspaces.length === 0)\n return <EmptyState title=\"No sessions yet.\" description=\"Start one in Po on your computer.\" />;\n return (\n <ScrollView style={styles.screen} contentContainerStyle={styles.content} contentInsetAdjustmentBehavior=\"automatic\">\n {workspaces.map((workspace) => (\n <WorkspaceGroup key={workspace.id} workspace={workspace} onOpen={openSession} />\n ))}\n </ScrollView>\n );\n}\n\nconst styles = StyleSheet.create((theme) => {\n const sans = fontOf(theme.fontFamily.sans);\n const text = (size: 'xs' | 'sm' | 'base' | 'lg', color: string) => ({\n fontFamily: sans,\n fontSize: theme.fontSize[size],\n lineHeight: theme.lineHeight[size],\n color,\n });\n return {\n // The cockpit's rail surface: this screen is the phone's rail.\n screen: { flex: 1, backgroundColor: theme.colors.rail },\n content: { padding: theme.spacing(4), gap: theme.spacing(6) },\n group: { gap: theme.spacing(1) },\n groupHead: {\n flexDirection: 'row',\n alignItems: 'flex-start',\n gap: theme.spacing(2),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n groupText: { flex: 1, minWidth: 0 },\n groupName: { ...text('base', theme.colors.hi), fontWeight: theme.fontWeight.semibold },\n groupRoot: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono) },\n noSessions: {\n ...text('sm', theme.colors.dim),\n paddingHorizontal: theme.spacing(1),\n paddingBottom: theme.spacing(2),\n },\n unavailable: { ...text('sm', theme.colors.red), paddingHorizontal: theme.spacing(1) },\n card: {\n gap: theme.spacing(2),\n padding: theme.spacing(3),\n borderRadius: theme.borderRadius.lg,\n borderWidth: 1,\n // Flat like the cockpit card: no fill or edge until pressed or active.\n borderColor: 'transparent',\n },\n cardPressed: { backgroundColor: theme.colors.panel },\n cardActive: { backgroundColor: theme.colors['tint-green'], borderColor: theme.colors['edge-green'] },\n nested: { marginLeft: theme.spacing(5) },\n cardHead: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(2.5) },\n avatar: {\n width: 32,\n height: 32,\n borderRadius: 16,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors['tint-green'],\n },\n initials: { ...text('xs', theme.colors.green), fontWeight: theme.fontWeight.semibold },\n cardText: { flex: 1, minWidth: 0, gap: theme.spacing(1) },\n name: { ...text('base', theme.colors.hi), fontWeight: theme.fontWeight.semibold },\n statusRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n status: (tone: StatusTone) => ({\n ...text('sm', tone === 'failed' ? theme.colors.red : tone === 'running' ? theme.colors.yellow : theme.colors.dim),\n flexShrink: 1,\n }),\n underAvatar: { paddingLeft: 32 + theme.spacing(2.5) },\n branchRow: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(1.5) },\n branch: { ...text('sm', theme.colors.dim), fontFamily: fontOf(theme.fontFamily.mono), flexShrink: 1 },\n modified: text('sm', theme.colors.yellow),\n setup: { gap: theme.spacing(0.5) },\n setupStatus: (failed: boolean) => text('sm', failed ? theme.colors.red : theme.colors.dim),\n recovery: text('sm', theme.colors.dim),\n error: text('sm', theme.colors.red),\n };\n});\n","import type { NativeTemplateFile } from '@agimon-ai/po-core/native';\n\nimport { AdvancedSessions } from '../_components/AdvancedSessions.native';\n\n/** The phone half of Advanced. Screens it leaves out stay the app's own. */\nexport const advancedNativeTemplate = {\n label: 'Advanced',\n description: 'Workspace-grouped session cards, matching the cockpit rail.',\n contractVersion: 1,\n screens: { sessions: AdvancedSessions },\n} satisfies NativeTemplateFile;\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","import { defineNativeTemplate } from '@agimon-ai/po-core/native';\n\nimport { advancedNativeTemplate } from '../../../../(frontend)/template/_lib/nativeDefinition.native';\n\nexport default defineNativeTemplate(advancedNativeTemplate);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport templatePoTemplateAdvanced from '../src/extensions/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced2 from '../src/extensions/workspaces/(frontend)/template/po-template-advanced.native';\nimport templatePoTemplateAdvanced3 from '../src/extensions/workspaces/sessions/(frontend)/template/po-template-advanced.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: 'template-advanced',\n global: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced)]; },\n },\n workspace: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced2)]; },\n },\n session: {\n get nativeTemplates(): WebPluginContributions['nativeTemplates'] { return [via({ id: 'po-template-advanced' }, templatePoTemplateAdvanced3)]; },\n },\n});\n"],"mappings":"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"}
|