@agimon-ai/doompi-computer-use 0.0.1-alpha.30 → 0.0.1-alpha.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/extensions/web.mjs +23 -18
- package/dist/extensions/web.mjs.map +1 -1
- package/package.json +8 -8
package/dist/extensions/web.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { apiResponse, createApiClient, defineActivityGroup, defineApiRoutes, defineChannelFile, defineFill, defineMinorModeFile, defineSessionStore, defineSettingsSection, defineToolRenderer, defineWebPlugin, sessionApiAddress, toolResultTextLines } from "@agimon-ai/doompi-core/web";
|
|
2
|
+
import { Button, MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, MessageLines, collapseLines, toolTone } from "@agimon-ai/doompi-web-components";
|
|
2
3
|
import { useStore } from "@tanstack/react-store";
|
|
3
4
|
import { useEffect, useState } from "react";
|
|
4
5
|
import { sealedTransport } from "@agimon-ai/doompi-web-security/browser";
|
|
5
6
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
import { MessageItem, MessageItemBody, MessageItemHeader, MessageItemStatus, MessageLines, collapseLines, toolTone } from "@agimon-ai/doompi-web-components";
|
|
7
7
|
//#region src/extensions/(frontend)/_lib/computerUseSettings.ts
|
|
8
8
|
const computerUseSettingsSection = {
|
|
9
9
|
id: "computer-use",
|
|
@@ -216,23 +216,24 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
216
216
|
children: [/* @__PURE__ */ jsx("span", {
|
|
217
217
|
className: "text-doom-faint",
|
|
218
218
|
children: state.phase.replaceAll("_", " ")
|
|
219
|
-
}), /* @__PURE__ */ jsx(
|
|
219
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
220
|
+
size: "sm",
|
|
220
221
|
type: "button",
|
|
221
|
-
className: "rounded bg-doom-panel px-2 py-1",
|
|
222
|
+
className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
|
|
222
223
|
onClick: () => send({ action: "targets" }),
|
|
223
224
|
children: "Refresh targets"
|
|
224
225
|
})]
|
|
225
226
|
}),
|
|
226
227
|
session.busy ? /* @__PURE__ */ jsx("p", {
|
|
227
|
-
className: "rounded border border-doom-
|
|
228
|
+
className: "rounded border border-doom-yellow px-2 py-1",
|
|
228
229
|
children: "Computer use is busy in another session"
|
|
229
230
|
}) : null,
|
|
230
231
|
state.failure ? /* @__PURE__ */ jsx("p", {
|
|
231
|
-
className: "text-doom-
|
|
232
|
+
className: "text-doom-red",
|
|
232
233
|
children: state.failure.message
|
|
233
234
|
}) : null,
|
|
234
235
|
error ? /* @__PURE__ */ jsx("p", {
|
|
235
|
-
className: "text-doom-
|
|
236
|
+
className: "text-doom-red",
|
|
236
237
|
children: error
|
|
237
238
|
}) : null,
|
|
238
239
|
(state.phase === "inactive" || state.phase === "failed") && confirmationTarget === void 0 ? /* @__PURE__ */ jsxs("div", {
|
|
@@ -246,23 +247,24 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
246
247
|
id: "computer-use-target",
|
|
247
248
|
value: selected,
|
|
248
249
|
onChange: (event) => setSelected(Number(event.target.value)),
|
|
249
|
-
className: "rounded bg-doom-panel px-2 py-1",
|
|
250
|
+
className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
|
|
250
251
|
children: session.targets.map((item, index) => /* @__PURE__ */ jsx("option", {
|
|
251
252
|
value: index,
|
|
252
253
|
children: text(item.applicationName, text(item.windowTitle, text(item.windowId, "Window")))
|
|
253
254
|
}, text(item.windowId, String(index))))
|
|
254
255
|
}),
|
|
255
|
-
/* @__PURE__ */ jsx(
|
|
256
|
+
/* @__PURE__ */ jsx(Button, {
|
|
257
|
+
size: "sm",
|
|
256
258
|
type: "button",
|
|
257
259
|
disabled: !target || Boolean(session.busy),
|
|
258
|
-
|
|
260
|
+
variant: "primary",
|
|
259
261
|
onClick: () => target !== void 0 && setConfirmationTarget(Object.freeze({ ...target })),
|
|
260
262
|
children: "Request activation"
|
|
261
263
|
})
|
|
262
264
|
]
|
|
263
265
|
}) : null,
|
|
264
266
|
confirmationTarget !== void 0 ? /* @__PURE__ */ jsxs("div", {
|
|
265
|
-
className: "rounded border border-doom-
|
|
267
|
+
className: "rounded border border-doom-blue p-3",
|
|
266
268
|
children: [
|
|
267
269
|
/* @__PURE__ */ jsx("strong", { children: "Confirm computer control" }),
|
|
268
270
|
/* @__PURE__ */ jsxs("p", {
|
|
@@ -280,14 +282,16 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
280
282
|
}),
|
|
281
283
|
/* @__PURE__ */ jsxs("div", {
|
|
282
284
|
className: "flex gap-2",
|
|
283
|
-
children: [/* @__PURE__ */ jsx(
|
|
285
|
+
children: [/* @__PURE__ */ jsx(Button, {
|
|
286
|
+
size: "sm",
|
|
284
287
|
type: "button",
|
|
285
|
-
|
|
288
|
+
variant: "primary",
|
|
286
289
|
onClick: () => void confirm(),
|
|
287
290
|
children: "Confirm"
|
|
288
|
-
}), /* @__PURE__ */ jsx(
|
|
291
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
292
|
+
size: "sm",
|
|
289
293
|
type: "button",
|
|
290
|
-
className: "rounded bg-doom-panel px-2 py-1",
|
|
294
|
+
className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
|
|
291
295
|
onClick: () => setConfirmationTarget(void 0),
|
|
292
296
|
children: "Cancel"
|
|
293
297
|
})]
|
|
@@ -295,10 +299,11 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
295
299
|
]
|
|
296
300
|
}) : null,
|
|
297
301
|
state.phase === "awaiting_confirmation" || state.phase === "activating" ? /* @__PURE__ */ jsx("p", { children: "Desktop activation is pending." }) : null,
|
|
298
|
-
state.phase === "active" || state.phase === "stopping" ? /* @__PURE__ */ jsx(
|
|
302
|
+
state.phase === "active" || state.phase === "stopping" ? /* @__PURE__ */ jsx(Button, {
|
|
303
|
+
size: "sm",
|
|
299
304
|
type: "button",
|
|
300
305
|
disabled: state.phase === "stopping",
|
|
301
|
-
className: "rounded bg-doom-panel px-2 py-1",
|
|
306
|
+
className: "min-h-7 rounded border border-doom-border bg-doom-panel px-2 py-1",
|
|
302
307
|
onClick: () => send({ action: "stop" }),
|
|
303
308
|
children: "Stop computer use"
|
|
304
309
|
}) : null,
|
|
@@ -310,7 +315,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
310
315
|
/* @__PURE__ */ jsxs("p", { children: ["ID: ", artifact.artifactId] }),
|
|
311
316
|
/* @__PURE__ */ jsxs("p", { children: ["Status: ", artifact.status] }),
|
|
312
317
|
artifact.failure ? /* @__PURE__ */ jsx("p", {
|
|
313
|
-
className: "text-doom-
|
|
318
|
+
className: "text-doom-red",
|
|
314
319
|
children: artifact.failure.message
|
|
315
320
|
}) : null,
|
|
316
321
|
artifact.completedAt ? /* @__PURE__ */ jsxs("p", { children: ["Completed: ", artifact.completedAt] }) : null,
|
|
@@ -323,7 +328,7 @@ function ComputerUsePanel({ sessionId, sendSessionFrame }) {
|
|
|
323
328
|
children: /* @__PURE__ */ jsx("track", { kind: "captions" })
|
|
324
329
|
}) : null,
|
|
325
330
|
artifact.status === "ready" && artifact.downloadUrl ? /* @__PURE__ */ jsx("a", {
|
|
326
|
-
className: "mt-2 inline-block text-doom-
|
|
331
|
+
className: "mt-2 inline-block text-doom-blue",
|
|
327
332
|
href: artifact.downloadUrl,
|
|
328
333
|
download: true,
|
|
329
334
|
children: "Download recording"
|
|
@@ -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)/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/doompi-core/web';\n\nexport const computerUseSettingsSection: SettingsSectionContribution = {\n id: 'computer-use',\n desktopOnly: true,\n label: 'computer use',\n detail: 'control whether DoomPi 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/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { WebPluginDefinition } from '@agimon-ai/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { DoomApiCaller } from '@agimon-ai/doompi-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 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 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/doompi-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/doompi-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 * Only `activate` is 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 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/doompi-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-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 type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\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 { 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 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 if (sessionId === null) return <p className=\"px-1 text-xs text-doom-faint\">Select a session.</p>;\n const state = session.state;\n const target = session.targets[selected];\n const artifact = state.artifact;\n const confirm = async () => {\n if (confirmationTarget === undefined) return;\n setError(undefined);\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: { target: confirmationTarget, durationMs: COMPUTER_USE_DEFAULT_DURATION_MS },\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 send({ action: 'status' });\n };\n\n return (\n <div data-testid=\"computer-use-panel\" className=\"flex flex-col gap-2 text-xs text-doom-text\">\n <header className=\"flex items-center justify-between gap-2\">\n <span className=\"text-doom-faint\">{state.phase.replaceAll('_', ' ')}</span>\n <button type=\"button\" className=\"rounded bg-doom-panel px-2 py-1\" onClick={() => send({ action: 'targets' })}>\n Refresh targets\n </button>\n </header>\n {session.busy ? (\n <p className=\"rounded border border-doom-warning px-2 py-1\">Computer use is busy in another session</p>\n ) : null}\n {state.failure ? <p className=\"text-doom-error\">{state.failure.message}</p> : null}\n {error ? <p className=\"text-doom-error\">{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=\"rounded 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 type=\"button\"\n disabled={!target || Boolean(session.busy)}\n className=\"rounded bg-doom-accent px-2 py-1 disabled:opacity-50\"\n onClick={() => target !== undefined && setConfirmationTarget(Object.freeze({ ...target }))}\n >\n Request activation\n </button>\n </div>\n ) : null}\n\n {confirmationTarget !== undefined ? (\n <div className=\"rounded border border-doom-accent 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-faint\">Confirm a 5 minute session for this exact application window.</p>\n <div className=\"flex gap-2\">\n <button type=\"button\" className=\"rounded bg-doom-accent px-2 py-1\" onClick={() => void confirm()}>\n Confirm\n </button>\n <button\n type=\"button\"\n className=\"rounded 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 <p>Desktop activation is pending.</p>\n ) : null}\n {state.phase === 'active' || state.phase === 'stopping' ? (\n <button\n type=\"button\"\n disabled={state.phase === 'stopping'}\n className=\"rounded 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-error\">{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.previewUrl ? (\n <video className=\"mt-2 w-full\" controls preload=\"metadata\" src={artifact.previewUrl}>\n <track kind=\"captions\" />\n </video>\n ) : null}\n {artifact.status === 'ready' && artifact.downloadUrl ? (\n <a className=\"mt-2 inline-block text-doom-accent\" href={artifact.downloadUrl} download>\n Download recording\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineActivityGroup(legacy.activityGroups![0]!);\n","import { defineChannelFile } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineChannelFile(legacy.channels![0]!);\n","import { defineFill } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineFill({ slot: 'activity.computer-use', ...legacy.activitySections![0]! });\n","import { defineMinorModeFile } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../../_legacy';\n\nexport default defineMinorModeFile(legacy.minorModes![0]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![1]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![2]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-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)/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/doompi-core/web';\n\nexport const computerUseSettingsSection: SettingsSectionContribution = {\n id: 'computer-use',\n desktopOnly: true,\n label: 'computer use',\n detail: 'control whether DoomPi 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/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { WebPluginDefinition } from '@agimon-ai/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineSettingsSection(legacy.settingsSections![0]!);\n","import type { DoomApiCaller } from '@agimon-ai/doompi-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 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 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/doompi-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/doompi-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 * Only `activate` is 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 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/doompi-build. Do not edit by hand.\nimport { createApiClient, sessionApiAddress } from '@agimon-ai/doompi-core/web';\nimport { sealedTransport } from '@agimon-ai/doompi-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 type { WebPluginSlotProps } from '@agimon-ai/doompi-core/web';\nimport { Button } from '@agimon-ai/doompi-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 { 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 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 if (sessionId === null) return <p className=\"px-1 text-xs text-doom-faint\">Select a session.</p>;\n const state = session.state;\n const target = session.targets[selected];\n const artifact = state.artifact;\n const confirm = async () => {\n if (confirmationTarget === undefined) return;\n setError(undefined);\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: { target: confirmationTarget, durationMs: COMPUTER_USE_DEFAULT_DURATION_MS },\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 send({ action: 'status' });\n };\n\n return (\n <div data-testid=\"computer-use-panel\" className=\"flex flex-col gap-2 text-xs text-doom-text\">\n <header className=\"flex items-center justify-between gap-2\">\n <span className=\"text-doom-faint\">{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={!target || Boolean(session.busy)}\n variant=\"primary\"\n onClick={() => target !== undefined && setConfirmationTarget(Object.freeze({ ...target }))}\n >\n 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-faint\">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 <p>Desktop activation is pending.</p>\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.previewUrl ? (\n <video className=\"mt-2 w-full\" controls preload=\"metadata\" src={artifact.previewUrl}>\n <track kind=\"captions\" />\n </video>\n ) : null}\n {artifact.status === 'ready' && artifact.downloadUrl ? (\n <a className=\"mt-2 inline-block text-doom-blue\" href={artifact.downloadUrl} download>\n Download recording\n </a>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n","import { type ToolResultView, toolResultTextLines } from '@agimon-ai/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-core/web';\nimport type { MessageLine } from '@agimon-ai/doompi-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/doompi-core/web';\n// @scaffold-generated\nimport {\n collapseLines,\n MessageItem,\n MessageItemBody,\n MessageItemHeader,\n MessageItemStatus,\n MessageLines,\n toolTone,\n} from '@agimon-ai/doompi-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/doompi-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/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineActivityGroup(legacy.activityGroups![0]!);\n","import { defineChannelFile } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineChannelFile(legacy.channels![0]!);\n","import { defineFill } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineFill({ slot: 'activity.computer-use', ...legacy.activitySections![0]! });\n","import { defineMinorModeFile } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../../_legacy';\n\nexport default defineMinorModeFile(legacy.minorModes![0]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![1]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![2]!);\n","import { defineToolRenderer } from '@agimon-ai/doompi-core/web';\n\nimport legacy from '../_legacy';\n\nexport default defineToolRenderer(legacy.toolRenderers![0]!);\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { defineWebPlugin, type WebPluginContributions } from '@agimon-ai/doompi-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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agimon-ai/doompi-computer-use",
|
|
3
|
-
"version": "0.0.1-alpha.
|
|
3
|
+
"version": "0.0.1-alpha.31",
|
|
4
4
|
"description": "Session scoped semantic computer control through the DoomPi Desktop capability.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -65,18 +65,18 @@
|
|
|
65
65
|
"access": "public"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@agimon-ai/doompi-config": "0.0.1-alpha.
|
|
69
|
-
"@agimon-ai/doompi-core": "0.0.1-alpha.
|
|
70
|
-
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.
|
|
71
|
-
"@agimon-ai/doompi-web-components": "0.0.1-alpha.
|
|
72
|
-
"@agimon-ai/doompi-web-security": "0.0.1-alpha.
|
|
68
|
+
"@agimon-ai/doompi-config": "0.0.1-alpha.86",
|
|
69
|
+
"@agimon-ai/doompi-core": "0.0.1-alpha.87",
|
|
70
|
+
"@agimon-ai/doompi-minor-mode": "0.0.1-alpha.87",
|
|
71
|
+
"@agimon-ai/doompi-web-components": "0.0.1-alpha.45",
|
|
72
|
+
"@agimon-ai/doompi-web-security": "0.0.1-alpha.44",
|
|
73
73
|
"@deepseek-ai/cordis": "4.0.2",
|
|
74
74
|
"quickjs-emscripten": "0.32.0",
|
|
75
75
|
"typebox": "1.3.34"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
|
-
"@agimon-ai/doompi-build": "0.0.1-alpha.
|
|
79
|
-
"@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.
|
|
78
|
+
"@agimon-ai/doompi-build": "0.0.1-alpha.13",
|
|
79
|
+
"@agimon-ai/vibe-lint-plugin-doom-extension": "0.0.1-alpha.79",
|
|
80
80
|
"@earendil-works/pi-coding-agent": "0.87.1",
|
|
81
81
|
"@tanstack/react-store": "0.11.1",
|
|
82
82
|
"@tanstack/store": "0.11.1",
|