@agimon-ai/po-computer-use 0.0.0-alpha.2 → 0.0.0-alpha.21

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.
@@ -29,8 +29,8 @@ var computer_use_web_default$2 = defineSettingsSection({ settingsSections: [comp
29
29
  //#region src/types/computerUseApi.ts
30
30
  const computerUseChannelType = "computer_use_state";
31
31
  const COMPUTER_USE_MODE_ID = "computer-use";
32
- const COMPUTER_USE_STATUS_KEY = "doom-computer-use";
33
- const COMPUTER_USE_MODE_STATUS_KEY = "doom-computer-use-mode";
32
+ const COMPUTER_USE_STATUS_KEY = "po-computer-use";
33
+ const COMPUTER_USE_MODE_STATUS_KEY = "po-computer-use-mode";
34
34
  const COMPUTER_USE_DEFAULT_DURATION_MS = 3e5;
35
35
  /**
36
36
  * Every path this API answers on, below its mount.
@@ -295,7 +295,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
295
295
  recordingAccessDenied
296
296
  ]);
297
297
  if (sessionId === null) return /* @__PURE__ */ jsx("p", {
298
- className: "px-1 text-sm text-doom-dim",
298
+ className: "px-1 text-sm text-po-dim",
299
299
  children: "Select a session."
300
300
  });
301
301
  const state = session.state;
@@ -325,31 +325,31 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
325
325
  };
326
326
  return /* @__PURE__ */ jsxs("div", {
327
327
  "data-testid": "computer-use-panel",
328
- className: "flex flex-col gap-2 text-base text-doom-text",
328
+ className: "flex flex-col gap-2 text-base text-po-text",
329
329
  children: [
330
330
  /* @__PURE__ */ jsxs("header", {
331
331
  className: "flex items-center justify-between gap-2",
332
332
  children: [/* @__PURE__ */ jsx("span", {
333
- className: "text-doom-dim",
333
+ className: "text-po-dim",
334
334
  children: state.phase.replaceAll("_", " ")
335
335
  }), /* @__PURE__ */ jsx(Button, {
336
336
  size: "sm",
337
337
  type: "button",
338
- className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
338
+ className: "min-h-7 rounded border border-po-border bg-po-panel px-2 py-1",
339
339
  onClick: () => send({ action: "targets" }),
340
340
  children: "Refresh targets"
341
341
  })]
342
342
  }),
343
343
  session.busy ? /* @__PURE__ */ jsx("p", {
344
- className: "rounded border border-doom-yellow px-2 py-1",
344
+ className: "rounded border border-po-yellow px-2 py-1",
345
345
  children: "Computer use is busy in another session"
346
346
  }) : null,
347
347
  state.failure ? /* @__PURE__ */ jsx("p", {
348
- className: "text-doom-red",
348
+ className: "text-po-red",
349
349
  children: state.failure.message
350
350
  }) : null,
351
351
  error ? /* @__PURE__ */ jsx("p", {
352
- className: "text-doom-red",
352
+ className: "text-po-red",
353
353
  children: error
354
354
  }) : null,
355
355
  (state.phase === "inactive" || state.phase === "failed") && confirmationTarget === void 0 ? /* @__PURE__ */ jsxs("div", {
@@ -363,7 +363,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
363
363
  id: "computer-use-target",
364
364
  value: selected,
365
365
  onChange: (event) => setSelected(Number(event.target.value)),
366
- className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
366
+ className: "min-h-7 rounded border border-po-border bg-po-panel px-2 py-1",
367
367
  children: session.targets.map((item, index) => /* @__PURE__ */ jsx("option", {
368
368
  value: index,
369
369
  children: text(item.applicationName, text(item.windowTitle, text(item.windowId, "Window")))
@@ -383,11 +383,11 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
383
383
  ]
384
384
  }) : null,
385
385
  confirmationTarget !== void 0 ? /* @__PURE__ */ jsxs("div", {
386
- className: "rounded border border-doom-blue p-3",
386
+ className: "rounded border border-po-blue p-3",
387
387
  children: [
388
388
  /* @__PURE__ */ jsx("strong", { children: "Confirm computer control" }),
389
389
  /* @__PURE__ */ jsxs("p", {
390
- className: "my-2 text-doom-text",
390
+ className: "my-2 text-po-text",
391
391
  children: [
392
392
  text(confirmationTarget.applicationName, "Application"),
393
393
  ":",
@@ -396,7 +396,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
396
396
  ]
397
397
  }),
398
398
  /* @__PURE__ */ jsx("p", {
399
- className: "my-2 text-doom-dim",
399
+ className: "my-2 text-po-dim",
400
400
  children: "Confirm a 5 minute session for this exact application window."
401
401
  }),
402
402
  /* @__PURE__ */ jsxs("div", {
@@ -410,7 +410,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
410
410
  }), /* @__PURE__ */ jsx(Button, {
411
411
  size: "sm",
412
412
  type: "button",
413
- className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
413
+ className: "min-h-7 rounded border border-po-border bg-po-panel px-2 py-1",
414
414
  onClick: () => setConfirmationTarget(void 0),
415
415
  children: "Cancel"
416
416
  })]
@@ -440,19 +440,19 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
440
440
  size: "sm",
441
441
  type: "button",
442
442
  disabled: state.phase === "stopping",
443
- className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
443
+ className: "min-h-7 rounded border border-po-border bg-po-panel px-2 py-1",
444
444
  onClick: () => send({ action: "stop" }),
445
445
  children: "Stop computer use"
446
446
  }) : null,
447
447
  artifact ? /* @__PURE__ */ jsxs("div", {
448
448
  "data-testid": "computer-use-artifact",
449
- className: "rounded bg-doom-panel p-2",
449
+ className: "rounded bg-po-panel p-2",
450
450
  children: [
451
451
  /* @__PURE__ */ jsx("strong", { children: artifact.status === "ready" ? "Completed recording" : "Recording unavailable" }),
452
452
  /* @__PURE__ */ jsxs("p", { children: ["ID: ", artifact.artifactId] }),
453
453
  /* @__PURE__ */ jsxs("p", { children: ["Status: ", artifact.status] }),
454
454
  artifact.failure ? /* @__PURE__ */ jsx("p", {
455
- className: "text-doom-red",
455
+ className: "text-po-red",
456
456
  children: artifact.failure.message
457
457
  }) : null,
458
458
  artifact.completedAt ? /* @__PURE__ */ jsxs("p", { children: ["Completed: ", artifact.completedAt] }) : null,
@@ -466,7 +466,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
466
466
  children: /* @__PURE__ */ jsx("track", { kind: "captions" })
467
467
  }) : null,
468
468
  artifact.status === "ready" && recordingUrl ? /* @__PURE__ */ jsx("a", {
469
- className: "mt-2 inline-block text-doom-blue",
469
+ className: "mt-2 inline-block text-po-blue",
470
470
  href: recordingUrl,
471
471
  download: "Po-recording.mp4",
472
472
  children: "Download recording"
@@ -516,7 +516,7 @@ function ComputerActionToolCard({ toolName, args, result, running, isError }) {
516
516
  title: toolName,
517
517
  children: /* @__PURE__ */ jsx("span", {
518
518
  "data-testid": `tool-call-${toolName}`,
519
- className: "min-w-0 flex-1 truncate text-doom-text",
519
+ className: "min-w-0 flex-1 truncate text-po-text",
520
520
  children: computerActionCallSummary(args)
521
521
  })
522
522
  }), view.shown.length > 0 || running || isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
@@ -571,7 +571,7 @@ function ComputerExecToolCard({ toolName, args, result, running, isError }) {
571
571
  title: toolName,
572
572
  children: /* @__PURE__ */ jsx("span", {
573
573
  "data-testid": `tool-call-${toolName}`,
574
- className: "min-w-0 flex-1 truncate text-doom-text",
574
+ className: "min-w-0 flex-1 truncate text-po-text",
575
575
  children: computerExecCallSummary(args)
576
576
  })
577
577
  }), view.shown.length > 0 || running || isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
@@ -636,7 +636,7 @@ function ComputerStateToolCard({ toolName, args, result, running, isError }) {
636
636
  title: toolName,
637
637
  children: /* @__PURE__ */ jsx("span", {
638
638
  "data-testid": `tool-call-${toolName}`,
639
- className: "min-w-0 flex-1 truncate text-doom-text",
639
+ className: "min-w-0 flex-1 truncate text-po-text",
640
640
  children: computerStateCallSummary(args)
641
641
  })
642
642
  }), view.shown.length > 0 || running || isError ? /* @__PURE__ */ jsxs(MessageItemBody, {
@@ -1 +1 @@
1
- {"version":3,"file":"web.mjs","names":["legacy","legacy","routes","legacy","legacy","legacy","legacy","legacy","legacy","legacy","settingComputerUse","settingComputerUse2","activityGroupComputerUse","channelComputerUse","fillComputerUse","modeComputerUse","toolComputerAction","toolComputerExec","toolComputerState"],"sources":["../../src/extensions/(frontend)/_lib/computerUseSettings.ts","../../src/extensions/(frontend)/_legacy/index.ts","../../src/extensions/(frontend)/setting/computer-use.web.ts","../../src/extensions/workspaces/(frontend)/_legacy/index.ts","../../src/extensions/workspaces/(frontend)/setting/computer-use.web.ts","../../src/types/computerUseApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseStore.ts","../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseRecording.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/ComputerUsePanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerActionToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerActionToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerExecToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerExecToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerStateToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerStateToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/_legacy/index.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.web.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.web.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/mode/computer-use/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { SettingsSectionContribution } from '@agimon-ai/po-core/web';\n\nexport const computerUseSettingsSection: SettingsSectionContribution = {\n id: 'computer-use',\n desktopOnly: true,\n label: 'computer use',\n detail: 'control whether Po Desktop may expose session-scoped computer control',\n order: 45,\n fields: [\n {\n id: 'enabled',\n label: 'enable computer use',\n kind: 'toggle',\n keyPath: ['computerUse', 'enabled'],\n detail: 'Makes the computer-use minor mode available. Each control session still requires native confirmation.',\n },\n ],\n};\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport { computerUseSettingsSection } from '../_lib/computerUseSettings';\n\nexport default {\n settingsSections: [computerUseSettingsSection],\n} satisfies NonNullable<WebPluginDefinition['global']>;\n","import { defineSettingsSection } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport { computerUseSettingsSection } from '../../../(frontend)/_lib/computerUseSettings';\n\nexport default {\n settingsSections: [computerUseSettingsSection],\n} satisfies NonNullable<WebPluginDefinition['workspace']>;\n","import { defineSettingsSection } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { DoomApiCaller } 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 = 'doom-computer-use';\nexport const COMPUTER_USE_MODE_STATUS_KEY = 'doom-computer-use-mode';\nexport const COMPUTER_USE_MAX_DURATION_MS = 1_800 * 1_000;\nexport const COMPUTER_USE_DEFAULT_DURATION_MS = 300 * 1_000;\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 readonly caller: DoomApiCaller;\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 { defineSessionStore } from '@agimon-ai/po-core/web';\n\nimport { computerUseChannelType } from '../../../../../types/computerUseApi';\nimport type { ComputerUseChannelPayload } 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\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 { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\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 */\nexport default defineApiRoutes({\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: apiResponse<ComputerUseSessionView>(),\n },\n cancelActivation: {\n method: 'DELETE',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: apiResponse<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: apiResponse<unknown>(),\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: apiResponse<unknown>(),\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: apiResponse<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: apiResponse<ComputerUseActivationRequest | null>(),\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: apiResponse<{ readonly grantId: string; readonly expiresAt?: number } | null>(),\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: apiResponse<ComputerUseBrokerRequest | null>(),\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/po-core/web';\nimport { sealedTransport } from '@agimon-ai/po-web-security/browser';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'computer-use' at. */\nexport const apiScopes = ['session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'computer-use',\n transport: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\n});\n","import { api } from '../../../../../../generated/client';\n\nconst MAX_RECORDING_BYTES = 128 * 1024 * 1024;\nconst CHUNK_BYTES = 1024 * 1024;\n\n/** Owns only a bounded sealed download and its disposable browser URL. */\nexport async function loadComputerUseRecording(\n sessionId: string,\n artifactId: string,\n sizeBytes: number,\n signal: AbortSignal,\n): Promise<{ url: string; dispose(): void }> {\n if (!Number.isSafeInteger(sizeBytes) || sizeBytes < 1 || sizeBytes > MAX_RECORDING_BYTES)\n throw new Error('Recording exceeds the permitted size.');\n const parts: ArrayBuffer[] = [];\n for (let offset = 0; offset < sizeBytes; offset += CHUNK_BYTES) {\n signal.throwIfAborted();\n const result = await api.session(sessionId).artifact({ query: { artifactId, offset }, signal });\n if (!result.ok || result.status !== 206) throw new Error('The recording is unavailable or access was revoked.');\n const end = Math.min(offset + CHUNK_BYTES, sizeBytes) - 1;\n if (result.response.headers.get('content-range') !== `bytes ${offset}-${end}/${sizeBytes}`)\n throw new Error('The recording response is invalid.');\n const bytes = await result.response.arrayBuffer();\n signal.throwIfAborted();\n if (bytes.byteLength !== end - offset + 1) throw new Error('The recording response is incomplete.');\n parts.push(bytes);\n }\n signal.throwIfAborted();\n const url = URL.createObjectURL(new Blob(parts, { type: 'video/mp4' }));\n let disposed = false;\n return {\n url,\n dispose() {\n if (!disposed) {\n disposed = true;\n URL.revokeObjectURL(url);\n }\n },\n };\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { Button } from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { api } from '../../../../../../../generated/client';\nimport { COMPUTER_USE_DEFAULT_DURATION_MS, computerUseChannelType } from '../../../../../../types/computerUseApi';\nimport { loadComputerUseRecording } from '../../_lib/computerUseRecording';\nimport { computerUse } from '../../_lib/computerUseStore';\n\nfunction text(value: unknown, fallback: string): string {\n return typeof value === 'string' || typeof value === 'number' ? String(value) : fallback;\n}\n\nexport function ComputerUsePanel({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const session = useStore(computerUse.store, (state) => computerUse.select(state, sessionId));\n const [selected, setSelected] = useState(0);\n const [confirmationTarget, setConfirmationTarget] = useState<Record<string, unknown>>();\n const [error, setError] = useState<string>();\n const [recordingUrl, setRecordingUrl] = useState<string>();\n const [recordingAccessDenied, setRecordingAccessDenied] = useState(false);\n const send = (payload: Record<string, unknown>) => {\n if (sessionId !== null) sendSessionFrame(sessionId, { type: computerUseChannelType, payload });\n };\n\n useEffect(() => {\n if (sessionId === null) return;\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'status' } });\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'targets' } });\n }, [sendSessionFrame, sessionId]);\n\n useEffect(() => {\n if (sessionId === null) return;\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const poll = async () => {\n try {\n const result = await api.session(sessionId).activationState({ signal: controller.signal });\n if (controller.signal.aborted) return;\n setRecordingAccessDenied(!result.ok);\n if (result.ok) {\n computerUse.update(sessionId, (current) =>\n result.data.revision >= current.state.revision ? { ...current, state: result.data } : current,\n );\n }\n } catch {\n // A closed session or standalone story may no longer have an API address.\n // Fail closed and dispose any existing recording instead of rejecting globally.\n if (!controller.signal.aborted) setRecordingAccessDenied(true);\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]);\n\n const artifactId = session.state.artifact?.artifactId;\n const artifactSize = session.state.artifact?.sizeBytes;\n const artifactStatus = session.state.artifact?.status;\n useEffect(() => {\n setRecordingUrl(undefined);\n if (\n recordingAccessDenied ||\n sessionId === null ||\n artifactId === undefined ||\n artifactSize === undefined ||\n artifactStatus !== 'ready'\n )\n return;\n const controller = new AbortController();\n let asset: Awaited<ReturnType<typeof loadComputerUseRecording>> | undefined;\n void loadComputerUseRecording(sessionId, artifactId, artifactSize, controller.signal)\n .then((loaded) => {\n if (controller.signal.aborted) loaded.dispose();\n else {\n asset = loaded;\n setRecordingUrl(loaded.url);\n }\n })\n .catch(() => {\n if (!controller.signal.aborted) setError('The recording is unavailable or access was revoked.');\n });\n return () => {\n controller.abort();\n asset?.dispose();\n };\n }, [sessionId, artifactId, artifactSize, artifactStatus, recordingAccessDenied]);\n\n if (sessionId === null) return <p className=\"px-1 text-sm text-doom-dim\">Select a session.</p>;\n const state = session.state;\n const target = session.targets[selected];\n const artifact = state.artifact;\n const confirm = async (chosenTarget = confirmationTarget) => {\n setError(undefined);\n try {\n // Through the generated client, which carries the sealed transport: this\n // request names an application window a reader just agreed to hand over,\n // and the global fetch it used to call handed that to a remote session's\n // relay in the clear.\n const result = await api.session(sessionId).activate({\n body: {\n ...(chosenTarget === undefined ? {} : { target: chosenTarget }),\n durationMs: COMPUTER_USE_DEFAULT_DURATION_MS,\n },\n });\n if (!result.ok) {\n // `status: 0` is the one case nothing answered at all, which the old\n // bare fetch reported by rejecting into nobody's handler.\n if (result.status === 0) setError('The session is unreachable.');\n else setError(result.error === '' ? `Activation failed with HTTP ${result.status}.` : result.error);\n return;\n }\n setConfirmationTarget(undefined);\n computerUse.update(sessionId, (current) => ({ ...current, state: result.data }));\n send({ action: 'status' });\n } catch {\n setError('The activation request is unavailable.');\n }\n };\n\n return (\n <div data-testid=\"computer-use-panel\" className=\"flex flex-col gap-2 text-base text-doom-text\">\n <header className=\"flex items-center justify-between gap-2\">\n <span className=\"text-doom-dim\">{state.phase.replaceAll('_', ' ')}</span>\n <Button\n size=\"sm\"\n type=\"button\"\n className=\"min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1\"\n onClick={() => send({ action: 'targets' })}\n >\n Refresh targets\n </Button>\n </header>\n {session.busy ? (\n <p className=\"rounded border border-doom-yellow px-2 py-1\">Computer use is busy in another session</p>\n ) : null}\n {state.failure ? <p className=\"text-doom-red\">{state.failure.message}</p> : null}\n {error ? <p className=\"text-doom-red\">{error}</p> : null}\n\n {(state.phase === 'inactive' || state.phase === 'failed') && confirmationTarget === undefined ? (\n <div className=\"flex flex-col gap-2\">\n <label htmlFor=\"computer-use-target\">Application window</label>\n <select\n id=\"computer-use-target\"\n value={selected}\n onChange={(event) => setSelected(Number(event.target.value))}\n className=\"min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1\"\n >\n {session.targets.map((item, index) => (\n <option key={text(item.windowId, String(index))} value={index}>\n {text(item.applicationName, text(item.windowTitle, text(item.windowId, 'Window')))}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n type=\"button\"\n disabled={Boolean(session.busy)}\n variant=\"primary\"\n onClick={() => {\n if (target === undefined) void confirm();\n else setConfirmationTarget(Object.freeze({ ...target }));\n }}\n >\n {target === undefined ? 'Choose window on Mac' : 'Request activation'}\n </Button>\n </div>\n ) : null}\n\n {confirmationTarget !== undefined ? (\n <div className=\"rounded border border-doom-blue p-3\">\n <strong>Confirm computer control</strong>\n <p className=\"my-2 text-doom-text\">\n {text(confirmationTarget.applicationName, 'Application')}:{' '}\n {text(confirmationTarget.windowTitle, text(confirmationTarget.windowId, 'Window'))}\n </p>\n <p className=\"my-2 text-doom-dim\">Confirm a 5 minute session for this exact application window.</p>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" type=\"button\" variant=\"primary\" onClick={() => void confirm()}>\n Confirm\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n className=\"min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1\"\n onClick={() => setConfirmationTarget(undefined)}\n >\n Cancel\n </Button>\n </div>\n </div>\n ) : null}\n\n {state.phase === 'awaiting_confirmation' || state.phase === 'activating' ? (\n <div>\n <p>Desktop activation is pending.</p>\n <Button\n size=\"sm\"\n type=\"button\"\n onClick={() => {\n void (async () => {\n try {\n const result = await api.session(sessionId).cancelActivation();\n if (!result.ok) setError('The activation could not be cancelled.');\n else computerUse.update(sessionId, (current) => ({ ...current, state: result.data }));\n } catch {\n setError('The activation could not be cancelled.');\n }\n })();\n }}\n >\n Cancel activation\n </Button>\n </div>\n ) : null}\n {state.phase === 'active' || state.phase === 'stopping' ? (\n <Button\n size=\"sm\"\n type=\"button\"\n disabled={state.phase === 'stopping'}\n className=\"min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1\"\n onClick={() => send({ action: 'stop' })}\n >\n Stop computer use\n </Button>\n ) : null}\n {artifact ? (\n <div data-testid=\"computer-use-artifact\" className=\"rounded bg-doom-panel p-2\">\n <strong>{artifact.status === 'ready' ? 'Completed recording' : 'Recording unavailable'}</strong>\n <p>ID: {artifact.artifactId}</p>\n <p>Status: {artifact.status}</p>\n {artifact.failure ? <p className=\"text-doom-red\">{artifact.failure.message}</p> : null}\n {artifact.completedAt ? <p>Completed: {artifact.completedAt}</p> : null}\n {artifact.actionCount !== undefined ? <p>Actions: {artifact.actionCount}</p> : null}\n {artifact.status === 'ready' && artifact.sizeBytes && !recordingUrl ? (\n <p>Loading recording through the secure channel.</p>\n ) : null}\n {artifact.status === 'ready' && recordingUrl ? (\n <video className=\"mt-2 w-full\" controls preload=\"metadata\" src={recordingUrl}>\n <track kind=\"captions\" />\n </video>\n ) : null}\n {artifact.status === 'ready' && recordingUrl ? (\n <a className=\"mt-2 inline-block text-doom-blue\" href={recordingUrl} download=\"Po-recording.mp4\">\n Download recording\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerActionToolName = 'computer_action' as const;\nexport const computerActionCollapsedLines = 8;\n\nexport function computerActionCallSummary(args: Readonly<Record<string, unknown>>): 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).join(' ');\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function computerActionResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerActionCallSummary,\n computerActionCollapsedLines,\n computerActionResultLines,\n} from '../_lib/computerActionToolRender';\n\n/**\n * The computer_action tool's timeline item: Perform one constrained semantic action in the authorized application window. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function ComputerActionToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerActionResultLines(result);\n const collapsed = collapseLines(lines, computerActionCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerActionCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {computerActionCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerExecToolName = 'computer_exec' as const;\nexport const computerExecCollapsedLines = 8;\n\nexport function computerExecCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.scriptPath === 'string' ? args.scriptPath : '';\n}\n\nexport function computerExecResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerExecCallSummary,\n computerExecCollapsedLines,\n computerExecResultLines,\n} from '../_lib/computerExecToolRender';\n\nexport function ComputerExecToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerExecResultLines(result);\n const collapsed = collapseLines(lines, computerExecCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerExecCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {computerExecCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerStateToolName = 'computer_state' as const;\nexport const computerStateCollapsedLines = 8;\n\nexport function computerStateCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return 'authorized window';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function computerStateResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerStateCallSummary,\n computerStateCollapsedLines,\n computerStateResultLines,\n} from '../_lib/computerStateToolRender';\n\n/**\n * The computer_state tool's timeline item: Observe the authorized application window and semantic accessibility state. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function ComputerStateToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerStateResultLines(result);\n const collapsed = collapseLines(lines, computerStateCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerStateCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-doom-text\">\n {computerStateCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_MODE_ID,\n COMPUTER_USE_MODE_STATUS_KEY,\n COMPUTER_USE_STATUS_KEY,\n} from '../../../../../types/computerUseApi';\nimport { computerUseChannel } from '../_lib/computerUseStore';\nimport { ComputerUsePanel } from '../fill/_components/ComputerUsePanel';\nimport { ComputerActionToolCard } from '../tool/_components/ComputerActionToolCard';\nimport { ComputerExecToolCard } from '../tool/_components/ComputerExecToolCard';\nimport { ComputerStateToolCard } from '../tool/_components/ComputerStateToolCard';\nimport { computerActionToolName } from '../tool/_lib/computerActionToolRender';\nimport { computerExecToolName } from '../tool/_lib/computerExecToolRender';\nimport { computerStateToolName } from '../tool/_lib/computerStateToolRender';\n\nexport default {\n minorModes: [\n {\n name: 'computer use',\n modeId: COMPUTER_USE_MODE_ID,\n keys: 'c e',\n statusKey: COMPUTER_USE_MODE_STATUS_KEY,\n hideWhenMissing: true,\n desktopOnly: true,\n order: 70,\n },\n ],\n activityGroups: [\n {\n name: 'computer-use',\n keys: 'c e',\n order: 70,\n statusKey: COMPUTER_USE_STATUS_KEY,\n hideWhenEmpty: true,\n desktopOnly: true,\n marksBackgroundWork: false,\n },\n ],\n activitySections: [{ id: 'computer-use', component: ComputerUsePanel }],\n channels: [computerUseChannel],\n toolRenderers: [\n { tools: [computerStateToolName], message: ComputerStateToolCard },\n { tools: [computerActionToolName], message: ComputerActionToolCard },\n { tools: [computerExecToolName], message: ComputerExecToolCard },\n ],\n} satisfies NonNullable<WebPluginDefinition['session']>;\n","import { defineActivityGroup } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineActivityGroup(legacy.activityGroups![0]!);\n","import { defineChannelFile } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineChannelFile(legacy.channels![0]!);\n","import { defineFill } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineFill({ slot: 'activity.computer-use', ...legacy.activitySections![0]! });\n","import { defineMinorModeFile } from '@agimon-ai/po-core/web';\n\nimport legacy from '../../_legacy';\n\nexport default defineMinorModeFile(legacy.minorModes![0]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![1]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![2]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![0]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport settingComputerUse from '../src/extensions/(frontend)/setting/computer-use.web';\nimport settingComputerUse2 from '../src/extensions/workspaces/(frontend)/setting/computer-use.web';\nimport activityGroupComputerUse from '../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.web';\nimport channelComputerUse from '../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.web';\nimport fillComputerUse from '../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.web';\nimport modeComputerUse from '../src/extensions/workspaces/sessions/(frontend)/mode/computer-use/mode.web';\nimport toolComputerAction from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.web';\nimport toolComputerExec from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.web';\nimport toolComputerState from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'computer-use',\n global: {\n get settingsSections(): WebPluginContributions['settingsSections'] { return [via({ id: 'computer-use' }, settingComputerUse)]; },\n },\n workspace: {\n get settingsSections(): WebPluginContributions['settingsSections'] { return [via({ id: 'computer-use' }, settingComputerUse2)]; },\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 minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'computer-use' }, modeComputerUse)]; },\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":"web.mjs","names":["legacy","legacy","routes","legacy","legacy","legacy","legacy","legacy","legacy","legacy","settingComputerUse","settingComputerUse2","activityGroupComputerUse","channelComputerUse","fillComputerUse","modeComputerUse","toolComputerAction","toolComputerExec","toolComputerState"],"sources":["../../src/extensions/(frontend)/_lib/computerUseSettings.ts","../../src/extensions/(frontend)/_legacy/index.ts","../../src/extensions/(frontend)/setting/computer-use.web.ts","../../src/extensions/workspaces/(frontend)/_legacy/index.ts","../../src/extensions/workspaces/(frontend)/setting/computer-use.web.ts","../../src/types/computerUseApi.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseStore.ts","../../src/types/apiRoutes.ts","../../generated/client.ts","../../src/extensions/workspaces/sessions/(frontend)/_lib/computerUseRecording.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/_components/ComputerUsePanel.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerActionToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerActionToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerExecToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerExecToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/_lib/computerStateToolRender.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/_components/ComputerStateToolCard.tsx","../../src/extensions/workspaces/sessions/(frontend)/_legacy/index.ts","../../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.web.ts","../../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.web.ts","../../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/mode/computer-use/mode.web.ts","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.web.tsx","../../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.web.tsx","../../generated/web.ts"],"sourcesContent":["import type { SettingsSectionContribution } from '@agimon-ai/po-core/web';\n\nexport const computerUseSettingsSection: SettingsSectionContribution = {\n id: 'computer-use',\n desktopOnly: true,\n label: 'computer use',\n detail: 'control whether Po Desktop may expose session-scoped computer control',\n order: 45,\n fields: [\n {\n id: 'enabled',\n label: 'enable computer use',\n kind: 'toggle',\n keyPath: ['computerUse', 'enabled'],\n detail: 'Makes the computer-use minor mode available. Each control session still requires native confirmation.',\n },\n ],\n};\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport { computerUseSettingsSection } from '../_lib/computerUseSettings';\n\nexport default {\n settingsSections: [computerUseSettingsSection],\n} satisfies NonNullable<WebPluginDefinition['global']>;\n","import { defineSettingsSection } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport { computerUseSettingsSection } from '../../../(frontend)/_lib/computerUseSettings';\n\nexport default {\n settingsSections: [computerUseSettingsSection],\n} satisfies NonNullable<WebPluginDefinition['workspace']>;\n","import { defineSettingsSection } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","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;\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 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 { defineSessionStore } from '@agimon-ai/po-core/web';\n\nimport { computerUseChannelType } from '../../../../../types/computerUseApi';\nimport type { ComputerUseChannelPayload } 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\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 { apiResponse, defineApiRoutes } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_ROUTES,\n type ComputerUseActivationRequest,\n type ComputerUseBrokerRequest,\n type ComputerUseSessionView,\n} from './computerUseApi';\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 */\nexport default defineApiRoutes({\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: apiResponse<ComputerUseSessionView>(),\n },\n cancelActivation: {\n method: 'DELETE',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n activate: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.activate,\n response: apiResponse<ComputerUseSessionView>(),\n },\n agentState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.agentState,\n response: apiResponse<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: apiResponse<unknown>(),\n },\n agentAction: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentAction,\n response: apiResponse<unknown>(),\n },\n agentStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.agentStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubState: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubState,\n response: apiResponse<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: apiResponse<ComputerUseActivationRequest | null>(),\n },\n hubAuthorization: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubAuthorization,\n response: apiResponse<{ readonly grantId: string; readonly expiresAt?: number } | null>(),\n },\n hubNext: {\n method: 'GET',\n path: COMPUTER_USE_ROUTES.hubNext,\n response: apiResponse<ComputerUseBrokerRequest | null>(),\n },\n hubComplete: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubComplete,\n response: apiResponse<ComputerUseSessionView>(),\n },\n hubStop: {\n method: 'POST',\n path: COMPUTER_USE_ROUTES.hubStop,\n response: apiResponse<ComputerUseSessionView>(),\n },\n});\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/po-core/web';\nimport { sealedTransport } from '@agimon-ai/po-web-security/browser';\n\nimport routes from '../src/types/apiRoutes';\n\n/** Scopes the tree mounts 'computer-use' at. */\nexport const apiScopes = ['session'] as const;\n\nexport const api = createApiClient(routes, {\n scopes: apiScopes,\n basePath: 'computer-use',\n transport: (input, init) => sealedTransport.fetch(input, init),\n sessionAddress: sessionApiAddress,\n});\n","import { api } from '../../../../../../generated/client';\n\nconst MAX_RECORDING_BYTES = 128 * 1024 * 1024;\nconst CHUNK_BYTES = 1024 * 1024;\n\n/** Owns only a bounded sealed download and its disposable browser URL. */\nexport async function loadComputerUseRecording(\n sessionId: string,\n artifactId: string,\n sizeBytes: number,\n signal: AbortSignal,\n): Promise<{ url: string; dispose(): void }> {\n if (!Number.isSafeInteger(sizeBytes) || sizeBytes < 1 || sizeBytes > MAX_RECORDING_BYTES)\n throw new Error('Recording exceeds the permitted size.');\n const parts: ArrayBuffer[] = [];\n for (let offset = 0; offset < sizeBytes; offset += CHUNK_BYTES) {\n signal.throwIfAborted();\n const result = await api.session(sessionId).artifact({ query: { artifactId, offset }, signal });\n if (!result.ok || result.status !== 206) throw new Error('The recording is unavailable or access was revoked.');\n const end = Math.min(offset + CHUNK_BYTES, sizeBytes) - 1;\n if (result.response.headers.get('content-range') !== `bytes ${offset}-${end}/${sizeBytes}`)\n throw new Error('The recording response is invalid.');\n const bytes = await result.response.arrayBuffer();\n signal.throwIfAborted();\n if (bytes.byteLength !== end - offset + 1) throw new Error('The recording response is incomplete.');\n parts.push(bytes);\n }\n signal.throwIfAborted();\n const url = URL.createObjectURL(new Blob(parts, { type: 'video/mp4' }));\n let disposed = false;\n return {\n url,\n dispose() {\n if (!disposed) {\n disposed = true;\n URL.revokeObjectURL(url);\n }\n },\n };\n}\n","import type { WebPluginSlotProps } from '@agimon-ai/po-core/web';\nimport { Button } from '@agimon-ai/po-web-components';\nimport { useStore } from '@tanstack/react-store';\nimport { useEffect, useState } from 'react';\n\nimport { api } from '../../../../../../../generated/client';\nimport { COMPUTER_USE_DEFAULT_DURATION_MS, computerUseChannelType } from '../../../../../../types/computerUseApi';\nimport { loadComputerUseRecording } from '../../_lib/computerUseRecording';\nimport { computerUse } from '../../_lib/computerUseStore';\n\nfunction text(value: unknown, fallback: string): string {\n return typeof value === 'string' || typeof value === 'number' ? String(value) : fallback;\n}\n\nexport function ComputerUsePanel({ sessionId, sendSessionFrame }: WebPluginSlotProps) {\n const session = useStore(computerUse.store, (state) => computerUse.select(state, sessionId));\n const [selected, setSelected] = useState(0);\n const [confirmationTarget, setConfirmationTarget] = useState<Record<string, unknown>>();\n const [error, setError] = useState<string>();\n const [recordingUrl, setRecordingUrl] = useState<string>();\n const [recordingAccessDenied, setRecordingAccessDenied] = useState(false);\n const send = (payload: Record<string, unknown>) => {\n if (sessionId !== null) sendSessionFrame(sessionId, { type: computerUseChannelType, payload });\n };\n\n useEffect(() => {\n if (sessionId === null) return;\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'status' } });\n sendSessionFrame(sessionId, { type: computerUseChannelType, payload: { action: 'targets' } });\n }, [sendSessionFrame, sessionId]);\n\n useEffect(() => {\n if (sessionId === null) return;\n const controller = new AbortController();\n let timer: ReturnType<typeof setTimeout> | undefined;\n const poll = async () => {\n try {\n const result = await api.session(sessionId).activationState({ signal: controller.signal });\n if (controller.signal.aborted) return;\n setRecordingAccessDenied(!result.ok);\n if (result.ok) {\n computerUse.update(sessionId, (current) =>\n result.data.revision >= current.state.revision ? { ...current, state: result.data } : current,\n );\n }\n } catch {\n // A closed session or standalone story may no longer have an API address.\n // Fail closed and dispose any existing recording instead of rejecting globally.\n if (!controller.signal.aborted) setRecordingAccessDenied(true);\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]);\n\n const artifactId = session.state.artifact?.artifactId;\n const artifactSize = session.state.artifact?.sizeBytes;\n const artifactStatus = session.state.artifact?.status;\n useEffect(() => {\n setRecordingUrl(undefined);\n if (\n recordingAccessDenied ||\n sessionId === null ||\n artifactId === undefined ||\n artifactSize === undefined ||\n artifactStatus !== 'ready'\n )\n return;\n const controller = new AbortController();\n let asset: Awaited<ReturnType<typeof loadComputerUseRecording>> | undefined;\n void loadComputerUseRecording(sessionId, artifactId, artifactSize, controller.signal)\n .then((loaded) => {\n if (controller.signal.aborted) loaded.dispose();\n else {\n asset = loaded;\n setRecordingUrl(loaded.url);\n }\n })\n .catch(() => {\n if (!controller.signal.aborted) setError('The recording is unavailable or access was revoked.');\n });\n return () => {\n controller.abort();\n asset?.dispose();\n };\n }, [sessionId, artifactId, artifactSize, artifactStatus, recordingAccessDenied]);\n\n if (sessionId === null) return <p className=\"px-1 text-sm text-po-dim\">Select a session.</p>;\n const state = session.state;\n const target = session.targets[selected];\n const artifact = state.artifact;\n const confirm = async (chosenTarget = confirmationTarget) => {\n setError(undefined);\n try {\n // Through the generated client, which carries the sealed transport: this\n // request names an application window a reader just agreed to hand over,\n // and the global fetch it used to call handed that to a remote session's\n // relay in the clear.\n const result = await api.session(sessionId).activate({\n body: {\n ...(chosenTarget === undefined ? {} : { target: chosenTarget }),\n durationMs: COMPUTER_USE_DEFAULT_DURATION_MS,\n },\n });\n if (!result.ok) {\n // `status: 0` is the one case nothing answered at all, which the old\n // bare fetch reported by rejecting into nobody's handler.\n if (result.status === 0) setError('The session is unreachable.');\n else setError(result.error === '' ? `Activation failed with HTTP ${result.status}.` : result.error);\n return;\n }\n setConfirmationTarget(undefined);\n computerUse.update(sessionId, (current) => ({ ...current, state: result.data }));\n send({ action: 'status' });\n } catch {\n setError('The activation request is unavailable.');\n }\n };\n\n return (\n <div data-testid=\"computer-use-panel\" className=\"flex flex-col gap-2 text-base text-po-text\">\n <header className=\"flex items-center justify-between gap-2\">\n <span className=\"text-po-dim\">{state.phase.replaceAll('_', ' ')}</span>\n <Button\n size=\"sm\"\n type=\"button\"\n className=\"min-h-7 rounded border border-po-border bg-po-panel px-2 py-1\"\n onClick={() => send({ action: 'targets' })}\n >\n Refresh targets\n </Button>\n </header>\n {session.busy ? (\n <p className=\"rounded border border-po-yellow px-2 py-1\">Computer use is busy in another session</p>\n ) : null}\n {state.failure ? <p className=\"text-po-red\">{state.failure.message}</p> : null}\n {error ? <p className=\"text-po-red\">{error}</p> : null}\n\n {(state.phase === 'inactive' || state.phase === 'failed') && confirmationTarget === undefined ? (\n <div className=\"flex flex-col gap-2\">\n <label htmlFor=\"computer-use-target\">Application window</label>\n <select\n id=\"computer-use-target\"\n value={selected}\n onChange={(event) => setSelected(Number(event.target.value))}\n className=\"min-h-7 rounded border border-po-border bg-po-panel px-2 py-1\"\n >\n {session.targets.map((item, index) => (\n <option key={text(item.windowId, String(index))} value={index}>\n {text(item.applicationName, text(item.windowTitle, text(item.windowId, 'Window')))}\n </option>\n ))}\n </select>\n <Button\n size=\"sm\"\n type=\"button\"\n disabled={Boolean(session.busy)}\n variant=\"primary\"\n onClick={() => {\n if (target === undefined) void confirm();\n else setConfirmationTarget(Object.freeze({ ...target }));\n }}\n >\n {target === undefined ? 'Choose window on Mac' : 'Request activation'}\n </Button>\n </div>\n ) : null}\n\n {confirmationTarget !== undefined ? (\n <div className=\"rounded border border-po-blue p-3\">\n <strong>Confirm computer control</strong>\n <p className=\"my-2 text-po-text\">\n {text(confirmationTarget.applicationName, 'Application')}:{' '}\n {text(confirmationTarget.windowTitle, text(confirmationTarget.windowId, 'Window'))}\n </p>\n <p className=\"my-2 text-po-dim\">Confirm a 5 minute session for this exact application window.</p>\n <div className=\"flex gap-2\">\n <Button size=\"sm\" type=\"button\" variant=\"primary\" onClick={() => void confirm()}>\n Confirm\n </Button>\n <Button\n size=\"sm\"\n type=\"button\"\n className=\"min-h-7 rounded border border-po-border bg-po-panel px-2 py-1\"\n onClick={() => setConfirmationTarget(undefined)}\n >\n Cancel\n </Button>\n </div>\n </div>\n ) : null}\n\n {state.phase === 'awaiting_confirmation' || state.phase === 'activating' ? (\n <div>\n <p>Desktop activation is pending.</p>\n <Button\n size=\"sm\"\n type=\"button\"\n onClick={() => {\n void (async () => {\n try {\n const result = await api.session(sessionId).cancelActivation();\n if (!result.ok) setError('The activation could not be cancelled.');\n else computerUse.update(sessionId, (current) => ({ ...current, state: result.data }));\n } catch {\n setError('The activation could not be cancelled.');\n }\n })();\n }}\n >\n Cancel activation\n </Button>\n </div>\n ) : null}\n {state.phase === 'active' || state.phase === 'stopping' ? (\n <Button\n size=\"sm\"\n type=\"button\"\n disabled={state.phase === 'stopping'}\n className=\"min-h-7 rounded border border-po-border bg-po-panel px-2 py-1\"\n onClick={() => send({ action: 'stop' })}\n >\n Stop computer use\n </Button>\n ) : null}\n {artifact ? (\n <div data-testid=\"computer-use-artifact\" className=\"rounded bg-po-panel p-2\">\n <strong>{artifact.status === 'ready' ? 'Completed recording' : 'Recording unavailable'}</strong>\n <p>ID: {artifact.artifactId}</p>\n <p>Status: {artifact.status}</p>\n {artifact.failure ? <p className=\"text-po-red\">{artifact.failure.message}</p> : null}\n {artifact.completedAt ? <p>Completed: {artifact.completedAt}</p> : null}\n {artifact.actionCount !== undefined ? <p>Actions: {artifact.actionCount}</p> : null}\n {artifact.status === 'ready' && artifact.sizeBytes && !recordingUrl ? (\n <p>Loading recording through the secure channel.</p>\n ) : null}\n {artifact.status === 'ready' && recordingUrl ? (\n <video className=\"mt-2 w-full\" controls preload=\"metadata\" src={recordingUrl}>\n <track kind=\"captions\" />\n </video>\n ) : null}\n {artifact.status === 'ready' && recordingUrl ? (\n <a className=\"mt-2 inline-block text-po-blue\" href={recordingUrl} download=\"Po-recording.mp4\">\n Download recording\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerActionToolName = 'computer_action' as const;\nexport const computerActionCollapsedLines = 8;\n\nexport function computerActionCallSummary(args: Readonly<Record<string, unknown>>): 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).join(' ');\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function computerActionResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerActionCallSummary,\n computerActionCollapsedLines,\n computerActionResultLines,\n} from '../_lib/computerActionToolRender';\n\n/**\n * The computer_action tool's timeline item: Perform one constrained semantic action in the authorized application window. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function ComputerActionToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerActionResultLines(result);\n const collapsed = collapseLines(lines, computerActionCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerActionCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-po-text\">\n {computerActionCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerExecToolName = 'computer_exec' as const;\nexport const computerExecCollapsedLines = 8;\n\nexport function computerExecCallSummary(args: Readonly<Record<string, unknown>>): string {\n return typeof args.scriptPath === 'string' ? args.scriptPath : '';\n}\n\nexport function computerExecResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerExecCallSummary,\n computerExecCollapsedLines,\n computerExecResultLines,\n} from '../_lib/computerExecToolRender';\n\nexport function ComputerExecToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerExecResultLines(result);\n const collapsed = collapseLines(lines, computerExecCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerExecCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-po-text\">\n {computerExecCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/po-core/web';\nimport type { MessageLine } from '@agimon-ai/po-web-components';\n\nexport const computerStateToolName = 'computer_state' as const;\nexport const computerStateCollapsedLines = 8;\n\nexport function computerStateCallSummary(_args: Readonly<Record<string, unknown>>): string {\n return 'authorized window';\n}\n\n/**\n * The body as toned lines: what the result's details say, or its text. Pure,\n * so a unit test can pin it without a DOM; the item decides how many to show.\n */\nexport function computerStateResultLines(result: ToolResultView | null): MessageLine[] {\n if (result === null) return [];\n return toolResultTextLines(result.content).map((text) => ({ text, tone: 'dim' }));\n}\n","import type { ToolMessageRenderProps } from '@agimon-ai/po-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/po-web-components';\n\nimport {\n computerStateCallSummary,\n computerStateCollapsedLines,\n computerStateResultLines,\n} from '../_lib/computerStateToolRender';\n\n/**\n * The computer_state tool's timeline item: Observe the authorized application window and semantic accessibility state. The shell owns\n * the frame, the outcome tone, the status badge, and the expand toggle; this\n * card supplies the header summary and the body lines, and says whether it\n * hides any so the toggle appears only when it reveals something.\n */\nexport function ComputerStateToolCard({ toolName, args, result, running, isError }: ToolMessageRenderProps) {\n const lines = computerStateResultLines(result);\n const collapsed = collapseLines(lines, computerStateCollapsedLines, false);\n return (\n <MessageItem tone={toolTone({ running, isError })} expandable={collapsed.hidden > 0}>\n {({ expanded }) => {\n const view = expanded ? collapseLines(lines, computerStateCollapsedLines, true) : collapsed;\n return (\n <>\n <MessageItemHeader title={toolName}>\n <span data-testid={`tool-call-${toolName}`} className=\"min-w-0 flex-1 truncate text-po-text\">\n {computerStateCallSummary(args)}\n </span>\n </MessageItemHeader>\n {view.shown.length > 0 || running || isError ? (\n <MessageItemBody data-testid={`tool-result-${toolName}`} className=\"flex flex-col gap-1\">\n {view.shown.length > 0 ? <MessageLines lines={view.shown} /> : null}\n {view.hidden > 0 ? <MessageItemStatus expands>{view.hidden} more line(s)</MessageItemStatus> : null}\n {running ? <MessageItemStatus tone=\"running\">running</MessageItemStatus> : null}\n {isError ? <MessageItemStatus tone=\"error\">failed</MessageItemStatus> : null}\n </MessageItemBody>\n ) : null}\n </>\n );\n }}\n </MessageItem>\n );\n}\n","import type { WebPluginDefinition } from '@agimon-ai/po-core/web';\n\nimport {\n COMPUTER_USE_MODE_ID,\n COMPUTER_USE_MODE_STATUS_KEY,\n COMPUTER_USE_STATUS_KEY,\n} from '../../../../../types/computerUseApi';\nimport { computerUseChannel } from '../_lib/computerUseStore';\nimport { ComputerUsePanel } from '../fill/_components/ComputerUsePanel';\nimport { ComputerActionToolCard } from '../tool/_components/ComputerActionToolCard';\nimport { ComputerExecToolCard } from '../tool/_components/ComputerExecToolCard';\nimport { ComputerStateToolCard } from '../tool/_components/ComputerStateToolCard';\nimport { computerActionToolName } from '../tool/_lib/computerActionToolRender';\nimport { computerExecToolName } from '../tool/_lib/computerExecToolRender';\nimport { computerStateToolName } from '../tool/_lib/computerStateToolRender';\n\nexport default {\n minorModes: [\n {\n name: 'computer use',\n modeId: COMPUTER_USE_MODE_ID,\n keys: 'c e',\n statusKey: COMPUTER_USE_MODE_STATUS_KEY,\n hideWhenMissing: true,\n desktopOnly: true,\n order: 70,\n },\n ],\n activityGroups: [\n {\n name: 'computer-use',\n keys: 'c e',\n order: 70,\n statusKey: COMPUTER_USE_STATUS_KEY,\n hideWhenEmpty: true,\n desktopOnly: true,\n marksBackgroundWork: false,\n },\n ],\n activitySections: [{ id: 'computer-use', component: ComputerUsePanel }],\n channels: [computerUseChannel],\n toolRenderers: [\n { tools: [computerStateToolName], message: ComputerStateToolCard },\n { tools: [computerActionToolName], message: ComputerActionToolCard },\n { tools: [computerExecToolName], message: ComputerExecToolCard },\n ],\n} satisfies NonNullable<WebPluginDefinition['session']>;\n","import { defineActivityGroup } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineActivityGroup(legacy.activityGroups![0]!);\n","import { defineChannelFile } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineChannelFile(legacy.channels![0]!);\n","import { defineFill } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineFill({ slot: 'activity.computer-use', ...legacy.activitySections![0]! });\n","import { defineMinorModeFile } from '@agimon-ai/po-core/web';\n\nimport legacy from '../../_legacy';\n\nexport default defineMinorModeFile(legacy.minorModes![0]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![1]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![2]!);\n","import { defineToolRenderer } from '@agimon-ai/po-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![0]!);\n","// Generated by @agimon-ai/po-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/po-core/web';\n\nimport settingComputerUse from '../src/extensions/(frontend)/setting/computer-use.web';\nimport settingComputerUse2 from '../src/extensions/workspaces/(frontend)/setting/computer-use.web';\nimport activityGroupComputerUse from '../src/extensions/workspaces/sessions/(frontend)/activity-group/computer-use.web';\nimport channelComputerUse from '../src/extensions/workspaces/sessions/(frontend)/channel/computer-use.web';\nimport fillComputerUse from '../src/extensions/workspaces/sessions/(frontend)/fill/ComputerUse.activity.computer-use.web';\nimport modeComputerUse from '../src/extensions/workspaces/sessions/(frontend)/mode/computer-use/mode.web';\nimport toolComputerAction from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-action.web';\nimport toolComputerExec from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-exec.web';\nimport toolComputerState from '../src/extensions/workspaces/sessions/(frontend)/tool/computer-state.web';\n\nconst via = <T>(identity: Record<string, unknown>, value: unknown): T =>\n (value === undefined ? undefined : { ...identity, ...(value as object) }) as T;\n\nexport const webPlugin = defineWebPlugin({\n id: 'computer-use',\n global: {\n get settingsSections(): WebPluginContributions['settingsSections'] { return [via({ id: 'computer-use' }, settingComputerUse)]; },\n },\n workspace: {\n get settingsSections(): WebPluginContributions['settingsSections'] { return [via({ id: 'computer-use' }, settingComputerUse2)]; },\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 minorModes(): WebPluginContributions['minorModes'] { return [via({ name: 'computer-use' }, modeComputerUse)]; },\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/dist/index.cjs CHANGED
@@ -16,7 +16,7 @@ function createComputerUseDependencies(overrides = {}) {
16
16
  const allowedScriptPaths = (process.env["PO_COMPUTER_USE_SCRIPT_PATHS"] ?? "").split(node_path.default.delimiter).filter((entry) => entry.length > 0);
17
17
  return {
18
18
  service: overrides.service ?? new require_extensionService.DefaultComputerUseExtensionService(client),
19
- enabled: overrides.enabled ?? ((cwd) => (0, _agimon_ai_po_config.loadDoomConfig)(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),
19
+ enabled: overrides.enabled ?? ((cwd) => (0, _agimon_ai_po_config.loadPoConfig)(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),
20
20
  ...client === void 0 ? {} : { client },
21
21
  ...overrides.scriptRunner !== void 0 ? { scriptRunner: overrides.scriptRunner } : client === void 0 ? {} : { scriptRunner: new require_extensionService.ComputerScriptRunner({
22
22
  client,
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["path","DefaultComputerUseExtensionService","loadDoomConfig","ComputerScriptRunner"],"sources":["../src/services/sessionApiClient/index.ts","../src/services/dependencies/index.ts","../src/models/computerUseState.ts","../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../../types/computerUse';\n\nexport type { ComputerUseSessionClient } from '../../types/computerUse';\n\n/** Uses the injected host-owned service. Absence never triggers transport or credential discovery. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n","import path from 'node:path';\n\nimport { loadDoomConfig } from '@agimon-ai/po-config';\n\nimport type { ComputerUseExtensionDependencies } from '../../types/extension';\nimport { ComputerScriptRunner } from '../computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../extensionService';\nimport { createComputerUseSessionClient } from '../sessionApiClient';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'PO_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseDependencies(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n ((cwd) => loadDoomConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n","import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n","import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["path","DefaultComputerUseExtensionService","loadPoConfig","ComputerScriptRunner"],"sources":["../src/services/sessionApiClient/index.ts","../src/services/dependencies/index.ts","../src/models/computerUseState.ts","../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../../types/computerUse';\n\nexport type { ComputerUseSessionClient } from '../../types/computerUse';\n\n/** Uses the injected host-owned service. Absence never triggers transport or credential discovery. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n","import path from 'node:path';\n\nimport { loadPoConfig } from '@agimon-ai/po-config';\n\nimport type { ComputerUseExtensionDependencies } from '../../types/extension';\nimport { ComputerScriptRunner } from '../computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../extensionService';\nimport { createComputerUseSessionClient } from '../sessionApiClient';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'PO_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseDependencies(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n ((cwd) => loadPoConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n","import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n","import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { DoomApiCaller } from "@agimon-ai/po-core/packageApi";
1
+ import { PoApiCaller } from "@agimon-ai/po-core/packageApi";
2
2
  //#region src/constants/computerUse.d.ts
3
3
  export declare const COMPUTER_USE_GUIDANCE = "[COMPUTER USE ACTIVE]\nUse computer_state before acting and after any action that may change the interface. Use only element refs and snapshot ids returned by computer_state. Use computer_action for one semantic press, focus, set_value, or scroll at a time. Use computer_exec only for a trusted, explicitly allowed local TypeScript script. Never infer coordinates, inspect another application, bypass secure elements, or retry an uncertain outcome. Stop computer use when the task is complete.";
4
4
  export declare const COMPUTER_USE_TOOL_NAMES: readonly ['computer_state', 'computer_action', 'computer_exec'];
@@ -7,8 +7,8 @@ export declare const COMPUTER_USE_TOOL_NAMES: readonly ['computer_state', 'compu
7
7
  declare const API_BASE_PATH = "computer-use";
8
8
  declare const computerUseChannelType = "computer_use_state";
9
9
  declare const COMPUTER_USE_MODE_ID = "computer-use";
10
- declare const COMPUTER_USE_STATUS_KEY = "doom-computer-use";
11
- declare const COMPUTER_USE_MODE_STATUS_KEY = "doom-computer-use-mode";
10
+ declare const COMPUTER_USE_STATUS_KEY = "po-computer-use";
11
+ declare const COMPUTER_USE_MODE_STATUS_KEY = "po-computer-use-mode";
12
12
  declare const COMPUTER_USE_MAX_DURATION_MS: number;
13
13
  declare const COMPUTER_USE_DEFAULT_DURATION_MS: number;
14
14
  declare const COMPUTER_USE_CONFIRMATION_WINDOW_MS: number;
@@ -68,7 +68,7 @@ interface ComputerUseActivationRequest {
68
68
  readonly durationSeconds: number;
69
69
  readonly createdAt: number;
70
70
  readonly confirmationExpiresAt: number;
71
- readonly caller: DoomApiCaller;
71
+ readonly caller: PoApiCaller;
72
72
  }
73
73
  interface ComputerUseBrokerRequest {
74
74
  readonly id: string;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { o as COMPUTER_USE_GUIDANCE, r as ComputerScriptRunner, s as COMPUTER_USE_TOOL_NAMES, t as DefaultComputerUseExtensionService } from "./extensionService-DXvF7esO.mjs";
2
2
  import path from "node:path";
3
- import { loadDoomConfig } from "@agimon-ai/po-config";
3
+ import { loadPoConfig } from "@agimon-ai/po-config";
4
4
  //#region src/services/sessionApiClient/index.ts
5
5
  /** Uses the injected host-owned service. Absence never triggers transport or credential discovery. */
6
6
  function createComputerUseSessionClient(host) {
@@ -14,7 +14,7 @@ function createComputerUseDependencies(overrides = {}) {
14
14
  const allowedScriptPaths = (process.env["PO_COMPUTER_USE_SCRIPT_PATHS"] ?? "").split(path.delimiter).filter((entry) => entry.length > 0);
15
15
  return {
16
16
  service: overrides.service ?? new DefaultComputerUseExtensionService(client),
17
- enabled: overrides.enabled ?? ((cwd) => loadDoomConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),
17
+ enabled: overrides.enabled ?? ((cwd) => loadPoConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),
18
18
  ...client === void 0 ? {} : { client },
19
19
  ...overrides.scriptRunner !== void 0 ? { scriptRunner: overrides.scriptRunner } : client === void 0 ? {} : { scriptRunner: new ComputerScriptRunner({
20
20
  client,
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/services/sessionApiClient/index.ts","../src/services/dependencies/index.ts","../src/models/computerUseState.ts","../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../../types/computerUse';\n\nexport type { ComputerUseSessionClient } from '../../types/computerUse';\n\n/** Uses the injected host-owned service. Absence never triggers transport or credential discovery. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n","import path from 'node:path';\n\nimport { loadDoomConfig } from '@agimon-ai/po-config';\n\nimport type { ComputerUseExtensionDependencies } from '../../types/extension';\nimport { ComputerScriptRunner } from '../computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../extensionService';\nimport { createComputerUseSessionClient } from '../sessionApiClient';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'PO_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseDependencies(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n ((cwd) => loadDoomConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n","import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n","import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/services/sessionApiClient/index.ts","../src/services/dependencies/index.ts","../src/models/computerUseState.ts","../src/services/traceRedaction/index.ts"],"sourcesContent":["import type { ComputerUseSessionClient } from '../../types/computerUse';\n\nexport type { ComputerUseSessionClient } from '../../types/computerUse';\n\n/** Uses the injected host-owned service. Absence never triggers transport or credential discovery. */\nexport function createComputerUseSessionClient(host?: ComputerUseSessionClient): ComputerUseSessionClient | undefined {\n return host;\n}\n","import path from 'node:path';\n\nimport { loadPoConfig } from '@agimon-ai/po-config';\n\nimport type { ComputerUseExtensionDependencies } from '../../types/extension';\nimport { ComputerScriptRunner } from '../computerScriptRunner';\nimport { DefaultComputerUseExtensionService } from '../extensionService';\nimport { createComputerUseSessionClient } from '../sessionApiClient';\n\nexport const COMPUTER_USE_SCRIPT_PATHS_ENV = 'PO_COMPUTER_USE_SCRIPT_PATHS';\nexport function createComputerUseDependencies(\n overrides: Partial<ComputerUseExtensionDependencies> = {},\n): ComputerUseExtensionDependencies {\n const client = overrides.client ?? createComputerUseSessionClient();\n const allowedScriptPaths = (process.env[COMPUTER_USE_SCRIPT_PATHS_ENV] ?? '')\n .split(path.delimiter)\n .filter((entry) => entry.length > 0);\n return {\n service: overrides.service ?? new DefaultComputerUseExtensionService(client),\n enabled:\n overrides.enabled ??\n ((cwd) => loadPoConfig(cwd ?? process.env.PI_PROJECT_ROOT ?? process.cwd()).computerUse?.enabled === true),\n ...(client === undefined ? {} : { client }),\n ...(overrides.scriptRunner !== undefined\n ? { scriptRunner: overrides.scriptRunner }\n : client === undefined\n ? {}\n : { scriptRunner: new ComputerScriptRunner({ client, allowedScriptPaths }) }),\n };\n}\n","import type { ComputerUseState, ComputerUseStateEvent } from '../types/computerUse';\n\nfunction requireRequest(state: ComputerUseState, requestId: string): void {\n if (state.requestId !== requestId) throw new Error('The computer-use activation request is stale.');\n}\n\nfunction next(state: ComputerUseState, patch: Omit<ComputerUseState, 'revision' | 'identity'>): ComputerUseState {\n return {\n revision: state.revision + 1,\n identity: state.identity,\n ...patch,\n };\n}\n\nexport function initialComputerUseState(identity: ComputerUseState['identity']): ComputerUseState {\n return { revision: 0, phase: 'inactive', identity };\n}\n\nexport function reduceComputerUseState(state: ComputerUseState, event: ComputerUseStateEvent): ComputerUseState {\n if (event.type === 'fail') {\n return next(state, {\n phase: 'failed',\n failure: { code: event.code, message: event.message },\n ...(state.requestId === undefined ? {} : { requestId: state.requestId }),\n ...(state.target === undefined ? {} : { target: state.target }),\n ...(state.grant === undefined ? {} : { grant: state.grant }),\n });\n }\n\n if (event.type === 'reset') {\n if (state.phase !== 'failed') throw new Error('Only a failed computer-use state can be reset.');\n return next(state, { phase: 'inactive' });\n }\n\n switch (state.phase) {\n case 'inactive': {\n if (event.type !== 'request') throw new Error('Computer use is inactive.');\n return next(state, {\n phase: 'requesting',\n requestId: event.requestId,\n target: event.target,\n });\n }\n case 'requesting': {\n if (event.type !== 'await_confirmation') throw new Error('Computer use is preparing an activation request.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'awaiting_confirmation',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'awaiting_confirmation': {\n if (event.type === 'deny') {\n requireRequest(state, event.requestId);\n return next(state, { phase: 'inactive' });\n }\n if (event.type !== 'confirm') throw new Error('Computer use is waiting for confirmation.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'activating',\n requestId: event.requestId,\n target: state.target,\n });\n }\n case 'activating': {\n if (event.type !== 'activated') throw new Error('Computer use is activating.');\n requireRequest(state, event.requestId);\n return next(state, {\n phase: 'active',\n requestId: event.requestId,\n target: state.target,\n grant: event.grant,\n });\n }\n case 'active': {\n if (event.type !== 'stop') throw new Error('Computer use is active.');\n return next(state, {\n phase: 'stopping',\n requestId: state.requestId,\n target: state.target,\n grant: state.grant,\n });\n }\n case 'stopping': {\n if (event.type !== 'stopped') throw new Error('Computer use is stopping.');\n return next(state, { phase: 'inactive' });\n }\n case 'failed':\n throw new Error('Computer use must be reset before another transition.');\n }\n}\n","import type { ComputerUseAction, ComputerUseFailureCode } from '../../types/computerUse';\n\nexport interface ComputerUseTraceInput {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly action: ComputerUseAction;\n readonly role?: string;\n readonly durationMs: number;\n readonly outcome: 'succeeded' | 'failed' | 'uncertain';\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport interface ComputerUseTraceRecord {\n readonly sequence: number;\n readonly timestamp: number;\n readonly runId: string;\n readonly bundleId: string;\n readonly actionKind: ComputerUseAction['kind'];\n readonly role?: string;\n readonly textLength?: number;\n readonly durationMs: number;\n readonly outcome: ComputerUseTraceInput['outcome'];\n readonly errorCode?: ComputerUseFailureCode;\n}\n\nexport function redactComputerUseTrace(input: ComputerUseTraceInput): ComputerUseTraceRecord {\n return {\n sequence: input.sequence,\n timestamp: input.timestamp,\n runId: input.runId,\n bundleId: input.bundleId,\n actionKind: input.action.kind,\n ...(input.role === undefined ? {} : { role: input.role }),\n ...(input.action.kind === 'set_value' ? { textLength: input.action.value.length } : {}),\n durationMs: input.durationMs,\n outcome: input.outcome,\n ...(input.errorCode === undefined ? {} : { errorCode: input.errorCode }),\n };\n}\n"],"mappings":"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"}