@agimon-ai/po-computer-use 0.0.0-alpha.81 → 0.0.0-alpha.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,9 @@
1
- import { createApiClient, defineActivityGroup, defineChannelFile, defineFill, defineNativePlugin, defineSessionStore, defineToolRenderer, nativeApiTransport, sessionApiAddress } from "@agimon-ai/po-core/native";
1
+ import { createApiClient, defineActivityGroup, defineChannelFile, defineFill, defineNativePlugin, defineSessionStore, defineSettingsPanel, defineToolRenderer, nativeApiTransport, sessionApiAddress } from "@agimon-ai/po-core/native";
2
+ import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from "react";
3
+ import { AppState } from "react-native";
2
4
  import { View } from "react-native-unistyles/components/native/View";
3
5
  import { Text } from "react-native-unistyles/components/native/Text";
4
- import { Badge, Button, CheckIcon, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, SegmentedControl, fontOf, toolTone } from "@agimon-ai/po-native-components";
5
- import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from "react";
6
+ import { Badge, Button, CheckIcon, Dialog, DialogBody, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, Panel, SegmentedControl, fontOf, toolTone } from "@agimon-ai/po-native-components";
6
7
  import { StyleSheet } from "react-native-unistyles";
7
8
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
9
  //#region src/types/computerUseApi.ts
@@ -38,47 +39,15 @@ const COMPUTER_USE_ROUTES = {
38
39
  hubStop: "/hub/stop"
39
40
  };
40
41
  //#endregion
41
- //#region src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native.ts
42
- /** Remote clients request control from the Desktop host through their session Activity. */
43
- var computer_use_native_default$1 = defineActivityGroup({
44
- name: "computer-use",
45
- keys: "c e",
46
- order: 70,
47
- statusKey: COMPUTER_USE_STATUS_KEY,
48
- hideWhenEmpty: true,
49
- marksBackgroundWork: false
50
- });
51
- const computerUse$1 = defineSessionStore({
52
- state: {
53
- sessionId: "",
54
- revision: 0,
55
- wake: 0,
56
- phase: "inactive"
57
- },
58
- targets: []
59
- });
60
- /** Revision zero must hydrate the empty selector once; equal status polls then retain identity. */
61
- function updateComputerUseState(sessionId, state) {
62
- computerUse$1.update(sessionId, (current) => current.state.sessionId === "" || state.revision > current.state.revision ? {
63
- ...current,
64
- state
65
- } : current);
66
- }
67
- function isRecord(value) {
68
- return typeof value === "object" && value !== null && !Array.isArray(value);
69
- }
70
- const computerUseChannel = computerUse$1.channel({
71
- channel: computerUseChannelType,
72
- parse(input) {
73
- if (!isRecord(input) || !isRecord(input.state) || !Array.isArray(input.targets)) return null;
74
- if (typeof input.state.phase !== "string" || typeof input.state.revision !== "number") return null;
75
- return input;
76
- },
77
- reduce: (_current, payload) => payload
78
- });
79
- //#endregion
80
- //#region src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native.ts
81
- var computer_use_native_default = defineChannelFile(computerUseChannel);
42
+ //#region src/types/desktopPermissions.ts
43
+ /** The macOS privacy permissions Desktop reports, in the order the settings page shows them. */
44
+ const DESKTOP_PERMISSIONS = [
45
+ "accessibility",
46
+ "screen-recording",
47
+ "microphone",
48
+ "automation",
49
+ "full-disk-access"
50
+ ];
82
51
  //#endregion
83
52
  //#region src/types/apiRoutes.ts
84
53
  /**
@@ -186,6 +155,323 @@ const routes = {
186
155
  response: void 0
187
156
  }
188
157
  };
158
+ //#endregion
159
+ //#region src/extensions/(frontend)/setting/_lib/desktopPermissions.native.ts
160
+ /** Reads the Mac, never the phone. A request uses the host's step-up transport. */
161
+ async function readDesktopPermissions(request, permission) {
162
+ try {
163
+ const api = createApiClient(routes, {
164
+ scopes: ["global"],
165
+ basePath: "desktop-permissions",
166
+ transport: request,
167
+ sessionAddress: sessionApiAddress
168
+ });
169
+ const route = permission === void 0 ? api.global.desktopPermissions : api.global.requestDesktopPermission;
170
+ const response = await request(route.url(), permission === void 0 ? void 0 : {
171
+ method: route.spec.method,
172
+ headers: { "content-type": "application/json" },
173
+ body: JSON.stringify({ permission })
174
+ });
175
+ if (response.status === 404) return { status: "unavailable" };
176
+ const body = await response.json().catch(() => void 0);
177
+ if (typeof body === "object" && body !== null && !Array.isArray(body)) {
178
+ const record = body;
179
+ if (response.ok && !("error" in record) && DESKTOP_PERMISSIONS.every((key) => [
180
+ "granted",
181
+ "denied",
182
+ "not-determined",
183
+ "per-app"
184
+ ].includes(record[key]))) return {
185
+ status: "ready",
186
+ states: record
187
+ };
188
+ if (typeof record.error === "string") return {
189
+ status: "error",
190
+ error: record.error
191
+ };
192
+ }
193
+ return {
194
+ status: "error",
195
+ error: "Po Desktop did not return permission states. Try again."
196
+ };
197
+ } catch (error) {
198
+ return {
199
+ status: "error",
200
+ error: error instanceof Error ? error.message : String(error)
201
+ };
202
+ }
203
+ }
204
+ //#endregion
205
+ //#region src/extensions/(frontend)/setting/_components/DesktopPermissionsView.native.tsx
206
+ const COPY = {
207
+ accessibility: {
208
+ title: "Accessibility",
209
+ detail: "Lets Po press buttons, fill fields and scroll in the app window you approve for computer use."
210
+ },
211
+ "screen-recording": {
212
+ title: "Screen and system audio recording",
213
+ detail: "Lets Po see and record the window you approve, with its sound. macOS asks you to reopen Po after you allow it."
214
+ },
215
+ microphone: {
216
+ title: "Microphone",
217
+ detail: "Lets you talk to Po, and adds your voice to computer-use recordings."
218
+ },
219
+ automation: {
220
+ title: "Automation",
221
+ detail: "Lets Po and its agents control other apps, such as Finder or Mail. macOS asks once for each app; your answers are listed in System Settings."
222
+ },
223
+ "full-disk-access": {
224
+ title: "Full Disk Access",
225
+ detail: "Optional. Lets agents and their tools read Documents, Downloads and Mail without a prompt for each folder."
226
+ }
227
+ };
228
+ const LABEL = {
229
+ granted: "Allowed",
230
+ denied: "Not allowed",
231
+ "not-determined": "Not asked yet",
232
+ "per-app": "Asked per app"
233
+ };
234
+ function DesktopPermissionsView({ state, remote = true, onAsk, onRefresh }) {
235
+ return /* @__PURE__ */ jsxs(View, {
236
+ style: styles$5.page,
237
+ children: [/* @__PURE__ */ jsxs(View, {
238
+ style: styles$5.sectionHead,
239
+ children: [/* @__PURE__ */ jsxs(View, {
240
+ style: styles$5.sectionText,
241
+ children: [/* @__PURE__ */ jsx(Text, {
242
+ accessibilityRole: "header",
243
+ style: styles$5.sectionTitle,
244
+ children: "On the paired Mac"
245
+ }), /* @__PURE__ */ jsx(Text, {
246
+ style: styles$5.detail,
247
+ children: remote ? "These belong to the Mac running Po Desktop. When you ask from here, macOS shows its prompt on that Mac." : "Po asks macOS for each one when you are ready. The permission prompt appears on the Mac running Po Desktop. You can change them any time in System Settings, Privacy and Security."
248
+ })]
249
+ }), state.status === "ready" ? /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
250
+ variant: "ghost",
251
+ disabled: state.asking !== void 0,
252
+ accessibilityLabel: "Permissions actions for the paired Mac",
253
+ style: styles$5.control,
254
+ children: "⋯"
255
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, { children: /* @__PURE__ */ jsx(DropdownMenuItem, {
256
+ onSelect: onRefresh,
257
+ children: "Check again"
258
+ }) })] }) : null]
259
+ }), /* @__PURE__ */ jsx(Panel, {
260
+ style: styles$5.card,
261
+ children: state.status === "ready" ? DESKTOP_PERMISSIONS.map((permission, index) => {
262
+ const value = state.states[permission];
263
+ const asking = state.asking === permission;
264
+ const action = asking ? "Waiting for macOS" : value === "not-determined" ? "Allow" : "Open System Settings";
265
+ return /* @__PURE__ */ jsxs(View, {
266
+ style: [styles$5.row, index > 0 && styles$5.divider],
267
+ children: [
268
+ /* @__PURE__ */ jsxs(View, {
269
+ style: styles$5.rowHeading,
270
+ children: [/* @__PURE__ */ jsx(Text, {
271
+ style: styles$5.rowTitle,
272
+ children: COPY[permission].title
273
+ }), /* @__PURE__ */ jsx(Badge, {
274
+ tone: value === "granted" ? "green" : "neutral",
275
+ children: LABEL[value]
276
+ })]
277
+ }),
278
+ /* @__PURE__ */ jsx(Text, {
279
+ style: styles$5.detail,
280
+ children: COPY[permission].detail
281
+ }),
282
+ value !== "granted" ? /* @__PURE__ */ jsx(Button, {
283
+ variant: "outline",
284
+ style: styles$5.control,
285
+ disabled: state.asking !== void 0,
286
+ accessibilityLabel: `${action}: ${COPY[permission].title} on the paired Mac`,
287
+ onPress: () => onAsk(permission),
288
+ children: action
289
+ }) : null,
290
+ asking ? /* @__PURE__ */ jsx(Text, {
291
+ accessibilityLiveRegion: "polite",
292
+ style: styles$5.detail,
293
+ children: "Waiting for your answer on the Mac."
294
+ }) : null
295
+ ]
296
+ }, permission);
297
+ }) : /* @__PURE__ */ jsxs(View, {
298
+ style: styles$5.row,
299
+ children: [
300
+ /* @__PURE__ */ jsx(Text, {
301
+ accessibilityRole: state.status === "error" ? "alert" : "header",
302
+ style: styles$5.rowTitle,
303
+ children: state.status === "loading" ? "Checking with macOS" : state.status === "unavailable" ? "Po Desktop is not running here" : "Po couldn't read the permissions just now"
304
+ }),
305
+ /* @__PURE__ */ jsx(Text, {
306
+ style: styles$5.detail,
307
+ children: state.status === "loading" ? "This takes a moment." : state.status === "unavailable" ? "Permissions belong to the Mac running Po Desktop. Open Po Desktop there to see and change them." : state.error
308
+ }),
309
+ state.status === "error" ? /* @__PURE__ */ jsx(Button, {
310
+ variant: "outline",
311
+ style: styles$5.control,
312
+ accessibilityLabel: "Try reading permissions from the paired Mac again",
313
+ onPress: onRefresh,
314
+ children: "Try again"
315
+ }) : null
316
+ ]
317
+ })
318
+ })]
319
+ });
320
+ }
321
+ const styles$5 = StyleSheet.create((theme) => ({
322
+ page: {
323
+ gap: theme.spacing(5),
324
+ uni__dependencies: [0]
325
+ },
326
+ sectionHead: {
327
+ flexDirection: "row",
328
+ alignItems: "flex-start",
329
+ gap: theme.spacing(2),
330
+ uni__dependencies: [0]
331
+ },
332
+ sectionText: {
333
+ flex: 1,
334
+ minWidth: 0,
335
+ gap: theme.spacing(2),
336
+ uni__dependencies: [0]
337
+ },
338
+ sectionTitle: {
339
+ fontFamily: fontOf(theme.fontFamily.sans),
340
+ fontSize: theme.fontSize.lg,
341
+ lineHeight: theme.lineHeight.lg,
342
+ fontWeight: theme.fontWeight.semibold,
343
+ color: theme.colors.hi,
344
+ uni__dependencies: [0]
345
+ },
346
+ detail: {
347
+ fontFamily: fontOf(theme.fontFamily.sans),
348
+ fontSize: theme.fontSize.sm,
349
+ lineHeight: theme.lineHeightRelaxed.sm,
350
+ color: theme.colors.dim,
351
+ uni__dependencies: [0]
352
+ },
353
+ card: {
354
+ padding: 0,
355
+ overflow: "hidden"
356
+ },
357
+ row: {
358
+ padding: theme.spacing(4),
359
+ gap: theme.spacing(3),
360
+ uni__dependencies: [0]
361
+ },
362
+ rowHeading: {
363
+ flexDirection: "row",
364
+ flexWrap: "wrap",
365
+ alignItems: "center",
366
+ gap: theme.spacing(2),
367
+ uni__dependencies: [0]
368
+ },
369
+ rowTitle: {
370
+ fontFamily: fontOf(theme.fontFamily.sans),
371
+ fontSize: theme.fontSize.base,
372
+ lineHeight: theme.lineHeight.base,
373
+ fontWeight: theme.fontWeight.semibold,
374
+ color: theme.colors.hi,
375
+ flexShrink: 1,
376
+ uni__dependencies: [0]
377
+ },
378
+ divider: {
379
+ borderTopWidth: StyleSheet.hairlineWidth,
380
+ borderTopColor: theme.colors["border-soft"],
381
+ uni__dependencies: [0]
382
+ },
383
+ control: {
384
+ minHeight: 44,
385
+ minWidth: 44,
386
+ alignSelf: "flex-start"
387
+ }
388
+ }));
389
+ //#endregion
390
+ //#region src/extensions/(frontend)/setting/_components/DesktopPermissionsPanel.native.tsx
391
+ function DesktopPermissionsPanel({ request, requestWithStepUp }) {
392
+ const [state, setState] = useState({ status: "loading" });
393
+ const generation = useRef(0);
394
+ const busy = useRef(false);
395
+ const run = useCallback(async (permission) => {
396
+ if (busy.current) return;
397
+ busy.current = true;
398
+ const version = ++generation.current;
399
+ setState((current) => permission !== void 0 && current.status === "ready" ? {
400
+ ...current,
401
+ asking: permission
402
+ } : { status: "loading" });
403
+ const next = await readDesktopPermissions(permission === void 0 ? request : requestWithStepUp, permission);
404
+ if (generation.current !== version) return;
405
+ busy.current = false;
406
+ setState(next);
407
+ }, [request, requestWithStepUp]);
408
+ useEffect(() => {
409
+ run();
410
+ const subscription = AppState.addEventListener("change", (next) => {
411
+ if (next === "active") run();
412
+ });
413
+ return () => {
414
+ generation.current += 1;
415
+ busy.current = false;
416
+ subscription.remove();
417
+ };
418
+ }, [run]);
419
+ return /* @__PURE__ */ jsx(DesktopPermissionsView, {
420
+ state,
421
+ onAsk: (permission) => void run(permission),
422
+ onRefresh: () => void run()
423
+ });
424
+ }
425
+ //#endregion
426
+ //#region src/extensions/(frontend)/setting/desktop-permissions.panel.native.tsx
427
+ var desktop_permissions_panel_native_default = defineSettingsPanel({
428
+ label: "Permissions",
429
+ detail: "What Po may do on the paired Mac",
430
+ order: 46,
431
+ component: DesktopPermissionsPanel
432
+ });
433
+ //#endregion
434
+ //#region src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native.ts
435
+ /** Remote clients request control from the Desktop host through their session Activity. */
436
+ var computer_use_native_default$1 = defineActivityGroup({
437
+ name: "computer-use",
438
+ keys: "c e",
439
+ order: 70,
440
+ statusKey: COMPUTER_USE_STATUS_KEY,
441
+ hideWhenEmpty: true,
442
+ marksBackgroundWork: false
443
+ });
444
+ const computerUse$1 = defineSessionStore({
445
+ state: {
446
+ sessionId: "",
447
+ revision: 0,
448
+ wake: 0,
449
+ phase: "inactive"
450
+ },
451
+ targets: []
452
+ });
453
+ /** Revision zero must hydrate the empty selector once; equal status polls then retain identity. */
454
+ function updateComputerUseState(sessionId, state) {
455
+ computerUse$1.update(sessionId, (current) => current.state.sessionId === "" || state.revision > current.state.revision ? {
456
+ ...current,
457
+ state
458
+ } : current);
459
+ }
460
+ function isRecord(value) {
461
+ return typeof value === "object" && value !== null && !Array.isArray(value);
462
+ }
463
+ const computerUseChannel = computerUse$1.channel({
464
+ channel: computerUseChannelType,
465
+ parse(input) {
466
+ if (!isRecord(input) || !isRecord(input.state) || !Array.isArray(input.targets)) return null;
467
+ if (typeof input.state.phase !== "string" || typeof input.state.revision !== "number") return null;
468
+ return input;
469
+ },
470
+ reduce: (_current, payload) => payload
471
+ });
472
+ //#endregion
473
+ //#region src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native.ts
474
+ var computer_use_native_default = defineChannelFile(computerUseChannel);
189
475
  const computerUse = createApiClient(routes, {
190
476
  scopes: ["session"],
191
477
  basePath: "computer-use",
@@ -215,7 +501,7 @@ const DURATION_OPTIONS = COMPUTER_USE_DURATION_CHOICES_MS.map((choice) => ({
215
501
  value: String(choice),
216
502
  label: `${choice / 6e4} min`
217
503
  }));
218
- function ComputerUseView({ state, targets = [], busy = false, error, submitting = false, durationMs = COMPUTER_USE_DEFAULT_DURATION_MS, onDurationChange, onActivate, onCancel, onStop }) {
504
+ function ComputerUseView({ state, targets = [], busy = false, error, submitting = false, durationMs = COMPUTER_USE_DEFAULT_DURATION_MS, onDurationChange, onRefreshTargets, onActivate, onCancel, onStop }) {
219
505
  const [selected, setSelected] = useState(0);
220
506
  const [confirmation, setConfirmation] = useState();
221
507
  const choices = [{
@@ -242,10 +528,21 @@ function ComputerUseView({ state, targets = [], busy = false, error, submitting
242
528
  return /* @__PURE__ */ jsxs(View, {
243
529
  style: styles$4.panel,
244
530
  children: [
245
- /* @__PURE__ */ jsx(Text, {
246
- style: styles$4.title,
247
- accessibilityRole: "header",
248
- children: "Computer use"
531
+ /* @__PURE__ */ jsxs(View, {
532
+ style: styles$4.header,
533
+ children: [/* @__PURE__ */ jsx(Text, {
534
+ style: styles$4.title,
535
+ accessibilityRole: "header",
536
+ children: "Computer use"
537
+ }), !pending && !active && onRefreshTargets ? /* @__PURE__ */ jsxs(DropdownMenu, { children: [/* @__PURE__ */ jsx(DropdownMenuTrigger, {
538
+ variant: "ghost",
539
+ accessibilityLabel: "Computer use actions",
540
+ children: "Actions"
541
+ }), /* @__PURE__ */ jsx(DropdownMenuContent, { children: /* @__PURE__ */ jsx(DropdownMenuItem, {
542
+ disabled: busy || submitting,
543
+ onSelect: onRefreshTargets,
544
+ children: "Refresh targets"
545
+ }) })] }) : null]
249
546
  }),
250
547
  busy ? /* @__PURE__ */ jsx(Text, {
251
548
  style: styles$4.detail,
@@ -425,6 +722,18 @@ function SessionPanel({ sessionId, sendSessionFrame }) {
425
722
  submitting,
426
723
  durationMs,
427
724
  onDurationChange: setDurationMs,
725
+ onRefreshTargets: () => {
726
+ if (session.busy || submitting) return;
727
+ setError(void 0);
728
+ try {
729
+ sendSessionFrame(sessionId, {
730
+ type: computerUseChannelType,
731
+ payload: { action: "targets" }
732
+ });
733
+ } catch {
734
+ setError("The target list could not be refreshed.");
735
+ }
736
+ },
428
737
  onActivate: (target, duration) => void submit("activate", target, duration),
429
738
  onCancel: () => void submit("cancel"),
430
739
  onStop: () => {
@@ -499,14 +808,21 @@ const styles$4 = StyleSheet.create((theme) => ({
499
808
  gap: theme.spacing(3),
500
809
  uni__dependencies: [0]
501
810
  },
811
+ header: {
812
+ flexDirection: "row",
813
+ alignItems: "center",
814
+ gap: theme.spacing(2),
815
+ paddingBottom: theme.spacing(2),
816
+ borderBottomWidth: 1,
817
+ borderBottomColor: theme.colors["border-soft"],
818
+ uni__dependencies: [0]
819
+ },
502
820
  title: {
821
+ flex: 1,
503
822
  fontFamily: fontOf(theme.fontFamily.sans),
504
823
  fontSize: theme.fontSize.base,
505
824
  fontWeight: "600",
506
825
  color: theme.colors.hi,
507
- paddingBottom: theme.spacing(2),
508
- borderBottomWidth: 1,
509
- borderBottomColor: theme.colors["border-soft"],
510
826
  uni__dependencies: [0]
511
827
  },
512
828
  row: {
@@ -1323,6 +1639,9 @@ const via = (identity, value) => value === void 0 ? void 0 : {
1323
1639
  };
1324
1640
  const nativePlugin = defineNativePlugin({
1325
1641
  id: "computer-use",
1642
+ global: { get settingsPanels() {
1643
+ return [via({ id: "desktop-permissions" }, desktop_permissions_panel_native_default)];
1644
+ } },
1326
1645
  session: {
1327
1646
  get activityGroups() {
1328
1647
  return [via({ name: "computer-use" }, computer_use_native_default$1)];
@@ -1 +1 @@
1
- {"version":3,"file":"native.mjs","names":["computerUse","WebPluginSlotProps","Button","CheckIcon","Dialog","DialogBody","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","fontOf","SegmentedControl","PoNativeTheme","useCallback","useEffect","useRef","useState","useSyncExternalStore","StyleSheet","computerUse","api","COMPUTER_USE_DEFAULT_DURATION_MS","COMPUTER_USE_DURATION_CHOICES_MS","computerUseChannelType","ComputerUseSessionView","updateComputerUseState","text","value","fallback","String","remaining","ms","seconds","Math","max","ceil","floor","padStart","DURATION_OPTIONS","map","choice","label","ComputerUseView","state","targets","busy","error","submitting","durationMs","onDurationChange","onActivate","onCancel","onStop","Record","target","selected","setSelected","confirmation","setConfirmation","choices","scope","applicationName","windowTitle","windowId","chosen","pending","phase","active","failure","message","expiresAt","undefined","now","setNow","Date","timer","setInterval","clearInterval","left","total","controlled","styles","panel","title","detail","artifact","status","row","check","dot","live","track","min","fill","width","index","Number","Object","freeze","SessionPanel","sessionId","sendSessionFrame","subscribe","listener","subscription","store","unsubscribe","session","select","setError","setSubmitting","setDurationMs","requests","AbortController","controller","current","ReturnType","setTimeout","type","payload","action","poll","result","activationState","signal","ok","aborted","data","abort","clearTimeout","submit","approvedDurationMs","client","activate","body","confirmed","cancelActivation","duration","ComputerUsePanel","props","ComputerUseConfirmation","onConfirm","desktop","open","create","theme","gap","spacing","uni__dependencies","fontFamily","sans","fontSize","base","fontWeight","color","colors","hi","paddingBottom","borderBottomWidth","borderBottomColor","flexDirection","alignItems","height","borderRadius","backgroundColor","green","lineHeight","lineHeightRelaxed","flex","overflow","justifyContent","sm","dim","red","text","styles","computerUse","api","ToolMessageRenderProps","Badge","fontOf","MessageItemBody","MessageItemStatus","PoNativeTheme","StyleSheet","COMPUTER_ELEMENTS_PREVIEW","COMPUTER_LOGS_PREVIEW","COMPUTER_TOOL_COLLAPSED_LINES","ComputerElementView","ComputerFailureView","ComputerObservationView","ComputerResultView","ComputerRunView","computerResultHidden","computerResultView","computerResult","props","result","undefined","content","computerResultExpandable","view","isError","ComputerResultBody","expanded","toolName","output","running","testID","failure","kind","reason","lines","join","trim","outcomeUncertain","length","styles","stack","observation","run","sans","text","figure","strong","keep","applicationName","mono","faint","yield","bundleId","FailureBlock","done","completedActions","note","String","filter","Boolean","error","small","WindowLine","lead","windowTitle","dim","ElementRow","element","secure","role","includes","traits","enabled","row","label","ref","ObservationBlock","elements","shown","slice","hidden","chips","truncated","nextOffset","list","map","screenshotArtifact","RunBlock","figures","actions","observations","duration","logs","fields","field","key","value","line","index","TextLines","create","theme","gap","spacing","uni__dependencies","flexDirection","flexWrap","alignItems","minWidth","fontFamily","fontSize","base","lineHeight","sm","color","colors","fontWeight","semibold","red","flexShrink","maxWidth","marginLeft","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerActionCallParts","ComputerResultBody","computerResultExpandable","ComputerActionToolCard","props","toolName","args","running","isError","kind","target","expanded","styles","summary","undefined","sans","primary","length","detail","join","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","maxWidth","color","colors","text","dim","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerExecCallSummary","computerExecPathParts","ComputerResultBody","computerResultExpandable","ComputerExecToolCard","props","toolName","args","running","isError","path","expanded","styles","summary","folder","length","sans","primary","name","create","theme","flex","flexDirection","alignItems","minWidth","fontFamily","fontSize","base","lineHeight","uni__dependencies","flexShrink","color","colors","dim","maxWidth","text","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerStateCallSummary","ComputerResultBody","computerResultExpandable","ComputerStateToolCard","props","toolName","args","running","isError","expanded","styles","summary","sans","primary","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","color","colors","text","activityGroupComputerUse","channelComputerUse","fillComputerUse","toolComputerAction","toolComputerExec","toolComputerState"],"sources":["../../src/types/computerUseApi.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native.ts","../../src/types/apiRoutes.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/ComputerUsePanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerResultBody.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerActionToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerExecToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerStateToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { PoApiCaller } from '@agimon-ai/po-core/packageApi';\n\nexport const API_BASE_PATH = 'computer-use';\nexport const computerUseChannelType = 'computer_use_state';\nexport const COMPUTER_USE_MODE_ID = 'computer-use';\nexport const COMPUTER_USE_STATUS_KEY = 'po-computer-use';\nexport const COMPUTER_USE_MODE_STATUS_KEY = 'po-computer-use-mode';\nexport const COMPUTER_USE_MAX_DURATION_MS = 1_800 * 1_000;\nexport const COMPUTER_USE_DEFAULT_DURATION_MS = 300 * 1_000;\n/** The session lengths a person can pick when granting control, up to the maximum. */\nexport const COMPUTER_USE_DURATION_CHOICES_MS = [\n COMPUTER_USE_DEFAULT_DURATION_MS,\n 900_000,\n COMPUTER_USE_MAX_DURATION_MS,\n] as const;\nexport const COMPUTER_USE_CONFIRMATION_WINDOW_MS = 2 * 60 * 1_000;\n\n/**\n * Every path this API answers on, below its mount.\n *\n * The typed route table in `./apiRoutes` is built from this, the dispatcher\n * reads that table, and the hub channel addresses the broker with these same\n * strings, so a route cannot move on one side alone.\n */\nexport const COMPUTER_USE_ROUTES = {\n activate: '/activate',\n artifact: '/artifact',\n agentState: '/agent/state',\n agentObserve: '/agent/observe',\n agentAction: '/agent/action',\n agentStop: '/agent/stop',\n hubState: '/hub/state',\n hubActivation: '/hub/activation',\n hubAuthorization: '/hub/authorization',\n hubNext: '/hub/next',\n hubComplete: '/hub/complete',\n hubStop: '/hub/stop',\n} as const;\n\nexport const COMPUTER_USE_WAKE_LIMIT = 1_000_000;\n\nexport interface ComputerUseArtifactView {\n readonly artifactId: string;\n readonly status: 'ready' | 'failed';\n readonly sizeBytes?: number;\n readonly downloadUrl?: string;\n readonly previewUrl?: string;\n readonly actionCount?: number;\n readonly completedAt?: string;\n readonly failure?: { readonly code: string; readonly message: string };\n}\n\nexport interface ComputerUseSessionView {\n readonly sessionId: string;\n readonly revision: number;\n readonly wake: number;\n readonly phase: 'inactive' | 'awaiting_confirmation' | 'activating' | 'active' | 'stopping' | 'failed';\n readonly requestId?: string;\n readonly target?: Record<string, unknown>;\n readonly durationMs?: number;\n readonly expiresAt?: number;\n readonly failure?: { readonly code: string; readonly message: string };\n readonly artifact?: ComputerUseArtifactView;\n}\n\nexport interface ComputerUseActivationRequest {\n readonly requestId: string;\n readonly target?: Record<string, unknown>;\n readonly durationSeconds: number;\n readonly createdAt: number;\n readonly confirmationExpiresAt: number;\n /** Set by the session broker only after the person approves the in-app dialog. */\n readonly confirmedAt?: number;\n readonly caller: PoApiCaller;\n}\n\nexport interface ComputerUseBrokerRequest {\n readonly id: string;\n readonly operation: 'observe' | 'act';\n readonly payload?: unknown;\n readonly grantId: string;\n readonly sequence?: number;\n}\n\nexport interface ComputerUseChannelPayload {\n readonly state: ComputerUseSessionView;\n readonly targets: readonly Record<string, unknown>[];\n readonly busy?: true;\n}\n\nexport type ComputerUseBrowserCommand = { readonly action: 'status' | 'targets' | 'stop' | 'artifacts' };\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\n\nimport { COMPUTER_USE_STATUS_KEY } from '../../../../../types/computerUseApi';\n\n/** Remote clients request control from the Desktop host through their session Activity. */\nexport default defineActivityGroup({\n name: 'computer-use',\n keys: 'c e',\n order: 70,\n statusKey: COMPUTER_USE_STATUS_KEY,\n hideWhenEmpty: true,\n marksBackgroundWork: false,\n});\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { computerUseChannelType } from '../../../../../types/computerUseApi';\nimport type { ComputerUseChannelPayload, ComputerUseSessionView } from '../../../../../types/computerUseApi';\n\nexport interface ComputerUseSession extends ComputerUseChannelPayload {}\n\nconst initialState: ComputerUseSession = {\n state: { sessionId: '', revision: 0, wake: 0, phase: 'inactive' },\n targets: [],\n};\n\nexport const computerUse = defineSessionStore<ComputerUseSession>(initialState);\n\n/** Revision zero must hydrate the empty selector once; equal status polls then retain identity. */\nexport function updateComputerUseState(sessionId: string, state: ComputerUseSessionView) {\n computerUse.update(sessionId, (current) =>\n current.state.sessionId === '' || state.revision > current.state.revision ? { ...current, state } : current,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const computerUseChannel = computerUse.channel<ComputerUseChannelPayload>({\n channel: computerUseChannelType,\n parse(input) {\n if (!isRecord(input) || !isRecord(input.state) || !Array.isArray(input.targets)) return null;\n if (typeof input.state.phase !== 'string' || typeof input.state.revision !== 'number') return null;\n return input as unknown as ComputerUseChannelPayload;\n },\n reduce: (_current, payload) => payload,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { computerUseChannel } from '../_lib/computerUseStore.native';\n\nexport default defineChannelFile(computerUseChannel);\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\nimport { DESKTOP_PERMISSIONS_PATH, type DesktopPermissionStates } from './desktopPermissions';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/computer-use/`, so the\n * mount is stated once, by the folder that creates it.\n *\n * The paths come from `COMPUTER_USE_ROUTES` rather than being written out\n * again. That table already addressed the broker from the hub channel and from\n * the broker's own dispatcher, and a second copy here is exactly the\n * disagreement this file exists to prevent. The dispatcher now reads this\n * table, so the page, the broker and the hub all resolve one set of strings.\n *\n * Activation, status, cancellation and recording reads are reachable from a browser. The `/agent/` and `/hub/` routes\n * each demand a host-issued bearer token and answer 404 without one; they are\n * declared here because they are this API's surface, not because a page calls\n * them.\n */\nconst routes = {\n artifact: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.artifact,\n query: ['artifactId', 'offset'],\n raw: true,\n },\n activationState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n cancelActivation: {\n method: 'DELETE',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Answers whatever the admitted Desktop provider returned, which is runtime-defined JSON. */\n agentObserve: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentObserve,\n response: undefined as unknown as ApiResponseOf<unknown>,\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: undefined as unknown as ApiResponseOf<unknown>,\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Null until a reader has confirmed one; reading it moves the session to `activating`. */\n hubActivation: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubActivation,\n response: undefined as unknown as ApiResponseOf<ComputerUseActivationRequest | null>,\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: undefined as unknown as ApiResponseOf<{ readonly grantId: string; readonly expiresAt?: number } | null>,\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: undefined as unknown as ApiResponseOf<ComputerUseBrokerRequest | null>,\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Desktop's macOS permission states, served by the hub's `desktop-permissions` mount. */\n desktopPermissions: {\n method: 'GET',\n path: DESKTOP_PERMISSIONS_PATH,\n response: undefined as unknown as ApiResponseOf<DesktopPermissionStates>,\n },\n /** Asks macOS for the body's permission on the Mac running Desktop; answers the states after. */\n requestDesktopPermission: {\n method: 'POST',\n path: DESKTOP_PERMISSIONS_PATH,\n response: undefined as unknown as ApiResponseOf<DesktopPermissionStates>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, nativeApiTransport, sessionApiAddress } from '@agimon-ai/po-core/native';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'computer-use' at for the computer-use mount. */\nexport const computerUseScopes = ['session'] as const;\n\nexport const computerUse = createApiClient(routes, {\n scopes: computerUseScopes,\n basePath: 'computer-use',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\n/** Scopes the tree mounts 'desktop-permissions' at for the desktop-permissions mount. */\nexport const desktopPermissionsScopes = ['global', 'workspace', 'session'] as const;\n\nexport const desktopPermissions = createApiClient(routes, {\n scopes: desktopPermissionsScopes,\n basePath: 'desktop-permissions',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n CheckIcon,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n fontOf,\n SegmentedControl,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerUse as api } from '../../../../../../../generated/client.native';\nimport {\n COMPUTER_USE_DEFAULT_DURATION_MS,\n COMPUTER_USE_DURATION_CHOICES_MS,\n computerUseChannelType,\n} from '../../../../../../types/computerUseApi';\nimport type { ComputerUseSessionView } from '../../../../../../types/computerUseApi';\nimport { computerUse, updateComputerUseState } from '../../_lib/computerUseStore.native';\n\nfunction text(value: unknown, fallback: string): string {\n return typeof value === 'string' || typeof value === 'number' ? String(value) : fallback;\n}\n\nfunction remaining(ms: number): string {\n const seconds = Math.max(0, Math.ceil(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')} left`;\n}\n\nconst DURATION_OPTIONS = COMPUTER_USE_DURATION_CHOICES_MS.map((choice) => ({\n value: String(choice),\n label: `${choice / 60_000} min`,\n}));\nexport function ComputerUseView({\n state,\n targets = [],\n busy = false,\n error,\n submitting = false,\n durationMs = COMPUTER_USE_DEFAULT_DURATION_MS,\n onDurationChange,\n onActivate,\n onCancel,\n onStop,\n}: {\n state: ComputerUseSessionView;\n targets?: readonly Record<string, unknown>[];\n busy?: boolean;\n error?: string;\n submitting?: boolean;\n durationMs?: number;\n onDurationChange?: (durationMs: number) => void;\n onActivate: (target: Record<string, unknown>, durationMs: number) => void;\n onCancel: () => void;\n onStop: () => void;\n}) {\n const [selected, setSelected] = useState(0);\n const [confirmation, setConfirmation] = useState<{ target: Record<string, unknown>; durationMs: number }>();\n const choices = [\n { label: 'Whole desktop', target: { scope: 'desktop' } },\n ...targets.map((target) => ({\n label: `${text(target.applicationName, 'Application')}: ${text(target.windowTitle, text(target.windowId, 'Window'))}`,\n target,\n })),\n ];\n const chosen = choices[selected] ?? choices[0]!;\n const pending = state.phase === 'awaiting_confirmation' || state.phase === 'activating';\n const active = state.phase === 'active' || state.phase === 'stopping';\n const failure = error ?? state.failure?.message;\n const expiresAt = state.phase === 'active' ? state.expiresAt : undefined;\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (expiresAt === undefined) return;\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [expiresAt]);\n const left = expiresAt === undefined ? undefined : expiresAt - now;\n const total = state.durationMs ?? COMPUTER_USE_DEFAULT_DURATION_MS;\n const controlled =\n state.target?.scope === 'desktop'\n ? 'your whole desktop'\n : typeof state.target?.applicationName === 'string'\n ? state.target.applicationName\n : 'the chosen window';\n return (\n <View style={styles.panel}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Computer use\n </Text>\n {busy ? <Text style={styles.detail}>Computer use is busy in another session.</Text> : null}\n {failure ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {failure}\n </Text>\n ) : null}\n {state.artifact?.status === 'ready' ? (\n <View style={styles.row}>\n <View style={styles.check}>\n <CheckIcon size={12} color=\"rail\" />\n </View>\n <Text style={styles.text}>Recording saved to session artifacts.</Text>\n </View>\n ) : null}\n {state.artifact?.failure ? <Text style={styles.error}>{state.artifact.failure.message}</Text> : null}\n {pending ? (\n <>\n <Text style={styles.text}>Desktop activation is pending.</Text>\n <Button variant=\"outline\" disabled={submitting} onPress={onCancel}>\n Cancel activation\n </Button>\n </>\n ) : active ? (\n <>\n <View style={styles.row} accessibilityLiveRegion=\"polite\">\n <View style={styles.dot} />\n <Text style={styles.live}>\n {state.phase === 'stopping' ? 'Po is handing control back' : `Po is controlling ${controlled}`}\n </Text>\n </View>\n {left === undefined ? null : (\n <View style={styles.row}>\n <View\n style={styles.track}\n accessibilityRole=\"progressbar\"\n accessibilityLabel=\"Time left\"\n accessibilityValue={{ min: 0, max: total, now: Math.max(0, left) }}\n >\n <View style={[styles.fill, { width: `${Math.min(100, Math.max(0, (left / total) * 100))}%` }]} />\n </View>\n <Text style={styles.detail}>{remaining(left)}</Text>\n </View>\n )}\n <Button variant=\"outline\" disabled={submitting || state.phase === 'stopping'} onPress={onStop}>\n Stop computer use\n </Button>\n </>\n ) : (\n <>\n <Text style={styles.detail}>Po asks before it takes control. You can stop at any time.</Text>\n <DropdownMenu>\n <DropdownMenuTrigger\n variant=\"outline\"\n disabled={busy || submitting}\n accessibilityLabel=\"What Po may control\"\n >\n {chosen.label}\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {choices.map((choice, index) => (\n <DropdownMenuItem key={`${index}:${choice.label}`} onSelect={() => setSelected(index)}>\n {choice.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {onDurationChange ? (\n <SegmentedControl\n accessibilityLabel=\"For how long\"\n options={DURATION_OPTIONS}\n value={String(durationMs)}\n disabled={busy || submitting}\n onValueChange={(value) => onDurationChange(Number(value))}\n />\n ) : null}\n <Button\n variant=\"primary\"\n disabled={busy || submitting}\n onPress={() => setConfirmation({ target: Object.freeze({ ...chosen.target }), durationMs })}\n >\n Request activation\n </Button>\n </>\n )}\n {confirmation ? (\n <ComputerUseConfirmation\n target={confirmation.target}\n durationMs={confirmation.durationMs}\n onCancel={() => setConfirmation(undefined)}\n onConfirm={() => {\n setConfirmation(undefined);\n onActivate(confirmation.target, confirmation.durationMs);\n }}\n />\n ) : null}\n </View>\n );\n}\n\nfunction SessionPanel({ sessionId, sendSessionFrame }: WebPluginSlotProps & { sessionId: string }) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = computerUse.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n // Native plugins may not import @tanstack/react-store; it is not a native host module.\n const session = useSyncExternalStore(subscribe, () => computerUse.select(computerUse.store.state, sessionId));\n const [error, setError] = useState<string>();\n const [submitting, setSubmitting] = useState(false);\n const [durationMs, setDurationMs] = useState<number>(COMPUTER_USE_DEFAULT_DURATION_MS);\n const requests = useRef<AbortController | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n requests.current = controller;\n let timer: ReturnType<typeof setTimeout> | undefined;\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'status' } });\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'targets' } });\n const poll = async () => {\n try {\n const result = await api.session(sessionId).activationState({ signal: controller.signal });\n if (result.ok && !controller.signal.aborted) updateComputerUseState(sessionId, result.data);\n } catch {\n if (!controller.signal.aborted) setError('The session is unreachable.');\n }\n if (!controller.signal.aborted) timer = setTimeout(() => void poll(), 2000);\n };\n void poll();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [sessionId, sendSessionFrame]);\n\n const submit = async (\n action: 'activate' | 'cancel',\n target?: Record<string, unknown>,\n approvedDurationMs = durationMs,\n ) => {\n const signal = requests.current?.signal;\n if (!signal || signal.aborted || submitting) return;\n setError(undefined);\n setSubmitting(true);\n try {\n const client = api.session(sessionId);\n const result =\n action === 'activate'\n ? await client.activate({ body: { target, durationMs: approvedDurationMs, confirmed: true }, signal })\n : await client.cancelActivation({ signal });\n if (signal.aborted) return;\n if (result.ok) updateComputerUseState(sessionId, result.data);\n else\n setError(\n result.status === 0 ? 'The session is unreachable.' : result.error || 'The activation request failed.',\n );\n } catch {\n if (!signal.aborted) setError('The activation request is unavailable.');\n } finally {\n if (!signal.aborted) setSubmitting(false);\n }\n };\n\n return (\n <ComputerUseView\n state={session.state}\n targets={session.targets}\n busy={session.busy}\n error={error}\n submitting={submitting}\n durationMs={durationMs}\n onDurationChange={setDurationMs}\n onActivate={(target, duration) => void submit('activate', target, duration)}\n onCancel={() => void submit('cancel')}\n onStop={() => {\n setError(undefined);\n try {\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'stop' } });\n } catch {\n setError('The stop request is unavailable.');\n }\n }}\n />\n );\n}\n\nexport function ComputerUsePanel(props: WebPluginSlotProps) {\n return props.sessionId === null ? (\n <Text style={styles.detail}>Select a session.</Text>\n ) : (\n <SessionPanel key={props.sessionId} {...props} sessionId={props.sessionId} />\n );\n}\n\nexport function ComputerUseConfirmation({\n target,\n durationMs,\n onConfirm,\n onCancel,\n}: {\n target: Record<string, unknown>;\n durationMs: number;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n const desktop = target.scope === 'desktop';\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onCancel();\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Allow Po to control {desktop ? 'your whole desktop' : 'this window'}?</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n {desktop\n ? 'Every app window on the main display, except Po and system security windows.'\n : `${text(target.applicationName, 'Application')}: ${text(target.windowTitle, text(target.windowId, 'Window'))}`}\n </DialogDescription>\n <Text style={styles.text}>For {durationMs / 60_000} minutes. You can stop at any time.</Text>\n <Text style={styles.detail}>\n Po records {desktop ? 'the main display' : 'this window'}, system sound and microphone audio when permission\n is granted.\n </Text>\n <Text style={styles.detail}>Only this session and its approved device receive control.</Text>\n <DialogFooter>\n <Button variant=\"outline\" onPress={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" onPress={onConfirm}>\n Allow control\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n panel: { gap: theme.spacing(3) },\n title: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.colors.hi,\n paddingBottom: theme.spacing(2),\n borderBottomWidth: 1,\n borderBottomColor: theme.colors['border-soft'],\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n dot: { width: 8, height: 8, borderRadius: 4, backgroundColor: theme.colors.green },\n live: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.green,\n },\n track: { flex: 1, height: 6, borderRadius: 3, overflow: 'hidden', backgroundColor: theme.colors['border-soft'] },\n fill: { height: '100%', borderRadius: 3, backgroundColor: theme.colors.green },\n check: {\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.green,\n },\n text: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.text,\n },\n detail: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.red,\n },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { ComputerUsePanel } from './_components/ComputerUsePanel.native';\n\nexport default defineFill({ id: 'computer-use', slot: 'activity.computer-use', component: ComputerUsePanel });\n","// Imports nothing at runtime: the web and native cards share it, and the native\n// bundle may not load the web contract.\n\n/** Lines a computer tool card shows before it expands, on web and native alike. */\nexport const COMPUTER_TOOL_COLLAPSED_LINES = 8;\n/** Elements of an observation the native card lists before it expands. */\nexport const COMPUTER_ELEMENTS_PREVIEW = 5;\n/** Script log lines the native card lists before it expands. */\nexport const COMPUTER_LOGS_PREVIEW = 3;\n\nconst MS_PER_SECOND = 1000;\n\n/** The computer_state call's summary: it always observes the one authorized window. */\nexport function computerStateCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return 'authorized window';\n}\n\n/**\n * The computer_action call as its two pieces: the action kind first, the element\n * it targets second. Either may be missing; the empty ones are dropped.\n */\nexport function computerActionCallParts(args: Readonly<Record<string, unknown>>): readonly string[] {\n const kind = typeof args.kind === 'string' ? args.kind : '';\n const ref = typeof args.elementRef === 'string' ? args.elementRef : '';\n return [kind, ref].filter(Boolean);\n}\n\n/** The computer_exec call's summary: the script it ran. */\nexport function computerExecCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.scriptPath === 'string' ? args.scriptPath : '';\n}\n\n/**\n * The script path as its folder and its file name, so a phone header can let the\n * folder truncate while the script name stays whole.\n */\nexport function computerExecPathParts(path: string): { readonly folder: string; readonly name: string } {\n const cut = path.lastIndexOf('/');\n return cut < 0 ? { folder: '', name: path } : { folder: path.slice(0, cut + 1), name: path.slice(cut + 1) };\n}\n\nexport interface ComputerElementView {\n readonly ref: string;\n /** The accessibility role in words: `AXTextField` reads `text field`. */\n readonly role: string;\n /** The label, else the value, else empty. */\n readonly label: string;\n readonly enabled: boolean;\n readonly secure: boolean;\n}\n\nexport interface ComputerObservationView {\n readonly applicationName: string;\n readonly windowTitle: string;\n readonly elements: readonly ComputerElementView[];\n /** The next page's offset when more elements exist than this page holds. */\n readonly nextOffset?: number;\n readonly truncated: boolean;\n readonly screenshotArtifact?: string;\n}\n\nexport interface ComputerFieldView {\n readonly key: string;\n readonly value: string;\n}\n\nexport interface ComputerRunView {\n /** The script's return value as short key and value pairs, never raw JSON. */\n readonly fields: readonly ComputerFieldView[];\n readonly logs: readonly string[];\n readonly actions?: number;\n readonly observations?: number;\n /** `3.4s`, from the run's metrics. */\n readonly duration?: string;\n readonly observation?: ComputerObservationView;\n}\n\nexport interface ComputerFailureView {\n readonly reason: string;\n /** Actions that finished before the run stopped, so the agent does not replay them. */\n readonly completedActions?: number;\n readonly outcomeUncertain: boolean;\n}\n\n/** What a computer tool result says, parsed and validated; `text` only when it is not JSON the card knows. */\nexport type ComputerResultView =\n | { readonly kind: 'observation'; readonly observation: ComputerObservationView }\n | { readonly kind: 'run'; readonly run: ComputerRunView }\n | { readonly kind: 'applied' }\n | { readonly kind: 'launched'; readonly applicationName: string; readonly bundleId: string }\n | { readonly kind: 'failure'; readonly failure: ComputerFailureView }\n | { readonly kind: 'text'; readonly lines: readonly string[] };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value : '');\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n\n/** The result's text blocks joined; images (the screenshot) are dropped, as the web cards drop them. */\nexport function computerResultText(content: readonly unknown[]): string {\n return content\n .flatMap((block) => {\n const entry = record(block);\n return entry?.type === 'text' && typeof entry.text === 'string' ? [entry.text] : [];\n })\n .join('\\n');\n}\n\n/** `AXTextField` as `text field`; a role without the AX prefix is kept as it came. */\nexport function computerRoleWords(role: string): string {\n if (!role.startsWith('AX')) return role;\n return role\n .slice(2)\n .replace(/([a-z])([A-Z])/gu, '$1 $2')\n .toLowerCase();\n}\n\nfunction element(value: unknown): ComputerElementView[] {\n const entry = record(value);\n if (entry === undefined || typeof entry.ref !== 'string') return [];\n return [\n {\n ref: entry.ref,\n role: computerRoleWords(text(entry.role)),\n label: text(entry.label) || text(entry.value),\n enabled: entry.enabled !== false,\n secure: entry.secure === true,\n },\n ];\n}\n\n/** An observation when the value is one: an application name and an element list. */\nexport function computerObservationView(value: unknown): ComputerObservationView | undefined {\n const entry = record(value);\n if (entry === undefined || typeof entry.applicationName !== 'string' || !Array.isArray(entry.elements))\n return undefined;\n const nextOffset = count(entry.nextOffset);\n const artifact = text(entry.screenshotArtifact);\n return {\n applicationName: entry.applicationName,\n windowTitle: text(entry.windowTitle),\n elements: entry.elements.flatMap(element),\n truncated: entry.truncated === true || nextOffset !== undefined,\n ...(nextOffset === undefined ? {} : { nextOffset }),\n ...(artifact.length > 0 ? { screenshotArtifact: artifact } : {}),\n };\n}\n\n/** One value of a script result as a short phrase: scalars as they read, collections by their size. */\nfunction phrase(value: unknown): string {\n if (value === null || value === undefined) return 'none';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${String(value.length)} item${value.length === 1 ? '' : 's'}`;\n const size = Object.keys(value as object).length;\n return `${String(size)} field${size === 1 ? '' : 's'}`;\n}\n\n/** A script's return value as fields: an object's own keys, or one `result` field for anything else. */\nexport function computerResultFields(value: unknown): ComputerFieldView[] {\n if (value === undefined) return [];\n const entry = record(value);\n if (entry === undefined) return [{ key: 'result', value: phrase(value) }];\n return Object.entries(entry).map(([key, field]) => ({ key, value: phrase(field) }));\n}\n\nfunction run(entry: Record<string, unknown>): ComputerRunView | undefined {\n if (!Array.isArray(entry.logs)) return undefined;\n const observation = computerObservationView(entry.observation);\n const metrics = record(entry.metrics);\n const actions = count(metrics?.actions);\n const observations = count(metrics?.observations);\n const durationMs = count(metrics?.durationMs);\n return {\n fields: computerResultFields(entry.result),\n logs: entry.logs.filter((line): line is string => typeof line === 'string'),\n ...(actions === undefined ? {} : { actions }),\n ...(observations === undefined ? {} : { observations }),\n ...(durationMs === undefined ? {} : { duration: `${(durationMs / MS_PER_SECOND).toFixed(1)}s` }),\n ...(observation === undefined ? {} : { observation }),\n };\n}\n\nfunction failure(entry: Record<string, unknown>): ComputerFailureView | undefined {\n if (typeof entry.error !== 'string') return undefined;\n const completedActions = count(entry.completedActions);\n return {\n reason: entry.error,\n ...(completedActions === undefined ? {} : { completedActions }),\n outcomeUncertain: entry.outcomeUncertain === true,\n };\n}\n\n/** The text as lines a card can count: CRLF folded, tabs widened, trailing blank lines dropped. */\nfunction lines(value: string): string[] {\n if (value.length === 0) return [];\n const split = value.replaceAll('\\r\\n', '\\n').replaceAll('\\t', ' ').split('\\n');\n while (split.length > 0 && split.at(-1)?.trim() === '') split.pop();\n return split;\n}\n\n/**\n * A computer tool result as the card lays it out. The tools answer in JSON (an\n * observation, an action's outcome, a script run, a script failure) or in a\n * plain sentence when they fail early; anything that does not parse as a shape\n * the card knows falls back to its text lines.\n */\nexport function computerResultView(content: readonly unknown[]): ComputerResultView {\n const raw = computerResultText(content);\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { kind: 'text', lines: lines(raw) };\n }\n const entry = record(parsed);\n const observation = computerObservationView(parsed);\n if (observation !== undefined) return { kind: 'observation', observation };\n const ran = entry === undefined ? undefined : run(entry);\n if (ran !== undefined) return { kind: 'run', run: ran };\n const failed = entry === undefined ? undefined : failure(entry);\n if (failed !== undefined) return { kind: 'failure', failure: failed };\n if (entry?.launched === true && typeof entry.applicationName === 'string')\n return { kind: 'launched', applicationName: entry.applicationName, bundleId: text(entry.bundleId) };\n if (entry?.applied === true) return { kind: 'applied' };\n return { kind: 'text', lines: lines(raw) };\n}\n\n/** How many rows the view holds back while collapsed, so the card offers expand only when it reveals something. */\nexport function computerResultHidden(view: ComputerResultView): number {\n switch (view.kind) {\n case 'observation':\n return Math.max(0, view.observation.elements.length - COMPUTER_ELEMENTS_PREVIEW);\n case 'run':\n return Math.max(0, view.run.logs.length - COMPUTER_LOGS_PREVIEW);\n case 'text':\n return Math.max(0, view.lines.length - COMPUTER_TOOL_COLLAPSED_LINES);\n default:\n return 0;\n }\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { Badge, fontOf, MessageItemBody, MessageItemStatus } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n COMPUTER_ELEMENTS_PREVIEW,\n COMPUTER_LOGS_PREVIEW,\n COMPUTER_TOOL_COLLAPSED_LINES,\n type ComputerElementView,\n type ComputerFailureView,\n type ComputerObservationView,\n type ComputerResultView,\n type ComputerRunView,\n computerResultHidden,\n computerResultView,\n} from '../_lib/computerToolView';\n\n/** The parsed result, or none before the tool answers. */\nexport function computerResult(props: ToolMessageRenderProps): ComputerResultView | undefined {\n return props.result === null ? undefined : computerResultView(props.result.content);\n}\n\n/** Whether the card has rows to reveal: the header offers expand only then, and never on a failure. */\nexport function computerResultExpandable(props: ToolMessageRenderProps): boolean {\n const view = computerResult(props);\n return !props.isError && view !== undefined && computerResultHidden(view) > 0;\n}\n\n/**\n * The body the three computer tool cards share on native. The web cards print\n * the result's text; the tools answer in JSON, so this lays the parsed result\n * out instead: the window and its elements, a script's figures and logs, an\n * action's outcome. A preview shows while collapsed, as the web's first lines\n * do. A failure shows only its reason in red, with a quiet note of any actions\n * that already ran; the header's edge and outcome already say it failed.\n */\nexport function ComputerResultBody({ props, expanded }: { props: ToolMessageRenderProps; expanded: boolean }) {\n const { toolName, output, running, isError } = props;\n const view = computerResult(props);\n const testID = `tool-result-${toolName}`;\n if (isError) {\n const failure: ComputerFailureView =\n view?.kind === 'failure'\n ? view.failure\n : { reason: view?.kind === 'text' ? view.lines.join('\\n') : output.trim(), outcomeUncertain: false };\n return failure.reason.length === 0 ? null : (\n <MessageItemBody testID={testID}>\n <FailureBlock failure={failure} />\n </MessageItemBody>\n );\n }\n if (view === undefined) {\n return running ? (\n <MessageItemBody testID={testID}>\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null;\n }\n if (view.kind === 'text' && view.lines.length === 0) return null;\n return (\n <MessageItemBody testID={testID}>\n <View style={styles.stack}>\n {view.kind === 'observation' ? <ObservationBlock observation={view.observation} expanded={expanded} /> : null}\n {view.kind === 'run' ? <RunBlock run={view.run} expanded={expanded} /> : null}\n {view.kind === 'applied' ? <Text style={[styles.sans, styles.text]}>Applied to the element.</Text> : null}\n {view.kind === 'launched' ? (\n <View style={styles.figure}>\n <Text numberOfLines={1} style={[styles.sans, styles.strong, styles.keep]}>\n Opened {view.applicationName}\n </Text>\n <Text numberOfLines={1} style={[styles.mono, styles.faint, styles.yield]}>\n {view.bundleId}\n </Text>\n </View>\n ) : null}\n {view.kind === 'text' ? <TextLines lines={view.lines} expanded={expanded} /> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n </View>\n </MessageItemBody>\n );\n}\n\nfunction FailureBlock({ failure }: { failure: ComputerFailureView }) {\n const done = failure.completedActions;\n const note = [\n done === undefined ? '' : `${String(done)} action${done === 1 ? '' : 's'} already ran`,\n failure.outcomeUncertain ? 'the last outcome is uncertain' : '',\n ].filter(Boolean);\n return (\n <View style={styles.stack}>\n <Text selectable style={[styles.sans, styles.error]}>\n {failure.reason}\n </Text>\n {note.length > 0 ? <Text style={[styles.small, styles.faint]}>{note.join(', ')}.</Text> : null}\n </View>\n );\n}\n\nfunction WindowLine({ observation, lead }: { observation: ComputerObservationView; lead?: string }) {\n return (\n <View style={styles.figure}>\n <Text numberOfLines={1} style={[styles.sans, styles.strong, styles.keep]}>\n {lead === undefined ? '' : `${lead} `}\n {observation.applicationName}\n </Text>\n {observation.windowTitle.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.dim, styles.yield]}>\n {observation.windowTitle}\n </Text>\n ) : null}\n </View>\n );\n}\n\nfunction ElementRow({ element }: { element: ComputerElementView }) {\n // A secure field's role already says so (`secure text field`); the flag is named only when it does not.\n const secure = element.secure && !element.role.includes('secure');\n const traits = [element.role, element.enabled ? '' : 'disabled', secure ? 'secure' : ''].filter(Boolean);\n return (\n <View style={styles.row} accessibilityLabel={`${element.label} ${traits.join(' ')} ${element.ref}`}>\n <Text numberOfLines={1} style={[styles.sans, element.enabled ? styles.text : styles.faint, styles.yield]}>\n {element.label.length > 0 ? element.label : element.role}\n </Text>\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.keep]}>\n {traits.join(' · ')}\n </Text>\n <Text numberOfLines={1} style={[styles.mono, styles.faint, styles.ref]}>\n {element.ref}\n </Text>\n </View>\n );\n}\n\nfunction ObservationBlock({ observation, expanded }: { observation: ComputerObservationView; expanded: boolean }) {\n const { elements } = observation;\n const shown = expanded ? elements : elements.slice(0, COMPUTER_ELEMENTS_PREVIEW);\n const hidden = elements.length - shown.length;\n return (\n <>\n <WindowLine observation={observation} />\n <View style={styles.chips}>\n <Badge size=\"xs\">{`${String(elements.length)} element${elements.length === 1 ? '' : 's'}`}</Badge>\n {observation.truncated ? (\n <Badge size=\"xs\" tone=\"yellow\">\n {observation.nextOffset === undefined\n ? 'more not shown'\n : `more from offset ${String(observation.nextOffset)}`}\n </Badge>\n ) : null}\n </View>\n {shown.length > 0 ? (\n <View style={styles.list}>\n {shown.map((element) => (\n <ElementRow key={element.ref} element={element} />\n ))}\n </View>\n ) : null}\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more elements</MessageItemStatus> : null}\n {observation.screenshotArtifact === undefined ? null : (\n <Text numberOfLines={2} style={[styles.small, styles.faint]}>\n Screenshot saved to {observation.screenshotArtifact}\n </Text>\n )}\n </>\n );\n}\n\nfunction RunBlock({ run, expanded }: { run: ComputerRunView; expanded: boolean }) {\n const figures = [\n run.actions === undefined ? '' : `${String(run.actions)} action${run.actions === 1 ? '' : 's'}`,\n run.observations === undefined ? '' : `${String(run.observations)} observation${run.observations === 1 ? '' : 's'}`,\n run.duration ?? '',\n ].filter(Boolean);\n const logs = expanded ? run.logs : run.logs.slice(0, COMPUTER_LOGS_PREVIEW);\n const hidden = run.logs.length - logs.length;\n return (\n <>\n {figures.length > 0 ? (\n <View style={styles.chips}>\n {figures.map((figure) => (\n <Badge key={figure} size=\"xs\">\n {figure}\n </Badge>\n ))}\n </View>\n ) : null}\n {run.fields.length > 0 ? (\n <View style={styles.list}>\n {run.fields.map((field) => (\n <View key={field.key} style={styles.row}>\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.key]}>\n {field.key}\n </Text>\n <Text numberOfLines={1} selectable style={[styles.sans, styles.text, styles.yield]}>\n {field.value}\n </Text>\n </View>\n ))}\n </View>\n ) : null}\n {logs.length > 0 ? (\n <View style={styles.list}>\n {logs.map((line, index) => (\n <Text key={`${String(index)}-${line}`} numberOfLines={1} selectable style={[styles.mono, styles.dim]}>\n {line}\n </Text>\n ))}\n </View>\n ) : null}\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more log lines</MessageItemStatus> : null}\n {run.observation === undefined ? null : <WindowLine observation={run.observation} lead=\"Ended on\" />}\n </>\n );\n}\n\nfunction TextLines({ lines, expanded }: { lines: readonly string[]; expanded: boolean }) {\n const shown = expanded ? lines : lines.slice(0, COMPUTER_TOOL_COLLAPSED_LINES);\n const hidden = lines.length - shown.length;\n return (\n <>\n <View style={styles.list}>\n {shown.map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={[styles.sans, styles.dim]}>\n {line}\n </Text>\n ))}\n </View>\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more line(s)</MessageItemStatus> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n stack: { gap: theme.spacing(2) },\n list: { gap: theme.spacing(1) },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(1.5) },\n figure: { flexDirection: 'row', alignItems: 'baseline', gap: theme.spacing(2), minWidth: 0 },\n row: { flexDirection: 'row', alignItems: 'baseline', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n strong: { color: theme.colors.text, fontWeight: theme.fontWeight.semibold },\n text: { color: theme.colors.text },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n error: { color: theme.colors.red },\n // The primary piece stays whole up to most of the row; the secondary detail truncates first.\n keep: { flexShrink: 0, maxWidth: '60%' },\n yield: { flexShrink: 1, minWidth: 0 },\n key: { flexShrink: 0, maxWidth: '40%' },\n ref: { flexShrink: 0, marginLeft: 'auto' },\n}));\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerActionCallParts } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_action tool's timeline item on native, as the web's: the action\n * and the element it targets in the header, the outcome's first lines beneath.\n */\nexport function ComputerActionToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n const [kind, ...target] = computerActionCallParts(args);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {kind === undefined ? null : (\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {kind}\n </Text>\n )}\n {target.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.detail]}>\n {target.join(' ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n // The action is what Po did, so it stays whole; the element it targeted yields first.\n primary: { flexShrink: 0, maxWidth: '45%', color: theme.colors.text },\n detail: { flexShrink: 1, color: theme.colors.dim },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerActionToolCard } from './_components/ComputerActionToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_action'], message: ComputerActionToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerExecCallSummary, computerExecPathParts } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_exec tool's timeline item on native, as the web's: the script\n * path in the header, the run's first lines beneath it.\n */\nexport function ComputerExecToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n const path = computerExecPathParts(computerExecCallSummary(args));\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {/* A long path loses its folder first, so the script name stays readable. */}\n {path.folder.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.folder]}>\n {path.folder}\n </Text>\n ) : null}\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {path.name}\n </Text>\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n folder: { flexShrink: 1, minWidth: 0, color: theme.colors.dim },\n primary: { flexShrink: 0, maxWidth: '100%', color: theme.colors.text },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerExecToolCard } from './_components/ComputerExecToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_exec'], message: ComputerExecToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerStateCallSummary } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_state tool's timeline item on native, as the web's: the observed\n * window in the header, the observation's first lines beneath it.\n */\nexport function ComputerStateToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {computerStateCallSummary(args)}\n </Text>\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 1, color: theme.colors.text },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerStateToolCard } from './_components/ComputerStateToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_state'], message: ComputerStateToolCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport activityGroupComputerUse from '../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native';\nimport channelComputerUse from '../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native';\nimport fillComputerUse from '../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.native';\nimport toolComputerAction from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.native';\nimport toolComputerExec from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.native';\nimport toolComputerState from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.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: 'computer-use',\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'computer-use' }, activityGroupComputerUse)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'computer_use' }, channelComputerUse)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.computer-use', id: 'computer-use' }, fillComputerUse)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['computer_action'] }, toolComputerAction), via({ tools: ['computer_exec'] }, toolComputerExec), via({ tools: ['computer_state'] }, toolComputerState)]; },\n },\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"native.mjs","names":["Badge","Button","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","fontOf","Panel","PoNativeTheme","StyleSheet","DESKTOP_PERMISSIONS","DesktopPermission","DesktopPermissionState","DesktopPermissionsViewState","COPY","Record","title","detail","accessibility","microphone","automation","LABEL","granted","denied","DesktopPermissionsView","state","remote","onAsk","onRefresh","permission","styles","page","sectionHead","sectionText","sectionTitle","status","asking","undefined","control","card","map","index","value","states","action","row","divider","rowHeading","rowTitle","error","create","theme","gap","spacing","uni__dependencies","flexDirection","alignItems","flex","minWidth","fontFamily","sans","fontSize","lg","lineHeight","fontWeight","semibold","color","colors","hi","sm","lineHeightRelaxed","dim","padding","overflow","flexWrap","base","flexShrink","borderTopWidth","hairlineWidth","borderTopColor","minHeight","alignSelf","styles","SettingsPanelProps","useCallback","useEffect","useRef","useState","AppState","DesktopPermission","readDesktopPermissions","DesktopPermissionsViewState","DesktopPermissionsView","DesktopPermissionsPanel","request","requestWithStepUp","state","setState","status","generation","busy","run","permission","current","version","undefined","asking","next","subscription","addEventListener","remove","computerUse","WebPluginSlotProps","Button","CheckIcon","Dialog","DialogBody","DialogContent","DialogDescription","DialogFooter","DialogHeader","DialogTitle","DropdownMenu","DropdownMenuContent","DropdownMenuItem","DropdownMenuTrigger","fontOf","SegmentedControl","PoNativeTheme","useCallback","useEffect","useRef","useState","useSyncExternalStore","StyleSheet","computerUse","api","COMPUTER_USE_DEFAULT_DURATION_MS","COMPUTER_USE_DURATION_CHOICES_MS","computerUseChannelType","ComputerUseSessionView","updateComputerUseState","text","value","fallback","String","remaining","ms","seconds","Math","max","ceil","floor","padStart","DURATION_OPTIONS","map","choice","label","ComputerUseView","state","targets","busy","error","submitting","durationMs","onDurationChange","onRefreshTargets","onActivate","onCancel","onStop","Record","target","selected","setSelected","confirmation","setConfirmation","choices","scope","applicationName","windowTitle","windowId","chosen","pending","phase","active","failure","message","expiresAt","undefined","now","setNow","Date","timer","setInterval","clearInterval","left","total","controlled","styles","panel","header","title","detail","artifact","status","row","check","dot","live","track","min","fill","width","index","Number","Object","freeze","SessionPanel","sessionId","sendSessionFrame","subscribe","listener","subscription","store","unsubscribe","session","select","setError","setSubmitting","setDurationMs","requests","AbortController","controller","current","ReturnType","setTimeout","type","payload","action","poll","result","activationState","signal","ok","aborted","data","abort","clearTimeout","submit","approvedDurationMs","client","activate","body","confirmed","cancelActivation","duration","ComputerUsePanel","props","ComputerUseConfirmation","onConfirm","desktop","open","create","theme","gap","spacing","uni__dependencies","flexDirection","alignItems","paddingBottom","borderBottomWidth","borderBottomColor","colors","flex","fontFamily","sans","fontSize","base","fontWeight","color","hi","height","borderRadius","backgroundColor","green","lineHeight","lineHeightRelaxed","overflow","justifyContent","sm","dim","red","text","styles","computerUse","api","ToolMessageRenderProps","Badge","fontOf","MessageItemBody","MessageItemStatus","PoNativeTheme","StyleSheet","COMPUTER_ELEMENTS_PREVIEW","COMPUTER_LOGS_PREVIEW","COMPUTER_TOOL_COLLAPSED_LINES","ComputerElementView","ComputerFailureView","ComputerObservationView","ComputerResultView","ComputerRunView","computerResultHidden","computerResultView","computerResult","props","result","undefined","content","computerResultExpandable","view","isError","ComputerResultBody","expanded","toolName","output","running","testID","failure","kind","reason","lines","join","trim","outcomeUncertain","length","styles","stack","observation","run","sans","text","figure","strong","keep","applicationName","mono","faint","yield","bundleId","FailureBlock","done","completedActions","note","String","filter","Boolean","error","small","WindowLine","lead","windowTitle","dim","ElementRow","element","secure","role","includes","traits","enabled","row","label","ref","ObservationBlock","elements","shown","slice","hidden","chips","truncated","nextOffset","list","map","screenshotArtifact","RunBlock","figures","actions","observations","duration","logs","fields","field","key","value","line","index","TextLines","create","theme","gap","spacing","uni__dependencies","flexDirection","flexWrap","alignItems","minWidth","fontFamily","fontSize","base","lineHeight","sm","color","colors","fontWeight","semibold","red","flexShrink","maxWidth","marginLeft","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerActionCallParts","ComputerResultBody","computerResultExpandable","ComputerActionToolCard","props","toolName","args","running","isError","kind","target","expanded","styles","summary","undefined","sans","primary","length","detail","join","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","maxWidth","color","colors","text","dim","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerExecCallSummary","computerExecPathParts","ComputerResultBody","computerResultExpandable","ComputerExecToolCard","props","toolName","args","running","isError","path","expanded","styles","summary","folder","length","sans","primary","name","create","theme","flex","flexDirection","alignItems","minWidth","fontFamily","fontSize","base","lineHeight","uni__dependencies","flexShrink","color","colors","dim","maxWidth","text","styles","ToolMessageRenderProps","fontOf","MessageItem","MessageItemHeader","toolTone","PoNativeTheme","StyleSheet","computerStateCallSummary","ComputerResultBody","computerResultExpandable","ComputerStateToolCard","props","toolName","args","running","isError","expanded","styles","summary","sans","primary","create","theme","flex","flexDirection","alignItems","gap","spacing","minWidth","uni__dependencies","fontFamily","fontSize","base","lineHeight","flexShrink","color","colors","text","settingDesktopPermissions","activityGroupComputerUse","channelComputerUse","fillComputerUse","toolComputerAction","toolComputerExec","toolComputerState"],"sources":["../../src/types/computerUseApi.ts","../../src/types/desktopPermissions.ts","../../src/types/apiRoutes.ts","../../src/extensions/(frontend)/setting/_lib/desktopPermissions.native.ts","../../src/extensions/(frontend)/setting/_components/DesktopPermissionsView.native.tsx","../../src/extensions/(frontend)/setting/_components/DesktopPermissionsPanel.native.tsx","../../src/extensions/(frontend)/setting/desktop-permissions.panel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseStore.native.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native.ts","../../generated/client.native.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/ComputerUsePanel.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerToolView.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerResultBody.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerActionToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerExecToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerStateToolCard.native.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.native.tsx","../../generated/native.ts"],"sourcesContent":["import type { PoApiCaller } from '@agimon-ai/po-core/packageApi';\n\nexport const API_BASE_PATH = 'computer-use';\nexport const computerUseChannelType = 'computer_use_state';\nexport const COMPUTER_USE_MODE_ID = 'computer-use';\nexport const COMPUTER_USE_STATUS_KEY = 'po-computer-use';\nexport const COMPUTER_USE_MODE_STATUS_KEY = 'po-computer-use-mode';\nexport const COMPUTER_USE_MAX_DURATION_MS = 1_800 * 1_000;\nexport const COMPUTER_USE_DEFAULT_DURATION_MS = 300 * 1_000;\n/** The session lengths a person can pick when granting control, up to the maximum. */\nexport const COMPUTER_USE_DURATION_CHOICES_MS = [\n COMPUTER_USE_DEFAULT_DURATION_MS,\n 900_000,\n COMPUTER_USE_MAX_DURATION_MS,\n] as const;\nexport const COMPUTER_USE_CONFIRMATION_WINDOW_MS = 2 * 60 * 1_000;\n\n/**\n * Every path this API answers on, below its mount.\n *\n * The typed route table in `./apiRoutes` is built from this, the dispatcher\n * reads that table, and the hub channel addresses the broker with these same\n * strings, so a route cannot move on one side alone.\n */\nexport const COMPUTER_USE_ROUTES = {\n activate: '/activate',\n artifact: '/artifact',\n agentState: '/agent/state',\n agentObserve: '/agent/observe',\n agentAction: '/agent/action',\n agentStop: '/agent/stop',\n hubState: '/hub/state',\n hubActivation: '/hub/activation',\n hubAuthorization: '/hub/authorization',\n hubNext: '/hub/next',\n hubComplete: '/hub/complete',\n hubStop: '/hub/stop',\n} as const;\n\nexport const COMPUTER_USE_WAKE_LIMIT = 1_000_000;\n\nexport interface ComputerUseArtifactView {\n readonly artifactId: string;\n readonly status: 'ready' | 'failed';\n readonly sizeBytes?: number;\n readonly downloadUrl?: string;\n readonly previewUrl?: string;\n readonly actionCount?: number;\n readonly completedAt?: string;\n readonly failure?: { readonly code: string; readonly message: string };\n}\n\nexport interface ComputerUseSessionView {\n readonly sessionId: string;\n readonly revision: number;\n readonly wake: number;\n readonly phase: 'inactive' | 'awaiting_confirmation' | 'activating' | 'active' | 'stopping' | 'failed';\n readonly requestId?: string;\n readonly target?: Record<string, unknown>;\n readonly durationMs?: number;\n readonly expiresAt?: number;\n readonly failure?: { readonly code: string; readonly message: string };\n readonly artifact?: ComputerUseArtifactView;\n}\n\nexport interface ComputerUseActivationRequest {\n readonly requestId: string;\n readonly target?: Record<string, unknown>;\n readonly durationSeconds: number;\n readonly createdAt: number;\n readonly confirmationExpiresAt: number;\n /** Set by the session broker only after the person approves the in-app dialog. */\n readonly confirmedAt?: number;\n readonly caller: PoApiCaller;\n}\n\nexport interface ComputerUseBrokerRequest {\n readonly id: string;\n readonly operation: 'observe' | 'act';\n readonly payload?: unknown;\n readonly grantId: string;\n readonly sequence?: number;\n}\n\nexport interface ComputerUseChannelPayload {\n readonly state: ComputerUseSessionView;\n readonly targets: readonly Record<string, unknown>[];\n readonly busy?: true;\n}\n\nexport type ComputerUseBrowserCommand = { readonly action: 'status' | 'targets' | 'stop' | 'artifacts' };\n","/** The mount's only path: GET reads the permission states, POST asks macOS for one. */\nexport const DESKTOP_PERMISSIONS_PATH = '/';\n\n/** The macOS privacy permissions Desktop reports, in the order the settings page shows them. */\nexport const DESKTOP_PERMISSIONS = [\n 'accessibility',\n 'screen-recording',\n 'microphone',\n 'automation',\n 'full-disk-access',\n] as const;\nexport type DesktopPermission = (typeof DESKTOP_PERMISSIONS)[number];\n\n/** `per-app` is Automation: macOS asks once for each app Po controls and reports no overall state. */\nexport type DesktopPermissionState = 'granted' | 'denied' | 'not-determined' | 'per-app';\nexport type DesktopPermissionStates = Record<DesktopPermission, DesktopPermissionState>;\n\nexport interface DesktopPermissionRequest {\n readonly permission: DesktopPermission;\n}\n\nexport function isDesktopPermission(value: unknown): value is DesktopPermission {\n return typeof value === 'string' && (DESKTOP_PERMISSIONS as readonly string[]).includes(value);\n}\n","import type { ApiResponseOf, ApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\nimport { DESKTOP_PERMISSIONS_PATH, type DesktopPermissionStates } from './desktopPermissions';\n\n/**\n * This package's routes, as data.\n *\n * No scope and no base path: the build reads both off\n * `src/extensions/workspaces/sessions/(backend)/api/computer-use/`, so the\n * mount is stated once, by the folder that creates it.\n *\n * The paths come from `COMPUTER_USE_ROUTES` rather than being written out\n * again. That table already addressed the broker from the hub channel and from\n * the broker's own dispatcher, and a second copy here is exactly the\n * disagreement this file exists to prevent. The dispatcher now reads this\n * table, so the page, the broker and the hub all resolve one set of strings.\n *\n * Activation, status, cancellation and recording reads are reachable from a browser. The `/agent/` and `/hub/` routes\n * each demand a host-issued bearer token and answer 404 without one; they are\n * declared here because they are this API's surface, not because a page calls\n * them.\n */\nconst routes = {\n artifact: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.artifact,\n query: ['artifactId', 'offset'],\n raw: true,\n },\n activationState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n cancelActivation: {\n method: 'DELETE',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Answers whatever the admitted Desktop provider returned, which is runtime-defined JSON. */\n agentObserve: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentObserve,\n response: undefined as unknown as ApiResponseOf<unknown>,\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: undefined as unknown as ApiResponseOf<unknown>,\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Null until a reader has confirmed one; reading it moves the session to `activating`. */\n hubActivation: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubActivation,\n response: undefined as unknown as ApiResponseOf<ComputerUseActivationRequest | null>,\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: undefined as unknown as ApiResponseOf<{ readonly grantId: string; readonly expiresAt?: number } | null>,\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: undefined as unknown as ApiResponseOf<ComputerUseBrokerRequest | null>,\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: undefined as unknown as ApiResponseOf<ComputerUseSessionView>,\n },\n /** Desktop's macOS permission states, served by the hub's `desktop-permissions` mount. */\n desktopPermissions: {\n method: 'GET',\n path: DESKTOP_PERMISSIONS_PATH,\n response: undefined as unknown as ApiResponseOf<DesktopPermissionStates>,\n },\n /** Asks macOS for the body's permission on the Mac running Desktop; answers the states after. */\n requestDesktopPermission: {\n method: 'POST',\n path: DESKTOP_PERMISSIONS_PATH,\n response: undefined as unknown as ApiResponseOf<DesktopPermissionStates>,\n },\n} as const satisfies ApiRoutes;\n\nexport default routes;\n","import { createApiClient, sessionApiAddress, type SettingsPanelProps } from '@agimon-ai/po-core/native';\n\nimport routes from '../../../../types/apiRoutes';\nimport {\n DESKTOP_PERMISSIONS,\n type DesktopPermission,\n type DesktopPermissionStates,\n} from '../../../../types/desktopPermissions';\n\nexport type DesktopPermissionsViewState =\n | { status: 'loading' }\n | { status: 'unavailable' }\n | { status: 'error'; error: string }\n | { status: 'ready'; states: DesktopPermissionStates; asking?: DesktopPermission };\n\n/** Reads the Mac, never the phone. A request uses the host's step-up transport. */\nexport async function readDesktopPermissions(\n request: SettingsPanelProps['request'],\n permission?: DesktopPermission,\n): Promise<DesktopPermissionsViewState> {\n try {\n const api = createApiClient(routes, {\n scopes: ['global'] as const,\n basePath: 'desktop-permissions',\n transport: request,\n sessionAddress: sessionApiAddress,\n });\n const route = permission === undefined ? api.global.desktopPermissions : api.global.requestDesktopPermission;\n const response = await request(\n route.url(),\n permission === undefined\n ? undefined\n : {\n method: route.spec.method,\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ permission }),\n },\n );\n if (response.status === 404) return { status: 'unavailable' };\n const body: unknown = await response.json().catch(() => undefined);\n if (typeof body === 'object' && body !== null && !Array.isArray(body)) {\n const record = body as Record<string, unknown>;\n if (\n response.ok &&\n !('error' in record) &&\n DESKTOP_PERMISSIONS.every((key) =>\n ['granted', 'denied', 'not-determined', 'per-app'].includes(record[key] as string),\n )\n ) {\n return { status: 'ready', states: record as DesktopPermissionStates };\n }\n if (typeof record.error === 'string') return { status: 'error', error: record.error };\n }\n return { status: 'error', error: 'Po Desktop did not return permission states. Try again.' };\n } catch (error) {\n return { status: 'error', error: error instanceof Error ? error.message : String(error) };\n }\n}\n","import {\n Badge,\n Button,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n fontOf,\n Panel,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n DESKTOP_PERMISSIONS,\n type DesktopPermission,\n type DesktopPermissionState,\n} from '../../../../types/desktopPermissions';\nimport type {} from '../../../../types/unistyles.native';\nimport type { DesktopPermissionsViewState } from '../_lib/desktopPermissions.native';\n\nconst COPY: Record<DesktopPermission, { title: string; detail: string }> = {\n accessibility: {\n title: 'Accessibility',\n detail: 'Lets Po press buttons, fill fields and scroll in the app window you approve for computer use.',\n },\n 'screen-recording': {\n title: 'Screen and system audio recording',\n detail:\n 'Lets Po see and record the window you approve, with its sound. macOS asks you to reopen Po after you allow it.',\n },\n microphone: {\n title: 'Microphone',\n detail: 'Lets you talk to Po, and adds your voice to computer-use recordings.',\n },\n automation: {\n title: 'Automation',\n detail:\n 'Lets Po and its agents control other apps, such as Finder or Mail. macOS asks once for each app; your answers are listed in System Settings.',\n },\n 'full-disk-access': {\n title: 'Full Disk Access',\n detail:\n 'Optional. Lets agents and their tools read Documents, Downloads and Mail without a prompt for each folder.',\n },\n};\nconst LABEL: Record<DesktopPermissionState, string> = {\n granted: 'Allowed',\n denied: 'Not allowed',\n 'not-determined': 'Not asked yet',\n 'per-app': 'Asked per app',\n};\n\nexport function DesktopPermissionsView({\n state,\n remote = true,\n onAsk,\n onRefresh,\n}: {\n state: DesktopPermissionsViewState;\n remote?: boolean;\n onAsk: (permission: DesktopPermission) => void;\n onRefresh: () => void;\n}) {\n return (\n <View style={styles.page}>\n <View style={styles.sectionHead}>\n <View style={styles.sectionText}>\n <Text accessibilityRole=\"header\" style={styles.sectionTitle}>\n On the paired Mac\n </Text>\n <Text style={styles.detail}>\n {remote\n ? 'These belong to the Mac running Po Desktop. When you ask from here, macOS shows its prompt on that Mac.'\n : 'Po asks macOS for each one when you are ready. The permission prompt appears on the Mac running Po Desktop. You can change them any time in System Settings, Privacy and Security.'}\n </Text>\n </View>\n {state.status === 'ready' ? (\n <DropdownMenu>\n <DropdownMenuTrigger\n variant=\"ghost\"\n disabled={state.asking !== undefined}\n accessibilityLabel=\"Permissions actions for the paired Mac\"\n style={styles.control}\n >\n ⋯\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem onSelect={onRefresh}>Check again</DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </View>\n <Panel style={styles.card}>\n {state.status === 'ready' ? (\n DESKTOP_PERMISSIONS.map((permission, index) => {\n const value = state.states[permission];\n const asking = state.asking === permission;\n const action = asking ? 'Waiting for macOS' : value === 'not-determined' ? 'Allow' : 'Open System Settings';\n return (\n <View key={permission} style={[styles.row, index > 0 && styles.divider]}>\n <View style={styles.rowHeading}>\n <Text style={styles.rowTitle}>{COPY[permission].title}</Text>\n <Badge tone={value === 'granted' ? 'green' : 'neutral'}>{LABEL[value]}</Badge>\n </View>\n <Text style={styles.detail}>{COPY[permission].detail}</Text>\n {value !== 'granted' ? (\n <Button\n variant=\"outline\"\n style={styles.control}\n disabled={state.asking !== undefined}\n accessibilityLabel={`${action}: ${COPY[permission].title} on the paired Mac`}\n onPress={() => onAsk(permission)}\n >\n {action}\n </Button>\n ) : null}\n {asking ? (\n <Text accessibilityLiveRegion=\"polite\" style={styles.detail}>\n Waiting for your answer on the Mac.\n </Text>\n ) : null}\n </View>\n );\n })\n ) : (\n <View style={styles.row}>\n <Text accessibilityRole={state.status === 'error' ? 'alert' : 'header'} style={styles.rowTitle}>\n {state.status === 'loading'\n ? 'Checking with macOS'\n : state.status === 'unavailable'\n ? 'Po Desktop is not running here'\n : \"Po couldn't read the permissions just now\"}\n </Text>\n <Text style={styles.detail}>\n {state.status === 'loading'\n ? 'This takes a moment.'\n : state.status === 'unavailable'\n ? 'Permissions belong to the Mac running Po Desktop. Open Po Desktop there to see and change them.'\n : state.error}\n </Text>\n {state.status === 'error' ? (\n <Button\n variant=\"outline\"\n style={styles.control}\n accessibilityLabel=\"Try reading permissions from the paired Mac again\"\n onPress={onRefresh}\n >\n Try again\n </Button>\n ) : null}\n </View>\n )}\n </Panel>\n </View>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n page: {\n gap: theme.spacing(5),\n },\n sectionHead: { flexDirection: 'row', alignItems: 'flex-start', gap: theme.spacing(2) },\n sectionText: { flex: 1, minWidth: 0, gap: theme.spacing(2) },\n sectionTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.lg,\n lineHeight: theme.lineHeight.lg,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n },\n detail: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n card: { padding: 0, overflow: 'hidden' },\n row: { padding: theme.spacing(4), gap: theme.spacing(3) },\n rowHeading: { flexDirection: 'row', flexWrap: 'wrap', alignItems: 'center', gap: theme.spacing(2) },\n rowTitle: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n fontWeight: theme.fontWeight.semibold,\n color: theme.colors.hi,\n flexShrink: 1,\n },\n divider: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: theme.colors['border-soft'] },\n control: { minHeight: 44, minWidth: 44, alignSelf: 'flex-start' },\n}));\n","import type { SettingsPanelProps } from '@agimon-ai/po-core/native';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { AppState } from 'react-native';\n\nimport type { DesktopPermission } from '../../../../types/desktopPermissions';\nimport { readDesktopPermissions, type DesktopPermissionsViewState } from '../_lib/desktopPermissions.native';\nimport { DesktopPermissionsView } from './DesktopPermissionsView.native';\n\nexport function DesktopPermissionsPanel({ request, requestWithStepUp }: SettingsPanelProps) {\n const [state, setState] = useState<DesktopPermissionsViewState>({ status: 'loading' });\n const generation = useRef(0);\n const busy = useRef(false);\n\n const run = useCallback(\n async (permission?: DesktopPermission) => {\n if (busy.current) return;\n busy.current = true;\n const version = ++generation.current;\n setState((current) =>\n permission !== undefined && current.status === 'ready'\n ? { ...current, asking: permission }\n : { status: 'loading' },\n );\n const next = await readDesktopPermissions(permission === undefined ? request : requestWithStepUp, permission);\n if (generation.current !== version) return;\n busy.current = false;\n setState(next);\n },\n [request, requestWithStepUp],\n );\n\n useEffect(() => {\n // Read macOS on mount and when returning from its permission prompt or System Settings.\n // oxlint-disable-next-line react/set-state-in-effect\n void run();\n const subscription = AppState.addEventListener('change', (next) => {\n if (next === 'active') void run();\n });\n return () => {\n generation.current += 1;\n busy.current = false;\n subscription.remove();\n };\n }, [run]);\n\n return (\n <DesktopPermissionsView state={state} onAsk={(permission) => void run(permission)} onRefresh={() => void run()} />\n );\n}\n","import { defineSettingsPanel } from '@agimon-ai/po-core/native';\n\nimport { DesktopPermissionsPanel } from './_components/DesktopPermissionsPanel.native';\n\nexport default defineSettingsPanel({\n label: 'Permissions',\n detail: 'What Po may do on the paired Mac',\n order: 46,\n component: DesktopPermissionsPanel,\n});\n","import { defineActivityGroup } from '@agimon-ai/po-core/native';\n\nimport { COMPUTER_USE_STATUS_KEY } from '../../../../../types/computerUseApi';\n\n/** Remote clients request control from the Desktop host through their session Activity. */\nexport default defineActivityGroup({\n name: 'computer-use',\n keys: 'c e',\n order: 70,\n statusKey: COMPUTER_USE_STATUS_KEY,\n hideWhenEmpty: true,\n marksBackgroundWork: false,\n});\n","import { defineSessionStore } from '@agimon-ai/po-core/native';\n\nimport { computerUseChannelType } from '../../../../../types/computerUseApi';\nimport type { ComputerUseChannelPayload, ComputerUseSessionView } from '../../../../../types/computerUseApi';\n\nexport interface ComputerUseSession extends ComputerUseChannelPayload {}\n\nconst initialState: ComputerUseSession = {\n state: { sessionId: '', revision: 0, wake: 0, phase: 'inactive' },\n targets: [],\n};\n\nexport const computerUse = defineSessionStore<ComputerUseSession>(initialState);\n\n/** Revision zero must hydrate the empty selector once; equal status polls then retain identity. */\nexport function updateComputerUseState(sessionId: string, state: ComputerUseSessionView) {\n computerUse.update(sessionId, (current) =>\n current.state.sessionId === '' || state.revision > current.state.revision ? { ...current, state } : current,\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport const computerUseChannel = computerUse.channel<ComputerUseChannelPayload>({\n channel: computerUseChannelType,\n parse(input) {\n if (!isRecord(input) || !isRecord(input.state) || !Array.isArray(input.targets)) return null;\n if (typeof input.state.phase !== 'string' || typeof input.state.revision !== 'number') return null;\n return input as unknown as ComputerUseChannelPayload;\n },\n reduce: (_current, payload) => payload,\n});\n","import { defineChannelFile } from '@agimon-ai/po-core/native';\n\nimport { computerUseChannel } from '../_lib/computerUseStore.native';\n\nexport default defineChannelFile(computerUseChannel);\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 'computer-use' at for the computer-use mount. */\nexport const computerUseScopes = ['session'] as const;\n\nexport const computerUse = createApiClient(routes, {\n scopes: computerUseScopes,\n basePath: 'computer-use',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n\n/** Scopes the tree mounts 'desktop-permissions' at for the desktop-permissions mount. */\nexport const desktopPermissionsScopes = ['global', 'workspace', 'session'] as const;\n\nexport const desktopPermissions = createApiClient(routes, {\n scopes: desktopPermissionsScopes,\n basePath: 'desktop-permissions',\n transport: nativeApiTransport,\n sessionAddress: sessionApiAddress,\n});\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/native';\nimport {\n Button,\n CheckIcon,\n Dialog,\n DialogBody,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n fontOf,\n SegmentedControl,\n} from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore } from 'react';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerUse as api } from '../../../../../../../generated/client.native';\nimport {\n COMPUTER_USE_DEFAULT_DURATION_MS,\n COMPUTER_USE_DURATION_CHOICES_MS,\n computerUseChannelType,\n} from '../../../../../../types/computerUseApi';\nimport type { ComputerUseSessionView } from '../../../../../../types/computerUseApi';\nimport { computerUse, updateComputerUseState } from '../../_lib/computerUseStore.native';\n\nfunction text(value: unknown, fallback: string): string {\n return typeof value === 'string' || typeof value === 'number' ? String(value) : fallback;\n}\n\nfunction remaining(ms: number): string {\n const seconds = Math.max(0, Math.ceil(ms / 1000));\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')} left`;\n}\n\nconst DURATION_OPTIONS = COMPUTER_USE_DURATION_CHOICES_MS.map((choice) => ({\n value: String(choice),\n label: `${choice / 60_000} min`,\n}));\nexport function ComputerUseView({\n state,\n targets = [],\n busy = false,\n error,\n submitting = false,\n durationMs = COMPUTER_USE_DEFAULT_DURATION_MS,\n onDurationChange,\n onRefreshTargets,\n onActivate,\n onCancel,\n onStop,\n}: {\n state: ComputerUseSessionView;\n targets?: readonly Record<string, unknown>[];\n busy?: boolean;\n error?: string;\n submitting?: boolean;\n durationMs?: number;\n onDurationChange?: (durationMs: number) => void;\n onRefreshTargets?: () => void;\n onActivate: (target: Record<string, unknown>, durationMs: number) => void;\n onCancel: () => void;\n onStop: () => void;\n}) {\n const [selected, setSelected] = useState(0);\n const [confirmation, setConfirmation] = useState<{ target: Record<string, unknown>; durationMs: number }>();\n const choices = [\n { label: 'Whole desktop', target: { scope: 'desktop' } },\n ...targets.map((target) => ({\n label: `${text(target.applicationName, 'Application')}: ${text(target.windowTitle, text(target.windowId, 'Window'))}`,\n target,\n })),\n ];\n const chosen = choices[selected] ?? choices[0]!;\n const pending = state.phase === 'awaiting_confirmation' || state.phase === 'activating';\n const active = state.phase === 'active' || state.phase === 'stopping';\n const failure = error ?? state.failure?.message;\n const expiresAt = state.phase === 'active' ? state.expiresAt : undefined;\n const [now, setNow] = useState(Date.now);\n useEffect(() => {\n if (expiresAt === undefined) return;\n const timer = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(timer);\n }, [expiresAt]);\n const left = expiresAt === undefined ? undefined : expiresAt - now;\n const total = state.durationMs ?? COMPUTER_USE_DEFAULT_DURATION_MS;\n const controlled =\n state.target?.scope === 'desktop'\n ? 'your whole desktop'\n : typeof state.target?.applicationName === 'string'\n ? state.target.applicationName\n : 'the chosen window';\n return (\n <View style={styles.panel}>\n <View style={styles.header}>\n <Text style={styles.title} accessibilityRole=\"header\">\n Computer use\n </Text>\n {!pending && !active && onRefreshTargets ? (\n <DropdownMenu>\n <DropdownMenuTrigger variant=\"ghost\" accessibilityLabel=\"Computer use actions\">\n Actions\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n <DropdownMenuItem disabled={busy || submitting} onSelect={onRefreshTargets}>\n Refresh targets\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </View>\n {busy ? <Text style={styles.detail}>Computer use is busy in another session.</Text> : null}\n {failure ? (\n <Text style={styles.error} accessibilityRole=\"alert\">\n {failure}\n </Text>\n ) : null}\n {state.artifact?.status === 'ready' ? (\n <View style={styles.row}>\n <View style={styles.check}>\n <CheckIcon size={12} color=\"rail\" />\n </View>\n <Text style={styles.text}>Recording saved to session artifacts.</Text>\n </View>\n ) : null}\n {state.artifact?.failure ? <Text style={styles.error}>{state.artifact.failure.message}</Text> : null}\n {pending ? (\n <>\n <Text style={styles.text}>Desktop activation is pending.</Text>\n <Button variant=\"outline\" disabled={submitting} onPress={onCancel}>\n Cancel activation\n </Button>\n </>\n ) : active ? (\n <>\n <View style={styles.row} accessibilityLiveRegion=\"polite\">\n <View style={styles.dot} />\n <Text style={styles.live}>\n {state.phase === 'stopping' ? 'Po is handing control back' : `Po is controlling ${controlled}`}\n </Text>\n </View>\n {left === undefined ? null : (\n <View style={styles.row}>\n <View\n style={styles.track}\n accessibilityRole=\"progressbar\"\n accessibilityLabel=\"Time left\"\n accessibilityValue={{ min: 0, max: total, now: Math.max(0, left) }}\n >\n <View style={[styles.fill, { width: `${Math.min(100, Math.max(0, (left / total) * 100))}%` }]} />\n </View>\n <Text style={styles.detail}>{remaining(left)}</Text>\n </View>\n )}\n <Button variant=\"outline\" disabled={submitting || state.phase === 'stopping'} onPress={onStop}>\n Stop computer use\n </Button>\n </>\n ) : (\n <>\n <Text style={styles.detail}>Po asks before it takes control. You can stop at any time.</Text>\n <DropdownMenu>\n <DropdownMenuTrigger\n variant=\"outline\"\n disabled={busy || submitting}\n accessibilityLabel=\"What Po may control\"\n >\n {chosen.label}\n </DropdownMenuTrigger>\n <DropdownMenuContent>\n {choices.map((choice, index) => (\n <DropdownMenuItem key={`${index}:${choice.label}`} onSelect={() => setSelected(index)}>\n {choice.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n {onDurationChange ? (\n <SegmentedControl\n accessibilityLabel=\"For how long\"\n options={DURATION_OPTIONS}\n value={String(durationMs)}\n disabled={busy || submitting}\n onValueChange={(value) => onDurationChange(Number(value))}\n />\n ) : null}\n <Button\n variant=\"primary\"\n disabled={busy || submitting}\n onPress={() => setConfirmation({ target: Object.freeze({ ...chosen.target }), durationMs })}\n >\n Request activation\n </Button>\n </>\n )}\n {confirmation ? (\n <ComputerUseConfirmation\n target={confirmation.target}\n durationMs={confirmation.durationMs}\n onCancel={() => setConfirmation(undefined)}\n onConfirm={() => {\n setConfirmation(undefined);\n onActivate(confirmation.target, confirmation.durationMs);\n }}\n />\n ) : null}\n </View>\n );\n}\n\nfunction SessionPanel({ sessionId, sendSessionFrame }: WebPluginSlotProps & { sessionId: string }) {\n const subscribe = useCallback((listener: () => void) => {\n const subscription = computerUse.store.subscribe(listener);\n return () => subscription.unsubscribe();\n }, []);\n // Native plugins may not import @tanstack/react-store; it is not a native host module.\n const session = useSyncExternalStore(subscribe, () => computerUse.select(computerUse.store.state, sessionId));\n const [error, setError] = useState<string>();\n const [submitting, setSubmitting] = useState(false);\n const [durationMs, setDurationMs] = useState<number>(COMPUTER_USE_DEFAULT_DURATION_MS);\n const requests = useRef<AbortController | null>(null);\n\n useEffect(() => {\n const controller = new AbortController();\n requests.current = controller;\n let timer: ReturnType<typeof setTimeout> | undefined;\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'status' } });\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'targets' } });\n const poll = async () => {\n try {\n const result = await api.session(sessionId).activationState({ signal: controller.signal });\n if (result.ok && !controller.signal.aborted) updateComputerUseState(sessionId, result.data);\n } catch {\n if (!controller.signal.aborted) setError('The session is unreachable.');\n }\n if (!controller.signal.aborted) timer = setTimeout(() => void poll(), 2000);\n };\n void poll();\n return () => {\n controller.abort();\n clearTimeout(timer);\n };\n }, [sessionId, sendSessionFrame]);\n\n const submit = async (\n action: 'activate' | 'cancel',\n target?: Record<string, unknown>,\n approvedDurationMs = durationMs,\n ) => {\n const signal = requests.current?.signal;\n if (!signal || signal.aborted || submitting) return;\n setError(undefined);\n setSubmitting(true);\n try {\n const client = api.session(sessionId);\n const result =\n action === 'activate'\n ? await client.activate({ body: { target, durationMs: approvedDurationMs, confirmed: true }, signal })\n : await client.cancelActivation({ signal });\n if (signal.aborted) return;\n if (result.ok) updateComputerUseState(sessionId, result.data);\n else\n setError(\n result.status === 0 ? 'The session is unreachable.' : result.error || 'The activation request failed.',\n );\n } catch {\n if (!signal.aborted) setError('The activation request is unavailable.');\n } finally {\n if (!signal.aborted) setSubmitting(false);\n }\n };\n\n return (\n <ComputerUseView\n state={session.state}\n targets={session.targets}\n busy={session.busy}\n error={error}\n submitting={submitting}\n durationMs={durationMs}\n onDurationChange={setDurationMs}\n onRefreshTargets={() => {\n if (session.busy || submitting) return;\n setError(undefined);\n try {\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'targets' } });\n } catch {\n setError('The target list could not be refreshed.');\n }\n }}\n onActivate={(target, duration) => void submit('activate', target, duration)}\n onCancel={() => void submit('cancel')}\n onStop={() => {\n setError(undefined);\n try {\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'stop' } });\n } catch {\n setError('The stop request is unavailable.');\n }\n }}\n />\n );\n}\n\nexport function ComputerUsePanel(props: WebPluginSlotProps) {\n return props.sessionId === null ? (\n <Text style={styles.detail}>Select a session.</Text>\n ) : (\n <SessionPanel key={props.sessionId} {...props} sessionId={props.sessionId} />\n );\n}\n\nexport function ComputerUseConfirmation({\n target,\n durationMs,\n onConfirm,\n onCancel,\n}: {\n target: Record<string, unknown>;\n durationMs: number;\n onConfirm: () => void;\n onCancel: () => void;\n}) {\n const desktop = target.scope === 'desktop';\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open) onCancel();\n }}\n >\n <DialogContent>\n <DialogHeader>\n <DialogTitle>Allow Po to control {desktop ? 'your whole desktop' : 'this window'}?</DialogTitle>\n </DialogHeader>\n <DialogBody>\n <DialogDescription>\n {desktop\n ? 'Every app window on the main display, except Po and system security windows.'\n : `${text(target.applicationName, 'Application')}: ${text(target.windowTitle, text(target.windowId, 'Window'))}`}\n </DialogDescription>\n <Text style={styles.text}>For {durationMs / 60_000} minutes. You can stop at any time.</Text>\n <Text style={styles.detail}>\n Po records {desktop ? 'the main display' : 'this window'}, system sound and microphone audio when permission\n is granted.\n </Text>\n <Text style={styles.detail}>Only this session and its approved device receive control.</Text>\n <DialogFooter>\n <Button variant=\"outline\" onPress={onCancel}>\n Cancel\n </Button>\n <Button variant=\"primary\" onPress={onConfirm}>\n Allow control\n </Button>\n </DialogFooter>\n </DialogBody>\n </DialogContent>\n </Dialog>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n panel: { gap: theme.spacing(3) },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n gap: theme.spacing(2),\n paddingBottom: theme.spacing(2),\n borderBottomWidth: 1,\n borderBottomColor: theme.colors['border-soft'],\n },\n title: {\n flex: 1,\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n fontWeight: '600',\n color: theme.colors.hi,\n },\n row: { flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2) },\n dot: { width: 8, height: 8, borderRadius: 4, backgroundColor: theme.colors.green },\n live: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.green,\n },\n track: { flex: 1, height: 6, borderRadius: 3, overflow: 'hidden', backgroundColor: theme.colors['border-soft'] },\n fill: { height: '100%', borderRadius: 3, backgroundColor: theme.colors.green },\n check: {\n width: 20,\n height: 20,\n borderRadius: 10,\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: theme.colors.green,\n },\n text: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.text,\n },\n detail: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeightRelaxed.sm,\n color: theme.colors.dim,\n },\n error: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeightRelaxed.base,\n color: theme.colors.red,\n },\n}));\n","import { defineFill } from '@agimon-ai/po-core/native';\n\nimport { ComputerUsePanel } from './_components/ComputerUsePanel.native';\n\nexport default defineFill({ id: 'computer-use', slot: 'activity.computer-use', component: ComputerUsePanel });\n","// Imports nothing at runtime: the web and native cards share it, and the native\n// bundle may not load the web contract.\n\n/** Lines a computer tool card shows before it expands, on web and native alike. */\nexport const COMPUTER_TOOL_COLLAPSED_LINES = 8;\n/** Elements of an observation the native card lists before it expands. */\nexport const COMPUTER_ELEMENTS_PREVIEW = 5;\n/** Script log lines the native card lists before it expands. */\nexport const COMPUTER_LOGS_PREVIEW = 3;\n\nconst MS_PER_SECOND = 1000;\n\n/** The computer_state call's summary: it always observes the one authorized window. */\nexport function computerStateCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return 'authorized window';\n}\n\n/**\n * The computer_action call as its two pieces: the action kind first, the element\n * it targets second. Either may be missing; the empty ones are dropped.\n */\nexport function computerActionCallParts(args: Readonly<Record<string, unknown>>): readonly string[] {\n const kind = typeof args.kind === 'string' ? args.kind : '';\n const ref = typeof args.elementRef === 'string' ? args.elementRef : '';\n return [kind, ref].filter(Boolean);\n}\n\n/** The computer_exec call's summary: the script it ran. */\nexport function computerExecCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.scriptPath === 'string' ? args.scriptPath : '';\n}\n\n/**\n * The script path as its folder and its file name, so a phone header can let the\n * folder truncate while the script name stays whole.\n */\nexport function computerExecPathParts(path: string): { readonly folder: string; readonly name: string } {\n const cut = path.lastIndexOf('/');\n return cut < 0 ? { folder: '', name: path } : { folder: path.slice(0, cut + 1), name: path.slice(cut + 1) };\n}\n\nexport interface ComputerElementView {\n readonly ref: string;\n /** The accessibility role in words: `AXTextField` reads `text field`. */\n readonly role: string;\n /** The label, else the value, else empty. */\n readonly label: string;\n readonly enabled: boolean;\n readonly secure: boolean;\n}\n\nexport interface ComputerObservationView {\n readonly applicationName: string;\n readonly windowTitle: string;\n readonly elements: readonly ComputerElementView[];\n /** The next page's offset when more elements exist than this page holds. */\n readonly nextOffset?: number;\n readonly truncated: boolean;\n readonly screenshotArtifact?: string;\n}\n\nexport interface ComputerFieldView {\n readonly key: string;\n readonly value: string;\n}\n\nexport interface ComputerRunView {\n /** The script's return value as short key and value pairs, never raw JSON. */\n readonly fields: readonly ComputerFieldView[];\n readonly logs: readonly string[];\n readonly actions?: number;\n readonly observations?: number;\n /** `3.4s`, from the run's metrics. */\n readonly duration?: string;\n readonly observation?: ComputerObservationView;\n}\n\nexport interface ComputerFailureView {\n readonly reason: string;\n /** Actions that finished before the run stopped, so the agent does not replay them. */\n readonly completedActions?: number;\n readonly outcomeUncertain: boolean;\n}\n\n/** What a computer tool result says, parsed and validated; `text` only when it is not JSON the card knows. */\nexport type ComputerResultView =\n | { readonly kind: 'observation'; readonly observation: ComputerObservationView }\n | { readonly kind: 'run'; readonly run: ComputerRunView }\n | { readonly kind: 'applied' }\n | { readonly kind: 'launched'; readonly applicationName: string; readonly bundleId: string }\n | { readonly kind: 'failure'; readonly failure: ComputerFailureView }\n | { readonly kind: 'text'; readonly lines: readonly string[] };\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nconst text = (value: unknown): string => (typeof value === 'string' ? value : '');\nconst count = (value: unknown): number | undefined =>\n typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : undefined;\n\n/** The result's text blocks joined; images (the screenshot) are dropped, as the web cards drop them. */\nexport function computerResultText(content: readonly unknown[]): string {\n return content\n .flatMap((block) => {\n const entry = record(block);\n return entry?.type === 'text' && typeof entry.text === 'string' ? [entry.text] : [];\n })\n .join('\\n');\n}\n\n/** `AXTextField` as `text field`; a role without the AX prefix is kept as it came. */\nexport function computerRoleWords(role: string): string {\n if (!role.startsWith('AX')) return role;\n return role\n .slice(2)\n .replace(/([a-z])([A-Z])/gu, '$1 $2')\n .toLowerCase();\n}\n\nfunction element(value: unknown): ComputerElementView[] {\n const entry = record(value);\n if (entry === undefined || typeof entry.ref !== 'string') return [];\n return [\n {\n ref: entry.ref,\n role: computerRoleWords(text(entry.role)),\n label: text(entry.label) || text(entry.value),\n enabled: entry.enabled !== false,\n secure: entry.secure === true,\n },\n ];\n}\n\n/** An observation when the value is one: an application name and an element list. */\nexport function computerObservationView(value: unknown): ComputerObservationView | undefined {\n const entry = record(value);\n if (entry === undefined || typeof entry.applicationName !== 'string' || !Array.isArray(entry.elements))\n return undefined;\n const nextOffset = count(entry.nextOffset);\n const artifact = text(entry.screenshotArtifact);\n return {\n applicationName: entry.applicationName,\n windowTitle: text(entry.windowTitle),\n elements: entry.elements.flatMap(element),\n truncated: entry.truncated === true || nextOffset !== undefined,\n ...(nextOffset === undefined ? {} : { nextOffset }),\n ...(artifact.length > 0 ? { screenshotArtifact: artifact } : {}),\n };\n}\n\n/** One value of a script result as a short phrase: scalars as they read, collections by their size. */\nfunction phrase(value: unknown): string {\n if (value === null || value === undefined) return 'none';\n if (typeof value === 'string') return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (Array.isArray(value)) return `${String(value.length)} item${value.length === 1 ? '' : 's'}`;\n const size = Object.keys(value as object).length;\n return `${String(size)} field${size === 1 ? '' : 's'}`;\n}\n\n/** A script's return value as fields: an object's own keys, or one `result` field for anything else. */\nexport function computerResultFields(value: unknown): ComputerFieldView[] {\n if (value === undefined) return [];\n const entry = record(value);\n if (entry === undefined) return [{ key: 'result', value: phrase(value) }];\n return Object.entries(entry).map(([key, field]) => ({ key, value: phrase(field) }));\n}\n\nfunction run(entry: Record<string, unknown>): ComputerRunView | undefined {\n if (!Array.isArray(entry.logs)) return undefined;\n const observation = computerObservationView(entry.observation);\n const metrics = record(entry.metrics);\n const actions = count(metrics?.actions);\n const observations = count(metrics?.observations);\n const durationMs = count(metrics?.durationMs);\n return {\n fields: computerResultFields(entry.result),\n logs: entry.logs.filter((line): line is string => typeof line === 'string'),\n ...(actions === undefined ? {} : { actions }),\n ...(observations === undefined ? {} : { observations }),\n ...(durationMs === undefined ? {} : { duration: `${(durationMs / MS_PER_SECOND).toFixed(1)}s` }),\n ...(observation === undefined ? {} : { observation }),\n };\n}\n\nfunction failure(entry: Record<string, unknown>): ComputerFailureView | undefined {\n if (typeof entry.error !== 'string') return undefined;\n const completedActions = count(entry.completedActions);\n return {\n reason: entry.error,\n ...(completedActions === undefined ? {} : { completedActions }),\n outcomeUncertain: entry.outcomeUncertain === true,\n };\n}\n\n/** The text as lines a card can count: CRLF folded, tabs widened, trailing blank lines dropped. */\nfunction lines(value: string): string[] {\n if (value.length === 0) return [];\n const split = value.replaceAll('\\r\\n', '\\n').replaceAll('\\t', ' ').split('\\n');\n while (split.length > 0 && split.at(-1)?.trim() === '') split.pop();\n return split;\n}\n\n/**\n * A computer tool result as the card lays it out. The tools answer in JSON (an\n * observation, an action's outcome, a script run, a script failure) or in a\n * plain sentence when they fail early; anything that does not parse as a shape\n * the card knows falls back to its text lines.\n */\nexport function computerResultView(content: readonly unknown[]): ComputerResultView {\n const raw = computerResultText(content);\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return { kind: 'text', lines: lines(raw) };\n }\n const entry = record(parsed);\n const observation = computerObservationView(parsed);\n if (observation !== undefined) return { kind: 'observation', observation };\n const ran = entry === undefined ? undefined : run(entry);\n if (ran !== undefined) return { kind: 'run', run: ran };\n const failed = entry === undefined ? undefined : failure(entry);\n if (failed !== undefined) return { kind: 'failure', failure: failed };\n if (entry?.launched === true && typeof entry.applicationName === 'string')\n return { kind: 'launched', applicationName: entry.applicationName, bundleId: text(entry.bundleId) };\n if (entry?.applied === true) return { kind: 'applied' };\n return { kind: 'text', lines: lines(raw) };\n}\n\n/** How many rows the view holds back while collapsed, so the card offers expand only when it reveals something. */\nexport function computerResultHidden(view: ComputerResultView): number {\n switch (view.kind) {\n case 'observation':\n return Math.max(0, view.observation.elements.length - COMPUTER_ELEMENTS_PREVIEW);\n case 'run':\n return Math.max(0, view.run.logs.length - COMPUTER_LOGS_PREVIEW);\n case 'text':\n return Math.max(0, view.lines.length - COMPUTER_TOOL_COLLAPSED_LINES);\n default:\n return 0;\n }\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { Badge, fontOf, MessageItemBody, MessageItemStatus } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport {\n COMPUTER_ELEMENTS_PREVIEW,\n COMPUTER_LOGS_PREVIEW,\n COMPUTER_TOOL_COLLAPSED_LINES,\n type ComputerElementView,\n type ComputerFailureView,\n type ComputerObservationView,\n type ComputerResultView,\n type ComputerRunView,\n computerResultHidden,\n computerResultView,\n} from '../_lib/computerToolView';\n\n/** The parsed result, or none before the tool answers. */\nexport function computerResult(props: ToolMessageRenderProps): ComputerResultView | undefined {\n return props.result === null ? undefined : computerResultView(props.result.content);\n}\n\n/** Whether the card has rows to reveal: the header offers expand only then, and never on a failure. */\nexport function computerResultExpandable(props: ToolMessageRenderProps): boolean {\n const view = computerResult(props);\n return !props.isError && view !== undefined && computerResultHidden(view) > 0;\n}\n\n/**\n * The body the three computer tool cards share on native. The web cards print\n * the result's text; the tools answer in JSON, so this lays the parsed result\n * out instead: the window and its elements, a script's figures and logs, an\n * action's outcome. A preview shows while collapsed, as the web's first lines\n * do. A failure shows only its reason in red, with a quiet note of any actions\n * that already ran; the header's edge and outcome already say it failed.\n */\nexport function ComputerResultBody({ props, expanded }: { props: ToolMessageRenderProps; expanded: boolean }) {\n const { toolName, output, running, isError } = props;\n const view = computerResult(props);\n const testID = `tool-result-${toolName}`;\n if (isError) {\n const failure: ComputerFailureView =\n view?.kind === 'failure'\n ? view.failure\n : { reason: view?.kind === 'text' ? view.lines.join('\\n') : output.trim(), outcomeUncertain: false };\n return failure.reason.length === 0 ? null : (\n <MessageItemBody testID={testID}>\n <FailureBlock failure={failure} />\n </MessageItemBody>\n );\n }\n if (view === undefined) {\n return running ? (\n <MessageItemBody testID={testID}>\n <MessageItemStatus tone=\"running\">running</MessageItemStatus>\n </MessageItemBody>\n ) : null;\n }\n if (view.kind === 'text' && view.lines.length === 0) return null;\n return (\n <MessageItemBody testID={testID}>\n <View style={styles.stack}>\n {view.kind === 'observation' ? <ObservationBlock observation={view.observation} expanded={expanded} /> : null}\n {view.kind === 'run' ? <RunBlock run={view.run} expanded={expanded} /> : null}\n {view.kind === 'applied' ? <Text style={[styles.sans, styles.text]}>Applied to the element.</Text> : null}\n {view.kind === 'launched' ? (\n <View style={styles.figure}>\n <Text numberOfLines={1} style={[styles.sans, styles.strong, styles.keep]}>\n Opened {view.applicationName}\n </Text>\n <Text numberOfLines={1} style={[styles.mono, styles.faint, styles.yield]}>\n {view.bundleId}\n </Text>\n </View>\n ) : null}\n {view.kind === 'text' ? <TextLines lines={view.lines} expanded={expanded} /> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n </View>\n </MessageItemBody>\n );\n}\n\nfunction FailureBlock({ failure }: { failure: ComputerFailureView }) {\n const done = failure.completedActions;\n const note = [\n done === undefined ? '' : `${String(done)} action${done === 1 ? '' : 's'} already ran`,\n failure.outcomeUncertain ? 'the last outcome is uncertain' : '',\n ].filter(Boolean);\n return (\n <View style={styles.stack}>\n <Text selectable style={[styles.sans, styles.error]}>\n {failure.reason}\n </Text>\n {note.length > 0 ? <Text style={[styles.small, styles.faint]}>{note.join(', ')}.</Text> : null}\n </View>\n );\n}\n\nfunction WindowLine({ observation, lead }: { observation: ComputerObservationView; lead?: string }) {\n return (\n <View style={styles.figure}>\n <Text numberOfLines={1} style={[styles.sans, styles.strong, styles.keep]}>\n {lead === undefined ? '' : `${lead} `}\n {observation.applicationName}\n </Text>\n {observation.windowTitle.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.dim, styles.yield]}>\n {observation.windowTitle}\n </Text>\n ) : null}\n </View>\n );\n}\n\nfunction ElementRow({ element }: { element: ComputerElementView }) {\n // A secure field's role already says so (`secure text field`); the flag is named only when it does not.\n const secure = element.secure && !element.role.includes('secure');\n const traits = [element.role, element.enabled ? '' : 'disabled', secure ? 'secure' : ''].filter(Boolean);\n return (\n <View style={styles.row} accessibilityLabel={`${element.label} ${traits.join(' ')} ${element.ref}`}>\n <Text numberOfLines={1} style={[styles.sans, element.enabled ? styles.text : styles.faint, styles.yield]}>\n {element.label.length > 0 ? element.label : element.role}\n </Text>\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.keep]}>\n {traits.join(' · ')}\n </Text>\n <Text numberOfLines={1} style={[styles.mono, styles.faint, styles.ref]}>\n {element.ref}\n </Text>\n </View>\n );\n}\n\nfunction ObservationBlock({ observation, expanded }: { observation: ComputerObservationView; expanded: boolean }) {\n const { elements } = observation;\n const shown = expanded ? elements : elements.slice(0, COMPUTER_ELEMENTS_PREVIEW);\n const hidden = elements.length - shown.length;\n return (\n <>\n <WindowLine observation={observation} />\n <View style={styles.chips}>\n <Badge size=\"xs\">{`${String(elements.length)} element${elements.length === 1 ? '' : 's'}`}</Badge>\n {observation.truncated ? (\n <Badge size=\"xs\" tone=\"yellow\">\n {observation.nextOffset === undefined\n ? 'more not shown'\n : `more from offset ${String(observation.nextOffset)}`}\n </Badge>\n ) : null}\n </View>\n {shown.length > 0 ? (\n <View style={styles.list}>\n {shown.map((element) => (\n <ElementRow key={element.ref} element={element} />\n ))}\n </View>\n ) : null}\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more elements</MessageItemStatus> : null}\n {observation.screenshotArtifact === undefined ? null : (\n <Text numberOfLines={2} style={[styles.small, styles.faint]}>\n Screenshot saved to {observation.screenshotArtifact}\n </Text>\n )}\n </>\n );\n}\n\nfunction RunBlock({ run, expanded }: { run: ComputerRunView; expanded: boolean }) {\n const figures = [\n run.actions === undefined ? '' : `${String(run.actions)} action${run.actions === 1 ? '' : 's'}`,\n run.observations === undefined ? '' : `${String(run.observations)} observation${run.observations === 1 ? '' : 's'}`,\n run.duration ?? '',\n ].filter(Boolean);\n const logs = expanded ? run.logs : run.logs.slice(0, COMPUTER_LOGS_PREVIEW);\n const hidden = run.logs.length - logs.length;\n return (\n <>\n {figures.length > 0 ? (\n <View style={styles.chips}>\n {figures.map((figure) => (\n <Badge key={figure} size=\"xs\">\n {figure}\n </Badge>\n ))}\n </View>\n ) : null}\n {run.fields.length > 0 ? (\n <View style={styles.list}>\n {run.fields.map((field) => (\n <View key={field.key} style={styles.row}>\n <Text numberOfLines={1} style={[styles.small, styles.faint, styles.key]}>\n {field.key}\n </Text>\n <Text numberOfLines={1} selectable style={[styles.sans, styles.text, styles.yield]}>\n {field.value}\n </Text>\n </View>\n ))}\n </View>\n ) : null}\n {logs.length > 0 ? (\n <View style={styles.list}>\n {logs.map((line, index) => (\n <Text key={`${String(index)}-${line}`} numberOfLines={1} selectable style={[styles.mono, styles.dim]}>\n {line}\n </Text>\n ))}\n </View>\n ) : null}\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more log lines</MessageItemStatus> : null}\n {run.observation === undefined ? null : <WindowLine observation={run.observation} lead=\"Ended on\" />}\n </>\n );\n}\n\nfunction TextLines({ lines, expanded }: { lines: readonly string[]; expanded: boolean }) {\n const shown = expanded ? lines : lines.slice(0, COMPUTER_TOOL_COLLAPSED_LINES);\n const hidden = lines.length - shown.length;\n return (\n <>\n <View style={styles.list}>\n {shown.map((line, index) => (\n <Text key={`${String(index)}-${line}`} selectable style={[styles.sans, styles.dim]}>\n {line}\n </Text>\n ))}\n </View>\n {hidden > 0 ? <MessageItemStatus expands>{hidden} more line(s)</MessageItemStatus> : null}\n </>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n stack: { gap: theme.spacing(2) },\n list: { gap: theme.spacing(1) },\n chips: { flexDirection: 'row', flexWrap: 'wrap', gap: theme.spacing(1.5) },\n figure: { flexDirection: 'row', alignItems: 'baseline', gap: theme.spacing(2), minWidth: 0 },\n row: { flexDirection: 'row', alignItems: 'baseline', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n small: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n mono: {\n fontFamily: fontOf(theme.fontFamily.mono),\n fontSize: theme.fontSize.sm,\n lineHeight: theme.lineHeight.sm,\n },\n strong: { color: theme.colors.text, fontWeight: theme.fontWeight.semibold },\n text: { color: theme.colors.text },\n dim: { color: theme.colors.dim },\n faint: { color: theme.colors.faint },\n error: { color: theme.colors.red },\n // The primary piece stays whole up to most of the row; the secondary detail truncates first.\n keep: { flexShrink: 0, maxWidth: '60%' },\n yield: { flexShrink: 1, minWidth: 0 },\n key: { flexShrink: 0, maxWidth: '40%' },\n ref: { flexShrink: 0, marginLeft: 'auto' },\n}));\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerActionCallParts } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_action tool's timeline item on native, as the web's: the action\n * and the element it targets in the header, the outcome's first lines beneath.\n */\nexport function ComputerActionToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n const [kind, ...target] = computerActionCallParts(args);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {kind === undefined ? null : (\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {kind}\n </Text>\n )}\n {target.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.detail]}>\n {target.join(' ')}\n </Text>\n ) : null}\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n // The action is what Po did, so it stays whole; the element it targeted yields first.\n primary: { flexShrink: 0, maxWidth: '45%', color: theme.colors.text },\n detail: { flexShrink: 1, color: theme.colors.dim },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerActionToolCard } from './_components/ComputerActionToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_action'], message: ComputerActionToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerExecCallSummary, computerExecPathParts } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_exec tool's timeline item on native, as the web's: the script\n * path in the header, the run's first lines beneath it.\n */\nexport function ComputerExecToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n const path = computerExecPathParts(computerExecCallSummary(args));\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n {/* A long path loses its folder first, so the script name stays readable. */}\n {path.folder.length > 0 ? (\n <Text numberOfLines={1} style={[styles.sans, styles.folder]}>\n {path.folder}\n </Text>\n ) : null}\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {path.name}\n </Text>\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n folder: { flexShrink: 1, minWidth: 0, color: theme.colors.dim },\n primary: { flexShrink: 0, maxWidth: '100%', color: theme.colors.text },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerExecToolCard } from './_components/ComputerExecToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_exec'], message: ComputerExecToolCard });\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/native';\nimport { fontOf, MessageItem, MessageItemHeader, toolTone } from '@agimon-ai/po-native-components';\nimport type { PoNativeTheme } from '@agimon-ai/po-web-components/nativeTheme';\nimport { Text, View } from 'react-native';\nimport { StyleSheet } from 'react-native-unistyles';\n\nimport { computerStateCallSummary } from '../_lib/computerToolView';\nimport { ComputerResultBody, computerResultExpandable } from './ComputerResultBody.native';\n\n/**\n * The computer_state tool's timeline item on native, as the web's: the observed\n * window in the header, the observation's first lines beneath it.\n */\nexport function ComputerStateToolCard(props: ToolMessageRenderProps) {\n const { toolName, args, running, isError } = props;\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={computerResultExpandable(props)}>\n {({ expanded }) => (\n <>\n <MessageItemHeader title={toolName}>\n <View testID={`tool-call-${toolName}`} style={styles.summary}>\n <Text numberOfLines={1} style={[styles.sans, styles.primary]}>\n {computerStateCallSummary(args)}\n </Text>\n </View>\n </MessageItemHeader>\n <ComputerResultBody props={props} expanded={expanded} />\n </>\n )}\n </MessageItem>\n );\n}\n\nconst styles = StyleSheet.create((theme: PoNativeTheme) => ({\n summary: { flex: 1, flexDirection: 'row', alignItems: 'center', gap: theme.spacing(2), minWidth: 0 },\n sans: {\n fontFamily: fontOf(theme.fontFamily.sans),\n fontSize: theme.fontSize.base,\n lineHeight: theme.lineHeight.base,\n },\n primary: { flexShrink: 1, color: theme.colors.text },\n}));\n","import { defineToolRenderer } from '@agimon-ai/po-core/native';\n\nimport { ComputerStateToolCard } from './_components/ComputerStateToolCard.native';\n\nexport default defineToolRenderer({ tools: ['computer_state'], message: ComputerStateToolCard });\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineNativePlugin, type WebPluginContributions } from '@agimon-ai/po-core/native';\n\nimport settingDesktopPermissions from '../src/extensions/(frontend)/setting/desktop-permissions.panel.native';\nimport activityGroupComputerUse from '../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.native';\nimport channelComputerUse from '../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.native';\nimport fillComputerUse from '../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.native';\nimport toolComputerAction from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.native';\nimport toolComputerExec from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.native';\nimport toolComputerState from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.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: 'computer-use',\n global: {\n get settingsPanels(): WebPluginContributions['settingsPanels'] { return [via({ id: 'desktop-permissions' }, settingDesktopPermissions)]; },\n },\n session: {\n get activityGroups(): WebPluginContributions['activityGroups'] { return [via({ name: 'computer-use' }, activityGroupComputerUse)]; },\n get channels(): WebPluginContributions['channels'] { return [via({ channel: 'computer_use' }, channelComputerUse)]; },\n get fills(): WebPluginContributions['fills'] { return [via({ slot: 'activity.computer-use', id: 'computer-use' }, fillComputerUse)]; },\n get toolRenderers(): WebPluginContributions['toolRenderers'] { return [via({ tools: ['computer_action'] }, toolComputerAction), via({ tools: ['computer_exec'] }, toolComputerExec), via({ tools: ['computer_state'] }, toolComputerState)]; },\n },\n});\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-computer-use",
3
- "version": "0.0.0-alpha.81",
3
+ "version": "0.0.0-alpha.83",
4
4
  "description": "Session scoped semantic computer control through the Po Desktop capability.",
5
5
  "keywords": [
6
6
  "ai",
@@ -63,19 +63,19 @@
63
63
  "access": "public"
64
64
  },
65
65
  "dependencies": {
66
- "@agimon-ai/po-config": "0.0.0-alpha.81",
67
- "@agimon-ai/po-core": "0.0.0-alpha.81",
68
- "@agimon-ai/po-minor-mode": "0.0.0-alpha.81",
69
- "@agimon-ai/po-web-components": "0.0.0-alpha.81",
70
- "@agimon-ai/po-web-security": "0.0.0-alpha.81",
66
+ "@agimon-ai/po-config": "0.0.0-alpha.83",
67
+ "@agimon-ai/po-core": "0.0.0-alpha.83",
68
+ "@agimon-ai/po-minor-mode": "0.0.0-alpha.83",
69
+ "@agimon-ai/po-web-components": "0.0.0-alpha.83",
70
+ "@agimon-ai/po-web-security": "0.0.0-alpha.83",
71
71
  "@deepseek-ai/cordis": "4.0.5",
72
72
  "quickjs-emscripten": "0.32.0",
73
73
  "typebox": "1.4.2"
74
74
  },
75
75
  "devDependencies": {
76
- "@agimon-ai/po-build": "0.0.0-alpha.81",
77
- "@agimon-ai/po-native-components": "0.0.0-alpha.81",
78
- "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.81",
76
+ "@agimon-ai/po-build": "0.0.0-alpha.83",
77
+ "@agimon-ai/po-native-components": "0.0.0-alpha.83",
78
+ "@agimon-ai/vibe-lint-plugin-po-extension": "0.0.0-alpha.83",
79
79
  "@earendil-works/pi-coding-agent": "1.4.0",
80
80
  "@tanstack/react-store": "0.11.2",
81
81
  "@tanstack/store": "0.11.2",
@@ -91,7 +91,7 @@
91
91
  "vitest": "5.0.4"
92
92
  },
93
93
  "peerDependencies": {
94
- "@agimon-ai/po-native-components": "0.0.0-alpha.81",
94
+ "@agimon-ai/po-native-components": "0.0.0-alpha.83",
95
95
  "@earendil-works/pi-coding-agent": "1.4.0",
96
96
  "react-native": "0.88.0",
97
97
  "react-native-unistyles": "^3.5.3"
@@ -136,6 +136,7 @@
136
136
  ],
137
137
  "client": "./dist/extensions/native.mjs",
138
138
  "scopes": [
139
+ "global",
139
140
  "session"
140
141
  ]
141
142
  },