@elizaos/app-core 2.0.0-alpha.169 → 2.0.0-alpha.170

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.
Files changed (28) hide show
  1. package/apps/app-lifeops/src/LifeOpsBrowserSetupPanel.d.ts.map +1 -1
  2. package/apps/app-lifeops/src/LifeOpsBrowserSetupPanel.js +19 -21
  3. package/apps/app-lifeops/src/LifeOpsPageSections.d.ts +2 -2
  4. package/apps/app-lifeops/src/LifeOpsPageSections.d.ts.map +1 -1
  5. package/apps/app-lifeops/src/LifeOpsPageSections.js +2 -2
  6. package/apps/app-lifeops/src/LifeOpsPageView.d.ts.map +1 -1
  7. package/apps/app-lifeops/src/LifeOpsPageView.js +6 -6
  8. package/apps/app-lifeops/src/LifeOpsSettingsSection.d.ts.map +1 -1
  9. package/apps/app-lifeops/src/LifeOpsSettingsSection.js +11 -12
  10. package/apps/app-lifeops/src/LifeOpsWorkspaceView.d.ts.map +1 -1
  11. package/apps/app-lifeops/src/LifeOpsWorkspaceView.js +5 -5
  12. package/apps/app-lifeops/src/lifeops/app-state.d.ts.map +1 -1
  13. package/apps/app-lifeops/src/lifeops/app-state.js +5 -2
  14. package/apps/app-lifeops/src/selfcontrol/roles.d.ts +15 -9
  15. package/apps/app-lifeops/src/selfcontrol/roles.d.ts.map +1 -1
  16. package/apps/app-lifeops/src/selfcontrol/roles.js +33 -220
  17. package/package.json +5 -5
  18. package/packages/agent/src/runtime/core-plugins.d.ts.map +1 -1
  19. package/packages/agent/src/runtime/core-plugins.js +2 -1
  20. package/packages/app-core/src/api/client-cloud.js +1 -1
  21. package/packages/app-core/src/api/plugins-compat-routes.d.ts.map +1 -1
  22. package/packages/app-core/src/api/plugins-compat-routes.js +7 -1
  23. package/packages/app-core/src/components/shell/Header.js +6 -6
  24. package/packages/app-core/src/runtime/eliza.d.ts.map +1 -1
  25. package/packages/app-core/src/runtime/eliza.js +11 -2
  26. package/packages/typescript/src/generated/action-docs.d.ts +0 -15
  27. package/packages/typescript/src/generated/action-docs.d.ts.map +1 -1
  28. package/packages/typescript/src/generated/action-docs.js +0 -42
@@ -1 +1 @@
1
- {"version":3,"file":"LifeOpsBrowserSetupPanel.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsBrowserSetupPanel.tsx"],"names":[],"mappings":"AAsdA,wBAAgB,wBAAwB,4CA0rBvC"}
1
+ {"version":3,"file":"LifeOpsBrowserSetupPanel.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsBrowserSetupPanel.tsx"],"names":[],"mappings":"AAkbA,wBAAgB,wBAAwB,4CA8nBvC"}
@@ -1,6 +1,6 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { LIFEOPS_BROWSER_SITE_ACCESS_MODES, } from "@elizaos/shared/contracts/lifeops";
3
- import { Badge, Button, Card, CardContent, CardHeader, CardTitle, Input, Label, Switch, Textarea, } from "@elizaos/app-core";
3
+ import { Badge, Button, Input, Label, Switch, Textarea, } from "@elizaos/app-core";
4
4
  import { Copy, Download, FolderOpen, Package, RefreshCw, ShieldCheck, Sparkles, } from "lucide-react";
5
5
  import { useCallback, useEffect, useMemo, useState } from "react";
6
6
  import { client } from "@elizaos/app-core";
@@ -185,12 +185,10 @@ function releaseBadgeLabel(browser, releaseManifest) {
185
185
  }
186
186
  function BrowserCompanionRow({ browser, buildPath, packagePath, appPath, releaseManifest, busy, pairing, onInstall, onBuild, onCreatePairing, onCopyPairing, onDownload, onOpenPath, }) {
187
187
  const browserLabel = browser === "chrome" ? "Chrome" : "Safari";
188
- const installHintText = installHint(browser, releaseManifest);
189
188
  const installLabel = installButtonLabel(browser, releaseManifest);
190
189
  const distributionLabel = releaseBadgeLabel(browser, releaseManifest);
191
190
  const hasLocalArtifact = Boolean(buildPath || packagePath || appPath);
192
- const showBuiltBadge = hasLocalArtifact || !distributionLabel;
193
- return (_jsxs("div", { className: "rounded-2xl border border-border/60 bg-bg/30 p-4 space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: browserLabel }), distributionLabel ? (_jsx(Badge, { variant: "secondary", children: distributionLabel })) : null, showBuiltBadge && hasLocalArtifact ? (_jsx(Badge, { variant: "secondary", children: "Built" })) : null, showBuiltBadge && !hasLocalArtifact ? (_jsx(Badge, { variant: "outline", children: "Not built" })) : null] }), _jsx("p", { className: "text-sm text-muted", children: installHintText })] }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs(Button, { size: "sm", disabled: busy, onClick: () => void onInstall(browser), children: [_jsx(Sparkles, { className: "mr-2 h-3.5 w-3.5" }), busy ? "Preparing…" : installLabel] }), _jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onBuild(browser), children: [_jsx(Package, { className: "mr-2 h-3.5 w-3.5" }), busy ? "Building…" : `Build ${browserLabel}`] }), _jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onCreatePairing(browser), children: [_jsx(Sparkles, { className: "mr-2 h-3.5 w-3.5" }), "Pair ", browserLabel] }), pairing ? (_jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onCopyPairing(browser), children: [_jsx(Copy, { className: "mr-2 h-3.5 w-3.5" }), "Copy pairing JSON"] })) : null, packagePath ? (_jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onDownload(browser), children: [_jsx(Download, { className: "mr-2 h-3.5 w-3.5" }), "Download zip"] })) : null] })] }), _jsxs("div", { className: "grid gap-2 text-xs text-muted", children: [buildPath ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 p-3", children: [_jsx("div", { className: "font-semibold text-txt", children: "Build folder" }), _jsx("div", { className: "mt-1 break-all font-mono", children: buildPath }), isElectrobunRuntime() ? (_jsx("div", { className: "mt-2", children: _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(buildPath, true), children: [_jsx(FolderOpen, { className: "mr-2 h-3.5 w-3.5" }), "Reveal build"] }) })) : null] })) : null, packagePath ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 p-3", children: [_jsx("div", { className: "font-semibold text-txt", children: "Package" }), _jsx("div", { className: "mt-1 break-all font-mono", children: packagePath }), isElectrobunRuntime() ? (_jsx("div", { className: "mt-2", children: _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(packagePath, true), children: [_jsx(FolderOpen, { className: "mr-2 h-3.5 w-3.5" }), "Reveal package"] }) })) : null] })) : null, appPath ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 p-3", children: [_jsx("div", { className: "font-semibold text-txt", children: "App bundle" }), _jsx("div", { className: "mt-1 break-all font-mono", children: appPath }), isElectrobunRuntime() ? (_jsxs("div", { className: "mt-2 flex flex-wrap gap-2", children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(appPath), children: "Open app" }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(appPath, true), children: [_jsx(FolderOpen, { className: "mr-2 h-3.5 w-3.5" }), "Reveal app"] })] })) : null] })) : null] })] }));
191
+ return (_jsxs("div", { className: "rounded-lg border border-border/50 bg-bg/30 p-3 space-y-2", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: browserLabel }), distributionLabel ? (_jsx(Badge, { variant: "secondary", className: "text-2xs", children: distributionLabel })) : null, hasLocalArtifact ? (_jsx(Badge, { variant: "secondary", className: "text-2xs", children: "Built" })) : (_jsx(Badge, { variant: "outline", className: "text-2xs", children: "Not built" }))] }), _jsxs("div", { className: "flex flex-wrap gap-1.5", children: [_jsxs(Button, { size: "sm", disabled: busy, onClick: () => void onInstall(browser), children: [_jsx(Sparkles, { className: "mr-1.5 h-3 w-3" }), busy ? "…" : installLabel] }), _jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onBuild(browser), children: [_jsx(Package, { className: "mr-1.5 h-3 w-3" }), "Build"] }), _jsx(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onCreatePairing(browser), children: "Pair" }), pairing ? (_jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onCopyPairing(browser), children: [_jsx(Copy, { className: "mr-1.5 h-3 w-3" }), "Copy"] })) : null, packagePath ? (_jsxs(Button, { size: "sm", variant: "outline", disabled: busy, onClick: () => void onDownload(browser), children: [_jsx(Download, { className: "mr-1.5 h-3 w-3" }), "Zip"] })) : null] }), (buildPath || packagePath || appPath) ? (_jsxs("div", { className: "space-y-1 text-xs text-muted", children: [buildPath ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-semibold text-txt", children: "Build:" }), _jsx("span", { className: "min-w-0 truncate font-mono", children: buildPath }), isElectrobunRuntime() ? (_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(buildPath, true), children: _jsx(FolderOpen, { className: "h-3 w-3" }) })) : null] })) : null, packagePath ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-semibold text-txt", children: "Pkg:" }), _jsx("span", { className: "min-w-0 truncate font-mono", children: packagePath }), isElectrobunRuntime() ? (_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(packagePath, true), children: _jsx(FolderOpen, { className: "h-3 w-3" }) })) : null] })) : null, appPath ? (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-semibold text-txt", children: "App:" }), _jsx("span", { className: "min-w-0 truncate font-mono", children: appPath }), isElectrobunRuntime() ? (_jsxs(_Fragment, { children: [_jsx(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(appPath), children: "Open" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => void onOpenPath(appPath, true), children: _jsx(FolderOpen, { className: "h-3 w-3" }) })] })) : null] })) : null] })) : null] }));
194
192
  }
195
193
  export function LifeOpsBrowserSetupPanel() {
196
194
  const [draft, setDraft] = useState(null);
@@ -441,23 +439,23 @@ export function LifeOpsBrowserSetupPanel() {
441
439
  setInstallingBrowser(null);
442
440
  }
443
441
  };
444
- return (_jsxs(Card, { className: "border-border/60 bg-bg/20", children: [_jsxs(CardHeader, { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(ShieldCheck, { className: "h-4 w-4 text-muted" }), _jsx(CardTitle, { className: "text-sm font-semibold", children: "LifeOps Browser" })] }), _jsx("p", { className: "text-sm text-muted", children: "Personal Chrome and Safari companions for the user\u2019s browser, separate from the browser workspace." })] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void refresh(), children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] })] }), currentPage ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 px-3 py-2 text-xs text-muted", children: ["Current page: ", _jsx("span", { className: "text-txt", children: currentPage })] })) : null, statusMessage ? (_jsx("div", { className: "rounded-xl border border-border/60 bg-bg/40 px-3 py-2 text-xs text-txt", children: statusMessage })) : null, error ? (_jsx("div", { className: "rounded-xl border border-danger/50 bg-danger/10 px-3 py-2 text-xs text-danger", children: error })) : null] }), _jsxs(CardContent, { className: "space-y-5", children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-2", children: [_jsx(BrowserCompanionRow, { browser: "chrome", buildPath: packageStatus?.chromeBuildPath, packagePath: packageStatus?.chromePackagePath, releaseManifest: packageStatus?.releaseManifest ?? null, busy: buildingBrowser === "chrome" ||
442
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2 text-muted", children: [_jsx(ShieldCheck, { className: "h-4 w-4" }), _jsx("div", { className: "text-xs font-semibold uppercase tracking-wide", children: "LifeOps Browser" })] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void refresh(), children: [_jsx(RefreshCw, { className: "mr-1.5 h-3 w-3" }), "Refresh"] })] }), currentPage ? (_jsxs("div", { className: "text-xs text-muted", children: ["Current page: ", _jsx("span", { className: "text-txt", children: currentPage })] })) : null, statusMessage ? (_jsx("div", { className: "rounded-lg border border-border/50 bg-bg/40 px-3 py-2 text-xs text-txt", children: statusMessage })) : null, error ? (_jsx("div", { className: "rounded-lg border border-danger/50 bg-danger/10 px-3 py-1.5 text-xs text-danger", children: error })) : null, _jsxs("div", { className: "grid gap-4 xl:grid-cols-2", children: [_jsx("div", { className: "space-y-3", children: draft ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("div", { className: "text-xs font-semibold text-muted uppercase tracking-wide", children: "Settings" }), _jsx(Button, { size: "sm", variant: "outline", disabled: savingSettings || loading, onClick: () => void saveSettings(), children: savingSettings ? "Saving…" : "Save" })] }), _jsxs("div", { className: "grid gap-2 grid-cols-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/50 bg-bg/40 px-3 py-1.5", children: [_jsx("span", { className: "text-xs font-medium text-txt", children: "Enabled" }), _jsx(Switch, { checked: draft.enabled, onCheckedChange: (checked) => updateDraft("enabled", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/50 bg-bg/40 px-3 py-1.5", children: [_jsx("span", { className: "text-xs font-medium text-txt", children: "Browser control" }), _jsx(Switch, { checked: draft.allowBrowserControl, onCheckedChange: (checked) => updateDraft("allowBrowserControl", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/50 bg-bg/40 px-3 py-1.5", children: [_jsx("span", { className: "text-xs font-medium text-txt", children: "Require confirmation" }), _jsx(Switch, { checked: draft.requireConfirmationForAccountAffecting, onCheckedChange: (checked) => updateDraft("requireConfirmationForAccountAffecting", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-2 rounded-lg border border-border/50 bg-bg/40 px-3 py-1.5", children: [_jsx("span", { className: "text-xs font-medium text-txt", children: "Incognito" }), _jsx(Switch, { checked: draft.incognitoEnabled, onCheckedChange: (checked) => updateDraft("incognitoEnabled", checked) })] })] }), _jsxs("div", { className: "grid gap-3 grid-cols-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted", children: "Tracking" }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: ["off", "current_tab", "active_tabs"].map((mode) => (_jsx(Button, { size: "sm", variant: draft.trackingMode === mode ? "default" : "outline", onClick: () => updateDraft("trackingMode", mode), children: mode === "off"
443
+ ? "Off"
444
+ : mode === "current_tab"
445
+ ? "Current tab"
446
+ : "Active tabs" }, mode))) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { className: "text-xs text-muted", children: "Site access" }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: LIFEOPS_BROWSER_SITE_ACCESS_MODES.map((mode) => (_jsx(Button, { size: "sm", variant: draft.siteAccessMode === mode ? "default" : "outline", onClick: () => updateDraft("siteAccessMode", mode), children: mode === "current_site_only"
447
+ ? "Current site"
448
+ : mode === "granted_sites"
449
+ ? "Granted sites"
450
+ : "All sites" }, mode))) })] })] }), _jsxs("div", { className: "grid gap-3 grid-cols-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "lifeops-browser-max-tabs", className: "text-xs text-muted", children: "Max remembered tabs" }), _jsx(Input, { id: "lifeops-browser-max-tabs", value: draft.maxRememberedTabs, onChange: (event) => updateDraft("maxRememberedTabs", event.currentTarget.value), inputMode: "numeric" })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "lifeops-browser-pause-until", className: "text-xs text-muted", children: "Pause until" }), _jsxs("div", { className: "flex gap-1.5", children: [_jsx(Input, { id: "lifeops-browser-pause-until", type: "datetime-local", value: draft.pauseUntilLocal, onChange: (event) => updateDraft("pauseUntilLocal", event.currentTarget.value), className: "min-w-0 flex-1" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => updateDraft("pauseUntilLocal", formatDateTimeLocalValue(new Date(Date.now() + 60 * 60 * 1000).toISOString())), children: "1h" }), _jsx(Button, { size: "sm", variant: "outline", onClick: () => updateDraft("pauseUntilLocal", ""), children: "Now" })] })] })] }), _jsxs("div", { className: "grid gap-3 grid-cols-2", children: [_jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "lifeops-browser-granted-origins", className: "text-xs text-muted", children: "Granted origins" }), _jsx(Textarea, { id: "lifeops-browser-granted-origins", rows: 3, placeholder: "https://mail.google.com", value: draft.grantedOriginsText, onChange: (event) => updateDraft("grantedOriginsText", event.currentTarget.value) })] }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: "lifeops-browser-blocked-origins", className: "text-xs text-muted", children: "Blocked origins" }), _jsx(Textarea, { id: "lifeops-browser-blocked-origins", rows: 3, placeholder: "https://bank.example.com", value: draft.blockedOriginsText, onChange: (event) => updateDraft("blockedOriginsText", event.currentTarget.value) })] })] }), _jsxs("div", { className: "text-xs text-muted", children: ["Companions: ", companions.length, " | Workspace: ", _jsx("span", { className: "font-mono text-txt", children: packageStatus?.extensionPath ?? "N/A" })] })] })) : loading ? (_jsx("div", { className: "text-xs text-muted", children: "Loading settings\u2026" })) : null }), _jsxs("div", { className: "space-y-3", children: [_jsx("div", { className: "text-xs font-semibold text-muted uppercase tracking-wide", children: "Installation" }), _jsx(BrowserCompanionRow, { browser: "chrome", buildPath: packageStatus?.chromeBuildPath, packagePath: packageStatus?.chromePackagePath, releaseManifest: packageStatus?.releaseManifest ?? null, busy: buildingBrowser === "chrome" ||
445
451
  pairingBrowser === "chrome" ||
446
452
  installingBrowser === "chrome", pairing: pairings.chrome ?? null, onInstall: installCompanion, onBuild: buildPackage, onCreatePairing: createPairing, onCopyPairing: copyPairing, onDownload: downloadPackage, onOpenPath: openPath }), _jsx(BrowserCompanionRow, { browser: "safari", buildPath: packageStatus?.safariWebExtensionPath, packagePath: packageStatus?.safariPackagePath, appPath: packageStatus?.safariAppPath, releaseManifest: packageStatus?.releaseManifest ?? null, busy: buildingBrowser === "safari" ||
447
453
  pairingBrowser === "safari" ||
448
- installingBrowser === "safari", pairing: pairings.safari ?? null, onInstall: installCompanion, onBuild: buildPackage, onCreatePairing: createPairing, onCopyPairing: copyPairing, onDownload: downloadPackage, onOpenPath: openPath })] }), ["chrome", "safari"].map((browser) => {
449
- const payload = pairingPayloads[browser];
450
- if (!payload) {
451
- return null;
452
- }
453
- return (_jsxs("div", { className: "rounded-2xl border border-border/60 bg-bg/30 p-4 space-y-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "text-sm font-semibold text-txt", children: [browser === "chrome" ? "Chrome" : "Safari", " pairing payload"] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void copyPairing(browser), children: [_jsx(Copy, { className: "mr-2 h-3.5 w-3.5" }), "Copy"] })] }), _jsx(Textarea, { readOnly: true, rows: 8, value: payload, className: "font-mono text-xs" })] }, browser));
454
- }), draft ? (_jsxs("div", { className: "rounded-2xl border border-border/60 bg-bg/30 p-4 space-y-4", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("div", { className: "text-sm font-semibold text-txt", children: "LifeOps Browser settings" }), _jsx(Button, { size: "sm", variant: "outline", disabled: savingSettings || loading, onClick: () => void saveSettings(), children: savingSettings ? "Saving…" : "Save settings" })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "flex items-center justify-between gap-3 rounded-xl border border-border/60 bg-bg/40 px-3 py-2", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-txt", children: "Enabled" }), _jsx("div", { className: "text-xs text-muted", children: "Allow the personal browser companion to sync with LifeOps." })] }), _jsx(Switch, { checked: draft.enabled, onCheckedChange: (checked) => updateDraft("enabled", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 rounded-xl border border-border/60 bg-bg/40 px-3 py-2", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-txt", children: "Browser control" }), _jsx("div", { className: "text-xs text-muted", children: "Let approved sessions drive the personal browser." })] }), _jsx(Switch, { checked: draft.allowBrowserControl, onCheckedChange: (checked) => updateDraft("allowBrowserControl", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 rounded-xl border border-border/60 bg-bg/40 px-3 py-2", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-txt", children: "Require confirmation" }), _jsx("div", { className: "text-xs text-muted", children: "Keep account-affecting actions gated by confirmation." })] }), _jsx(Switch, { checked: draft.requireConfirmationForAccountAffecting, onCheckedChange: (checked) => updateDraft("requireConfirmationForAccountAffecting", checked) })] }), _jsxs("div", { className: "flex items-center justify-between gap-3 rounded-xl border border-border/60 bg-bg/40 px-3 py-2", children: [_jsxs("div", { children: [_jsx("div", { className: "text-sm font-medium text-txt", children: "Incognito access" }), _jsx("div", { className: "text-xs text-muted", children: "Allow companion sync from incognito browser tabs." })] }), _jsx(Switch, { checked: draft.incognitoEnabled, onCheckedChange: (checked) => updateDraft("incognitoEnabled", checked) })] })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { className: "text-xs uppercase tracking-[0.08em] text-muted", children: "Tracking mode" }), _jsx("div", { className: "flex flex-wrap gap-2", children: ["off", "current_tab", "active_tabs"].map((mode) => (_jsx(Button, { size: "sm", variant: draft.trackingMode === mode ? "default" : "outline", onClick: () => updateDraft("trackingMode", mode), children: mode === "off"
455
- ? "Off"
456
- : mode === "current_tab"
457
- ? "Current tab"
458
- : "Active tabs" }, mode))) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { className: "text-xs uppercase tracking-[0.08em] text-muted", children: "Site access mode" }), _jsx("div", { className: "flex flex-wrap gap-2", children: LIFEOPS_BROWSER_SITE_ACCESS_MODES.map((mode) => (_jsx(Button, { size: "sm", variant: draft.siteAccessMode === mode ? "default" : "outline", onClick: () => updateDraft("siteAccessMode", mode), children: mode === "current_site_only"
459
- ? "Current site"
460
- : mode === "granted_sites"
461
- ? "Granted sites"
462
- : "All sites" }, mode))) })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-[minmax(0,1fr)_220px]", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "lifeops-browser-max-tabs", children: "Max remembered tabs" }), _jsx(Input, { id: "lifeops-browser-max-tabs", value: draft.maxRememberedTabs, onChange: (event) => updateDraft("maxRememberedTabs", event.currentTarget.value), inputMode: "numeric" })] }), _jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 px-3 py-2 text-xs text-muted", children: ["Connected companions:", " ", _jsx("span", { className: "text-txt", children: companions.length }), _jsx("br", {}), "Extension workspace:", " ", _jsx("span", { className: "break-all font-mono text-xs-tight text-txt", children: packageStatus?.extensionPath ?? "Unavailable" })] })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-[minmax(0,1fr)_auto_auto]", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "lifeops-browser-pause-until", children: "Pause sharing until" }), _jsx(Input, { id: "lifeops-browser-pause-until", type: "datetime-local", value: draft.pauseUntilLocal, onChange: (event) => updateDraft("pauseUntilLocal", event.currentTarget.value) })] }), _jsx(Button, { size: "sm", variant: "outline", className: "self-end", onClick: () => updateDraft("pauseUntilLocal", formatDateTimeLocalValue(new Date(Date.now() + 60 * 60 * 1000).toISOString())), children: "Pause 1 hour" }), _jsx(Button, { size: "sm", variant: "outline", className: "self-end", onClick: () => updateDraft("pauseUntilLocal", ""), children: "Resume now" })] }), _jsxs("div", { className: "grid gap-4 md:grid-cols-2", children: [_jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "lifeops-browser-granted-origins", children: "Granted origins" }), _jsx(Textarea, { id: "lifeops-browser-granted-origins", rows: 5, placeholder: "https://mail.google.com", value: draft.grantedOriginsText, onChange: (event) => updateDraft("grantedOriginsText", event.currentTarget.value) })] }), _jsxs("div", { className: "space-y-2", children: [_jsx(Label, { htmlFor: "lifeops-browser-blocked-origins", children: "Blocked origins" }), _jsx(Textarea, { id: "lifeops-browser-blocked-origins", rows: 5, placeholder: "https://bank.example.com", value: draft.blockedOriginsText, onChange: (event) => updateDraft("blockedOriginsText", event.currentTarget.value) })] })] }), _jsx("div", { className: "rounded-xl border border-border/60 bg-bg/40 px-3 py-2 text-xs text-muted", children: "Install Chrome or Safari in one click here. The framework builds the companion, prepares a fresh pairing token, and launches the next destination for that browser. Chrome still requires Load unpacked approval, and Safari still requires enabling the extension in Safari Settings." })] })) : loading ? (_jsx("div", { className: "text-sm text-muted", children: "Loading LifeOps Browser settings\u2026" })) : null, companions.length > 0 ? (_jsxs("div", { className: "rounded-2xl border border-border/60 bg-bg/30 p-4 space-y-2", children: [_jsx("div", { className: "text-sm font-semibold text-txt", children: "Paired companions" }), _jsx("div", { className: "grid gap-2 text-sm", children: companions.map((companion) => (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsxs(Badge, { variant: "outline", children: [companion.browser, "/", companion.profileLabel] }), _jsx(Badge, { variant: "secondary", children: companion.connectionState })] }), _jsxs("div", { className: "mt-1 text-xs text-muted", children: ["Last seen:", " ", formatTimestamp(companion.lastSeenAt) ?? "Never"] }), _jsx("div", { className: "mt-1 text-xs text-muted", children: permissionSummary(companion.permissions) })] }, companion.id))) })] })) : null] })] }));
454
+ installingBrowser === "safari", pairing: pairings.safari ?? null, onInstall: installCompanion, onBuild: buildPackage, onCreatePairing: createPairing, onCopyPairing: copyPairing, onDownload: downloadPackage, onOpenPath: openPath }), ["chrome", "safari"].map((browser) => {
455
+ const payload = pairingPayloads[browser];
456
+ if (!payload) {
457
+ return null;
458
+ }
459
+ return (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("span", { className: "text-xs font-semibold text-txt", children: [browser === "chrome" ? "Chrome" : "Safari", " pairing"] }), _jsxs(Button, { size: "sm", variant: "outline", onClick: () => void copyPairing(browser), children: [_jsx(Copy, { className: "mr-1.5 h-3 w-3" }), "Copy"] })] }), _jsx(Textarea, { readOnly: true, rows: 5, value: payload, className: "font-mono text-xs" })] }, browser));
460
+ }), companions.length > 0 ? (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-xs font-semibold text-muted uppercase tracking-wide", children: "Paired companions" }), _jsx("div", { className: "grid gap-2", children: companions.map((companion) => (_jsxs("div", { className: "flex flex-wrap items-center gap-2 rounded-lg border border-border/50 bg-bg/40 px-3 py-1.5 text-xs", children: [_jsxs(Badge, { variant: "outline", className: "text-2xs", children: [companion.browser, "/", companion.profileLabel] }), _jsx(Badge, { variant: "secondary", className: "text-2xs", children: companion.connectionState }), _jsx("span", { className: "text-muted", children: formatTimestamp(companion.lastSeenAt) ?? "Never seen" }), _jsx("span", { className: "text-muted", children: permissionSummary(companion.permissions) })] }, companion.id))) })] })) : null] })] })] }));
463
461
  }
@@ -9,13 +9,13 @@ export declare function occurrenceSortValue(occurrence: LifeOpsOccurrenceView):
9
9
  export declare function SectionSurface({ title, icon, subtitle, children, }: {
10
10
  title: string;
11
11
  icon: ReactNode;
12
- subtitle: string;
12
+ subtitle?: string;
13
13
  children: ReactNode;
14
14
  }): import("react/jsx-runtime").JSX.Element;
15
15
  export declare function SummaryMetric({ label, value, detail, }: {
16
16
  label: string;
17
17
  value: string;
18
- detail: string;
18
+ detail?: string;
19
19
  }): import("react/jsx-runtime").JSX.Element;
20
20
  export declare function OccurrenceList({ occurrences, }: {
21
21
  occurrences: LifeOpsOccurrenceView[];
@@ -1 +1 @@
1
- {"version":3,"file":"LifeOpsPageSections.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsPageSections.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAEzB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,gBAAgB,EAChB,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,8BAA8B,GAAG,IAAI,CAAC;CAC/C,CAAC;AA+CF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAiB7E;AAsED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAeA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,2CAUA;AAED,wBAAgB,cAAc,CAAC,EAC7B,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC,2CA2CA;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;CAAE,2CAkDrE;AAED,wBAAgB,YAAY,CAAC,EAC3B,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,EAAE,CAAC;CACxC,2CAuCA;AAED,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,EACV,IAAI,EACJ,YAAY,GACb,EAAE;IACD,UAAU,EAAE,oBAAoB,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,2CAuDA;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,oBAAoB,GACrB,EAAE;IACD,KAAK,EAAE,uBAAuB,CAAC;IAC/B,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACvE,2CAqHA"}
1
+ {"version":3,"file":"LifeOpsPageSections.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsPageSections.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EAEzB,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,gBAAgB,EAChB,8BAA8B,EAC9B,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,EAAE,gBAAgB,CAAC;IACxB,MAAM,EAAE,8BAA8B,GAAG,IAAI,CAAC;CAC/C,CAAC;AA+CF,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,qBAAqB,GAAG,MAAM,CAiB7E;AAsED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;CACrB,2CAWA;AAED,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,KAAK,EACL,MAAM,GACP,EAAE;IACD,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,2CAUA;AAED,wBAAgB,cAAc,CAAC,EAC7B,WAAW,GACZ,EAAE;IACD,WAAW,EAAE,qBAAqB,EAAE,CAAC;CACtC,2CA2CA;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,EAAE;IAAE,KAAK,EAAE,qBAAqB,EAAE,CAAA;CAAE,2CAkDrE;AAED,wBAAgB,YAAY,CAAC,EAC3B,SAAS,GACV,EAAE;IACD,SAAS,EAAE,yBAAyB,EAAE,CAAC;CACxC,2CAuCA;AAED,wBAAgB,yBAAyB,CAAC,EACxC,UAAU,EACV,IAAI,EACJ,YAAY,GACb,EAAE;IACD,UAAU,EAAE,oBAAoB,CAAC;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,2CAuDA;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,YAAY,EACZ,oBAAoB,GACrB,EAAE;IACD,KAAK,EAAE,uBAAuB,CAAC;IAC/B,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IACzC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oBAAoB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,IAAI,CAAC;CACvE,2CAqHA"}
@@ -112,10 +112,10 @@ function githubBindingSourceLabel(source) {
112
112
  }
113
113
  }
114
114
  export function SectionSurface({ title, icon, subtitle, children, }) {
115
- return (_jsxs("div", { className: "rounded-3xl border border-border/45 bg-card/78 p-4 backdrop-blur-sm", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "rounded-2xl border border-border/45 bg-bg/70 p-2 text-muted", children: icon }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "text-sm font-semibold text-txt", children: title }), _jsx("div", { className: "mt-1 text-xs leading-5 text-muted", children: subtitle })] })] }), _jsx("div", { className: "mt-4 space-y-3", children: children })] }));
115
+ return (_jsxs("div", { children: [_jsxs("div", { className: "flex items-center gap-2 text-muted", children: [icon, _jsx("div", { className: "text-xs font-semibold uppercase tracking-wide text-muted", children: title })] }), subtitle ? _jsx("div", { className: "mt-1 text-xs leading-5 text-muted", children: subtitle }) : null, _jsx("div", { className: "mt-2 space-y-2", children: children })] }));
116
116
  }
117
117
  export function SummaryMetric({ label, value, detail, }) {
118
- return (_jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: label }), _jsx("div", { className: "mt-2 text-lg font-semibold text-txt", children: value }), _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: detail })] }));
118
+ return (_jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: label }), _jsx("div", { className: "mt-2 text-lg font-semibold text-txt", children: value }), detail ? _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: detail }) : null] }));
119
119
  }
120
120
  export function OccurrenceList({ occurrences, }) {
121
121
  if (occurrences.length === 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"LifeOpsPageView.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsPageView.tsx"],"names":[],"mappings":"AA4GA,wBAAgB,eAAe,4CAwsB9B"}
1
+ {"version":3,"file":"LifeOpsPageView.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsPageView.tsx"],"names":[],"mappings":"AA2GA,wBAAgB,eAAe,4CAkqB9B"}
@@ -8,10 +8,10 @@ import { consumeQueuedLifeOpsGithubCallback, dispatchLifeOpsGithubCallbackFromWi
8
8
  import { useLifeOpsAppState } from "@elizaos/app-core";
9
9
  import { useApp } from "@elizaos/app-core";
10
10
  import { openExternalUrl } from "@elizaos/app-core";
11
- import { AgentGithubCard, GoalList, OccurrenceList, occurrenceSortValue, OwnerGithubConnectionCard, ReminderList, SectionSurface, SummaryMetric, } from "./LifeOpsPageSections";
11
+ import { AgentGithubCard, GoalList, OccurrenceList, occurrenceSortValue, OwnerGithubConnectionCard, ReminderList, SectionSurface, } from "./LifeOpsPageSections";
12
12
  import { LifeOpsSettingsSection } from "./LifeOpsSettingsSection";
13
13
  import { LifeOpsWorkspaceView } from "./LifeOpsWorkspaceView";
14
- const LIFEOPS_GITHUB_COMPLETE_PATH = "/api/v1/app/lifeops/github-complete";
14
+ const LIFEOPS_GITHUB_COMPLETE_PATH = "/api/v1/milady/lifeops/github-complete";
15
15
  const LIFEOPS_GITHUB_RETURN_URL = "elizaos://lifeops";
16
16
  function buildOwnerGithubRedirectUrl() {
17
17
  const params = new URLSearchParams();
@@ -376,12 +376,12 @@ export function LifeOpsPageView() {
376
376
  .slice(0, 4), [overview?.agentOps.occurrences]);
377
377
  const ownerGoals = useMemo(() => (overview?.owner.goals ?? []).slice(0, 4), [overview?.owner.goals]);
378
378
  const ownerReminders = useMemo(() => (overview?.owner.reminders ?? []).slice(0, 4), [overview?.owner.reminders]);
379
- return (_jsxs("div", { className: "space-y-4", "data-testid": "lifeops-shell", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Personal Operations", description: "Tasks, goals, reminders, connected identities, calendar, and inbox in one operational tab.", actions: _jsxs("div", { className: "flex flex-wrap gap-2", children: [appEnabled ? (_jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void refreshAll(), disabled: lifeOpsApp.loading ||
379
+ return (_jsxs("div", { className: "space-y-4", "data-testid": "lifeops-shell", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Personal Operations", actions: _jsxs("div", { className: "flex flex-wrap gap-2", children: [appEnabled ? (_jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void refreshAll(), disabled: lifeOpsApp.loading ||
380
380
  lifeOpsApp.saving ||
381
381
  overviewLoading ||
382
- githubLoading, children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] })) : null, _jsx(Button, { variant: appEnabled ? "outline" : "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleSetLifeOpsEnabled(!appEnabled), disabled: lifeOpsApp.loading || lifeOpsApp.saving, children: appEnabled ? "Disable LifeOps" : "Enable LifeOps" })] }) }), lifeOpsApp.error ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: lifeOpsApp.error })) : null, lifeOpsApp.loading ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Loading LifeOps app state" })) : null, !lifeOpsApp.loading && !appEnabled ? (_jsx(PagePanel.Empty, { variant: "surface", className: "mt-4 min-h-[12rem] rounded-3xl", title: "LifeOps starts disabled", description: "Enable LifeOps for this agent to turn on the chat widgets and unlock the operational workspace." })) : null, appEnabled && !runtimeReady && !overview ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Waiting for LifeOps runtime" })) : null, appEnabled && overviewError ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: overviewError })) : null, appEnabled && overview ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-3 md:grid-cols-2 xl:grid-cols-4", children: [_jsx(SummaryMetric, { label: "Open items", value: `${overview.owner.summary.activeOccurrenceCount}`, detail: `${overview.owner.summary.overdueOccurrenceCount} overdue` }), _jsx(SummaryMetric, { label: "Goals", value: `${overview.owner.summary.activeGoalCount}`, detail: "Owner goals in motion" }), _jsx(SummaryMetric, { label: "Reminders", value: `${overview.owner.summary.activeReminderCount}`, detail: `${overview.owner.summary.snoozedOccurrenceCount} snoozed items` }), _jsx(SummaryMetric, { label: "Agent ops", value: `${overview.agentOps.summary.activeOccurrenceCount}`, detail: `${overview.agentOps.summary.activeGoalCount} active agent goals` })] }), _jsxs("div", { className: "mt-4 grid gap-4 xl:grid-cols-[1.2fr_1fr_1fr]", children: [_jsx(SectionSurface, { title: "Current queue", icon: _jsx(ListTodo, { className: "h-4 w-4" }), subtitle: "The owner-facing tasks and occurrences that need attention next.", children: _jsx(OccurrenceList, { occurrences: ownerOccurrences }) }), _jsx(SectionSurface, { title: "Goals", icon: _jsx(Target, { className: "h-4 w-4" }), subtitle: "Active LifeOps goals the agent is tracking for the owner.", children: _jsx(GoalList, { goals: ownerGoals }) }), _jsx(SectionSurface, { title: "Live reminders", icon: _jsx(BellRing, { className: "h-4 w-4" }), subtitle: "Reminders that are currently scheduled or in-flight.", children: _jsx(ReminderList, { reminders: ownerReminders }) })] }), _jsx("div", { className: "mt-4", children: _jsx(SectionSurface, { title: "Agent operations", icon: _jsx(Bot, { className: "h-4 w-4" }), subtitle: "Work the agent is carrying on your behalf across goals and active occurrences.", children: _jsx(OccurrenceList, { occurrences: agentOccurrences }) }) })] })) : null] }), appEnabled ? _jsx(LifeOpsSettingsSection, {}) : null, appEnabled ? (_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "GitHub", heading: "LifeOps and Agent GitHub", description: "Keep the owner\u2019s LifeOps GitHub separate from the cloud agent\u2019s GitHub identity. Both authorization flows run through Eliza Cloud, and repo access depends on the GitHub account or app installation behind each connection.", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: openCloudAgents, children: "Open Cloud" }) }), !elizaCloudConnected ? (_jsx(PagePanel.Empty, { variant: "surface", className: "mt-4 min-h-[12rem] rounded-3xl", title: "Connect Eliza Cloud first", description: "GitHub authorization runs through Eliza Cloud. Connect Cloud, then come back here to manage both accounts." })) : (_jsxs(_Fragment, { children: [githubError ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: githubError })) : null, githubLoading &&
382
+ githubLoading, children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] })) : null, _jsx(Button, { variant: appEnabled ? "outline" : "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleSetLifeOpsEnabled(!appEnabled), disabled: lifeOpsApp.loading || lifeOpsApp.saving, children: appEnabled ? "Disable LifeOps" : "Enable LifeOps" })] }) }), lifeOpsApp.error ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: lifeOpsApp.error })) : null, lifeOpsApp.loading ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Loading LifeOps app state" })) : null, !lifeOpsApp.loading && !appEnabled ? (_jsx(PagePanel.Empty, { variant: "surface", className: "mt-4 min-h-[12rem] rounded-3xl", title: "LifeOps is disabled" })) : null, appEnabled && !runtimeReady && !overview ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Waiting for LifeOps runtime" })) : null, appEnabled && overviewError ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: overviewError })) : null, appEnabled && overview ? (_jsxs("div", { className: "mt-2 grid gap-3 md:grid-cols-2 xl:grid-cols-4", children: [_jsx(SectionSurface, { title: "Current queue", icon: _jsx(ListTodo, { className: "h-4 w-4" }), children: _jsx(OccurrenceList, { occurrences: ownerOccurrences }) }), _jsx(SectionSurface, { title: "Goals", icon: _jsx(Target, { className: "h-4 w-4" }), children: _jsx(GoalList, { goals: ownerGoals }) }), _jsx(SectionSurface, { title: "Reminders", icon: _jsx(BellRing, { className: "h-4 w-4" }), children: _jsx(ReminderList, { reminders: ownerReminders }) }), _jsx(SectionSurface, { title: "Agent operations", icon: _jsx(Bot, { className: "h-4 w-4" }), children: _jsx(OccurrenceList, { occurrences: agentOccurrences }) })] })) : null] }), appEnabled ? _jsx(LifeOpsSettingsSection, {}) : null, appEnabled ? (_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "GitHub", heading: "Connected accounts", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: openCloudAgents, children: "Open Cloud" }) }), !elizaCloudConnected ? (_jsx(PagePanel.Empty, { variant: "surface", className: "mt-4 min-h-[12rem] rounded-3xl", title: "Connect Eliza Cloud first" })) : (_jsxs(_Fragment, { children: [githubError ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: githubError })) : null, githubLoading &&
383
383
  ownerGithubConnections.length === 0 &&
384
- agentGithubEntries.length === 0 ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Loading GitHub identities" })) : null, _jsxs("div", { className: "mt-4 grid gap-4 xl:grid-cols-[minmax(20rem,0.95fr)_minmax(22rem,1.05fr)]", children: [_jsxs(SectionSurface, { title: "LifeOps GitHub", icon: _jsx(Github, { className: "h-4 w-4" }), subtitle: "Use this account for the owner\u2019s LifeOps repos, issues, and planning context.", children: [_jsx("div", { className: "flex flex-wrap gap-2", children: _jsxs(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", disabled: ownerGithubBusy, onClick: () => void handleConnectOwnerGithub(), children: [_jsx(ExternalLink, { className: "mr-2 h-3.5 w-3.5" }), ownerGithubConnections.length > 0
384
+ agentGithubEntries.length === 0 ? (_jsx(PagePanel.Loading, { variant: "surface", className: "mt-4", heading: "Loading GitHub identities" })) : null, _jsxs("div", { className: "mt-4 grid gap-4 xl:grid-cols-[minmax(20rem,0.95fr)_minmax(22rem,1.05fr)]", children: [_jsxs(SectionSurface, { title: "LifeOps GitHub", icon: _jsx(Github, { className: "h-4 w-4" }), children: [_jsx("div", { className: "flex flex-wrap gap-2", children: _jsxs(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", disabled: ownerGithubBusy, onClick: () => void handleConnectOwnerGithub(), children: [_jsx(ExternalLink, { className: "mr-2 h-3.5 w-3.5" }), ownerGithubConnections.length > 0
385
385
  ? "Reconnect / add account"
386
- : "Connect LifeOps GitHub"] }) }), ownerGithubConnections.length === 0 ? (_jsx("div", { className: "rounded-2xl border border-dashed border-border/45 bg-bg/55 p-4 text-xs text-muted", children: "No owner GitHub account linked yet." })) : (ownerGithubConnections.map((connection) => (_jsx(OwnerGithubConnectionCard, { connection: connection, busy: disconnectingOwnerConnectionId === connection.id, onDisconnect: handleDisconnectOwnerGithub }, connection.id))))] }), _jsx(SectionSurface, { title: "Agent GitHub", icon: _jsx(Shield, { className: "h-4 w-4" }), subtitle: "Bind GitHub per cloud agent so coding work can use a separate identity from the owner account. Access may be read-only or write-enabled depending on the connected account or installation.", children: agentGithubEntries.length === 0 ? (_jsx("div", { className: "rounded-2xl border border-dashed border-border/45 bg-bg/55 p-4 text-xs text-muted", children: "No cloud agents found yet. Create or connect a cloud agent to give it its own GitHub identity." })) : (agentGithubEntries.map((entry) => (_jsx(AgentGithubCard, { entry: entry, ownerConnections: ownerGithubConnections, busyAgentId: busyAgentGithubId, onConnect: handleConnectAgentGithub, onDisconnect: handleDisconnectAgentGithub, onUseOwnerConnection: handleUseOwnerGithub }, entry.agent.agent_id)))) })] })] }))] })) : null, appEnabled ? _jsx(LifeOpsWorkspaceView, {}) : null] }));
386
+ : "Connect LifeOps GitHub"] }) }), ownerGithubConnections.length === 0 ? (_jsx("div", { className: "rounded-2xl border border-dashed border-border/45 bg-bg/55 p-4 text-xs text-muted", children: "No owner GitHub account linked yet." })) : (ownerGithubConnections.map((connection) => (_jsx(OwnerGithubConnectionCard, { connection: connection, busy: disconnectingOwnerConnectionId === connection.id, onDisconnect: handleDisconnectOwnerGithub }, connection.id))))] }), _jsx(SectionSurface, { title: "Agent GitHub", icon: _jsx(Shield, { className: "h-4 w-4" }), children: agentGithubEntries.length === 0 ? (_jsx("div", { className: "rounded-2xl border border-dashed border-border/45 bg-bg/55 p-4 text-xs text-muted", children: "No cloud agents found yet. Create or connect a cloud agent to give it its own GitHub identity." })) : (agentGithubEntries.map((entry) => (_jsx(AgentGithubCard, { entry: entry, ownerConnections: ownerGithubConnections, busyAgentId: busyAgentGithubId, onConnect: handleConnectAgentGithub, onDisconnect: handleDisconnectAgentGithub, onUseOwnerConnection: handleUseOwnerGithub }, entry.agent.agent_id)))) })] })] }))] })) : null, appEnabled ? _jsx(LifeOpsWorkspaceView, {}) : null] }));
387
387
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LifeOpsSettingsSection.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsSettingsSection.tsx"],"names":[],"mappings":"AAmYA,wBAAgB,sBAAsB,4CAwCrC"}
1
+ {"version":3,"file":"LifeOpsSettingsSection.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsSettingsSection.tsx"],"names":[],"mappings":"AAkTA,wBAAgB,sBAAsB,4CA+BrC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Badge, Button, Card, CardContent, CardHeader, CardTitle, } from "@elizaos/app-core";
3
- import { CalendarDays, Mail, Plug2, RefreshCw, ShieldCheck, } from "lucide-react";
2
+ import { Badge, Button, } from "@elizaos/app-core";
3
+ import { Plug2, RefreshCw, } from "lucide-react";
4
4
  import { useMemo } from "react";
5
5
  import { useGoogleLifeOpsConnector } from "@elizaos/app-core";
6
6
  import { useApp } from "@elizaos/app-core";
@@ -139,17 +139,16 @@ function GoogleConnectorSideCard({ apiBaseUrl, connector, side, }) {
139
139
  const { activeMode, actionPending, connect, disconnect, error, loading, modeOptions, refresh, selectMode, status, } = connector;
140
140
  const identity = readIdentity(status?.identity ?? null);
141
141
  const capabilityBadges = status?.grantedCapabilities ?? [];
142
- const expiresAtLabel = formatExpiry(status?.expiresAt ?? null);
143
142
  const currentStatusLabel = statusLabel(status?.reason ?? "disconnected", status?.connected === true);
144
143
  const setupDetails = useMemo(() => connectorSetupDetails(side, activeMode, apiBaseUrl), [activeMode, apiBaseUrl, side]);
145
- return (_jsxs(Card, { className: "border-border/60 bg-bg/20", children: [_jsx(CardHeader, { className: "space-y-3", children: _jsxs("div", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: sideTitle(side) }), status?.preferredByAgent ? (_jsx(Badge, { variant: "secondary", children: "Default on this agent" })) : null] }), _jsx("div", { className: "text-sm text-muted", children: sideDescription(side) })] }), _jsxs("div", { className: "flex items-center gap-2", children: [status?.connected && !status.preferredByAgent ? (_jsx(Button, { size: "sm", variant: "outline", disabled: loading || actionPending, onClick: () => void selectMode(activeMode), "aria-label": `Use ${sideTitle(side)} by default`, children: "Use by default" })) : null, _jsxs(Button, { size: "sm", variant: "outline", disabled: loading || actionPending, onClick: () => void refresh(), "aria-label": `Refresh ${sideTitle(side)}`, children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] }), _jsx(Button, { size: "sm", variant: status?.connected ? "outline" : "default", disabled: loading || actionPending, onClick: () => void (status?.connected ? disconnect() : connect()), "aria-label": `${status?.connected ? "Disconnect" : status?.reason === "needs_reauth" ? "Reconnect" : "Connect"} ${sideTitle(side)}`, children: status?.connected
146
- ? "Disconnect"
147
- : status?.reason === "needs_reauth"
148
- ? "Reconnect"
149
- : "Connect" })] })] }) }), _jsxs(CardContent, { className: "space-y-4", children: [_jsxs("div", { className: "rounded-2xl border border-border/60 bg-bg/40 p-4", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-txt", children: identity.primary }), _jsx(Badge, { variant: modeTone(activeMode), children: modeLabel(activeMode) }), _jsx(Badge, { variant: "outline", children: currentStatusLabel })] }), identity.secondary ? (_jsx("div", { className: "mt-1 text-sm text-muted", children: identity.secondary })) : null, _jsx("div", { className: "mt-3 flex flex-wrap gap-2", children: modeOptions.map((mode) => {
150
- const isActive = mode === activeMode;
151
- return (_jsx(Button, { size: "sm", variant: isActive ? "default" : "outline", disabled: loading || actionPending, onClick: () => void selectMode(mode), "aria-label": `${sideTitle(side)} ${modeLabel(mode)} mode`, children: modeLabel(mode) }, mode));
152
- }) }), expiresAtLabel ? (_jsxs("div", { className: "mt-3 text-xs text-muted", children: ["Token state last known valid until ", expiresAtLabel, "."] })) : null] }), _jsxs("div", { className: "grid gap-4 xl:grid-cols-[minmax(0,1.15fr)_minmax(0,0.85fr)]", children: [_jsxs(Card, { className: "border-border/60 bg-bg/20", children: [_jsx(CardHeader, { className: "space-y-2 pb-3", children: _jsxs("div", { className: "flex items-center gap-2 text-sm font-semibold text-txt", children: [_jsx(ShieldCheck, { className: "h-4 w-4 text-muted" }), "Current access"] }) }), _jsxs(CardContent, { className: "space-y-3", children: [capabilityBadges.length > 0 ? (_jsx("div", { className: "flex flex-wrap gap-2", children: capabilityBadges.map((capability) => (_jsx(Badge, { variant: "secondary", children: capabilityLabel(capability) }, capability))) })) : (_jsx("p", { className: "text-sm text-muted", children: "No Google capabilities have been granted on this setup yet." })), _jsxs("div", { className: "grid gap-2 text-sm text-muted", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CalendarDays, { className: "h-4 w-4" }), "Calendar read powers event context and scheduling."] }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Mail, { className: "h-4 w-4" }), "Gmail triage powers inbox prioritization and draft context."] })] })] })] }), _jsxs(Card, { className: "border-border/60 bg-bg/20", children: [_jsx(CardHeader, { className: "space-y-2 pb-3", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: modeTone(activeMode), children: setupDetails.eyebrow }), _jsx(CardTitle, { className: "text-sm font-semibold", children: setupDetails.title })] }) }), _jsxs(CardContent, { className: "space-y-3 text-sm text-muted", children: [setupDetails.lines.map((line) => (_jsx("p", { children: line }, line))), setupDetails.envVars.length > 0 ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 p-3", children: [_jsx("div", { className: "text-xs font-semibold uppercase tracking-[0.08em] text-muted", children: "Required config" }), _jsx("div", { className: "mt-2 space-y-1 font-mono text-xs text-txt", children: setupDetails.envVars.map((envVar) => (_jsx("div", { children: envVar }, envVar))) })] })) : null, setupDetails.redirectUri ? (_jsxs("div", { className: "rounded-xl border border-border/60 bg-bg/40 p-3", children: [_jsx("div", { className: "text-xs font-semibold uppercase tracking-[0.08em] text-muted", children: "Redirect URI" }), _jsx("div", { className: "mt-2 break-all font-mono text-xs text-txt", children: setupDetails.redirectUri })] })) : null] })] })] }), error ? _jsx("div", { className: "text-sm text-danger", children: error }) : null] })] }));
144
+ return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Badge, { variant: "outline", children: sideTitle(side) }), status?.preferredByAgent ? (_jsx(Badge, { variant: "secondary", children: "Default" })) : null] }), _jsxs("div", { className: "flex items-center gap-1.5", children: [status?.connected && !status.preferredByAgent ? (_jsx(Button, { size: "sm", variant: "outline", disabled: loading || actionPending, onClick: () => void selectMode(activeMode), children: "Use by default" })) : null, _jsxs(Button, { size: "sm", variant: "outline", disabled: loading || actionPending, onClick: () => void refresh(), children: [_jsx(RefreshCw, { className: "mr-1.5 h-3 w-3" }), "Refresh"] }), _jsx(Button, { size: "sm", variant: status?.connected ? "outline" : "default", disabled: loading || actionPending, onClick: () => void (status?.connected ? disconnect() : connect()), children: status?.connected
145
+ ? "Disconnect"
146
+ : status?.reason === "needs_reauth"
147
+ ? "Reconnect"
148
+ : "Connect" })] })] }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 text-sm", children: [_jsx("span", { className: "min-w-0 truncate font-semibold text-txt", children: identity.primary }), _jsx(Badge, { variant: modeTone(activeMode), children: modeLabel(activeMode) }), _jsx(Badge, { variant: "outline", children: currentStatusLabel }), capabilityBadges.map((capability) => (_jsx(Badge, { variant: "secondary", className: "text-2xs", children: capabilityLabel(capability) }, capability)))] }), _jsx("div", { className: "flex flex-wrap gap-1.5", children: modeOptions.map((mode) => {
149
+ const isActive = mode === activeMode;
150
+ return (_jsx(Button, { size: "sm", variant: isActive ? "default" : "outline", disabled: loading || actionPending, onClick: () => void selectMode(mode), children: modeLabel(mode) }, mode));
151
+ }) }), setupDetails.envVars.length > 0 ? (_jsxs("div", { className: "rounded-lg border border-border/50 bg-bg/40 px-3 py-2", children: [_jsx("span", { className: "text-xs font-semibold text-muted", children: "Config: " }), _jsx("span", { className: "font-mono text-xs text-txt", children: setupDetails.envVars.join(", ") })] })) : null, setupDetails.redirectUri ? (_jsxs("div", { className: "rounded-lg border border-border/50 bg-bg/40 px-3 py-2", children: [_jsx("span", { className: "text-xs font-semibold text-muted", children: "Redirect URI: " }), _jsx("span", { className: "break-all font-mono text-xs text-txt", children: setupDetails.redirectUri })] })) : null, error ? _jsx("div", { className: "text-xs text-danger", children: error }) : null] }));
153
152
  }
154
153
  export function LifeOpsSettingsSection() {
155
154
  const { t: translate } = useApp();
@@ -157,5 +156,5 @@ export function LifeOpsSettingsSection() {
157
156
  const agentConnector = useGoogleLifeOpsConnector({ side: "agent" });
158
157
  const apiBaseUrl = useMemo(() => resolveLifeOpsSettingsApiBaseUrl(), []);
159
158
  const t = typeof translate === "function" ? translate : (key) => key;
160
- return (_jsxs("div", { className: "space-y-4", children: [_jsxs(Card, { className: "border-border/60", children: [_jsxs(CardHeader, { className: "space-y-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Plug2, { className: "h-4 w-4 text-muted" }), _jsx(CardTitle, { className: "text-base font-semibold", children: t("settings.sections.lifeops.label") })] }), _jsx("p", { className: "max-w-3xl text-sm text-muted", children: "Keep separate Google setups for the owner and the agent. Each side can use Cloud or Local OAuth, and the connected mode you pick can be used as the default Google account for this agent." })] }), _jsxs(CardContent, { className: "space-y-4", children: [_jsx(GoogleConnectorSideCard, { apiBaseUrl: apiBaseUrl, connector: ownerConnector, side: "owner" }), _jsx(GoogleConnectorSideCard, { apiBaseUrl: apiBaseUrl, connector: agentConnector, side: "agent" })] })] }), _jsx(LifeOpsBrowserSetupPanel, {})] }));
159
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs("div", { className: "flex items-center gap-2 text-muted", children: [_jsx(Plug2, { className: "h-4 w-4" }), _jsx("div", { className: "text-xs font-semibold uppercase tracking-wide", children: t("settings.sections.lifeops.label") })] }), _jsxs("div", { className: "grid gap-6 xl:grid-cols-2", children: [_jsx(GoogleConnectorSideCard, { apiBaseUrl: apiBaseUrl, connector: ownerConnector, side: "owner" }), _jsx(GoogleConnectorSideCard, { apiBaseUrl: apiBaseUrl, connector: agentConnector, side: "agent" })] }), _jsx(LifeOpsBrowserSetupPanel, {})] }));
161
160
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LifeOpsWorkspaceView.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsWorkspaceView.tsx"],"names":[],"mappings":"AA2UA,wBAAgB,oBAAoB,4CA68BnC"}
1
+ {"version":3,"file":"LifeOpsWorkspaceView.d.ts","sourceRoot":"","sources":["../../../../../../apps/app-lifeops/src/LifeOpsWorkspaceView.tsx"],"names":[],"mappings":"AA2UA,wBAAgB,oBAAoB,4CAo8BnC"}
@@ -481,19 +481,19 @@ export function LifeOpsWorkspaceView() {
481
481
  { value: "email", label: "Email" },
482
482
  ];
483
483
  if (!workspaceConnected) {
484
- return (_jsx("div", { className: "space-y-4", children: _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Calendar and Inbox Workspace", description: "Connect Google for the owner or agent in LifeOps settings to bring calendar and Gmail into the operational surface.", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => setState("tab", "settings"), children: "Open settings" }) }), _jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[14rem] rounded-3xl", title: "No Google connection yet", description: "The workspace shows agenda, week, and reply-needed email views after a Google account is connected." })] }) }));
484
+ return (_jsx("div", { className: "space-y-4", children: _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Calendar and Inbox", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => setState("tab", "settings"), children: "Open settings" }) }), _jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[14rem] rounded-3xl", title: "No Google connection yet" })] }) }));
485
485
  }
486
- return (_jsxs("div", { className: "space-y-4", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Calendar and Inbox Workspace", description: "Agenda, week, and reply-needed mail live in one operational surface.", actions: _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void refreshAll(), disabled: ownerConnector.loading || agentConnector.loading, children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] }), _jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => setState("tab", "settings"), children: [_jsx(Settings2, { className: "mr-2 h-3.5 w-3.5" }), "Settings"] })] }) }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Connector" }), _jsx("div", { className: "mt-2 text-sm font-semibold text-txt", children: dataStatus ? sideLabel(dataStatus.side) : "Disconnected" }), _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: dataStatus ? modeLabel(dataStatus.mode) : "No account selected" })] }), _jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Calendar" }), _jsxs("div", { className: "mt-2 text-sm font-semibold text-txt", children: [calendarSummary, " event", calendarSummary === 1 ? "" : "s"] }), _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: pane === "week" ? "7 day window" : "Today’s agenda" })] }), _jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Inbox" }), _jsxs("div", { className: "mt-2 text-sm font-semibold text-txt", children: [replyNeededCount, " reply needed"] }), _jsxs("div", { className: "mt-1 text-xs-tight text-muted", children: [mailSummary, " mail item", mailSummary === 1 ? "" : "s", " loaded"] })] })] }), _jsx("div", { className: "mt-4", children: _jsx(SegmentedControl, { "aria-label": "LifeOps workspace navigation", value: pane, onValueChange: (value) => setPane(value), items: paneItems.map((item) => ({
486
+ return (_jsxs("div", { className: "space-y-4", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "LifeOps", heading: "Calendar and Inbox", actions: _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void refreshAll(), disabled: ownerConnector.loading || agentConnector.loading, children: [_jsx(RefreshCw, { className: "mr-2 h-3.5 w-3.5" }), "Refresh"] }), _jsxs(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => setState("tab", "settings"), children: [_jsx(Settings2, { className: "mr-2 h-3.5 w-3.5" }), "Settings"] })] }) }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Connector" }), _jsx("div", { className: "mt-2 text-sm font-semibold text-txt", children: dataStatus ? sideLabel(dataStatus.side) : "Disconnected" }), _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: dataStatus ? modeLabel(dataStatus.mode) : "No account selected" })] }), _jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Calendar" }), _jsxs("div", { className: "mt-2 text-sm font-semibold text-txt", children: [calendarSummary, " event", calendarSummary === 1 ? "" : "s"] }), _jsx("div", { className: "mt-1 text-xs-tight text-muted", children: pane === "week" ? "7 day window" : "Today’s agenda" })] }), _jsxs("div", { className: "rounded-2xl border border-border/40 bg-bg/72 p-4", children: [_jsx("div", { className: "text-2xs font-semibold uppercase tracking-[0.12em] text-muted", children: "Inbox" }), _jsxs("div", { className: "mt-2 text-sm font-semibold text-txt", children: [replyNeededCount, " reply needed"] }), _jsxs("div", { className: "mt-1 text-xs-tight text-muted", children: [mailSummary, " mail item", mailSummary === 1 ? "" : "s", " loaded"] })] })] }), _jsx("div", { className: "mt-4", children: _jsx(SegmentedControl, { "aria-label": "LifeOps workspace navigation", value: pane, onValueChange: (value) => setPane(value), items: paneItems.map((item) => ({
487
487
  value: item.value,
488
488
  label: item.label,
489
489
  })), buttonClassName: "min-h-9 whitespace-nowrap px-3 py-2.5", "data-testid": "lifeops-workspace-nav" }) }), workspaceError ? (_jsx(PagePanel.Notice, { tone: "danger", className: "mt-4", children: workspaceError })) : null, loading &&
490
490
  calendarEvents.length === 0 &&
491
- gmailMessages.length === 0 ? (_jsx(PagePanel.Loading, { variant: "surface", heading: "Loading LifeOps workspace", className: "mt-4" })) : null] }), pane === "email" ? (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[minmax(20rem,0.85fr)_minmax(0,1fr)]", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Gmail", heading: "Reply-needed mail", description: "Filter to the threads that most likely need a response.", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh mail" }) }), _jsxs("div", { className: "space-y-3", children: [_jsx(Input, { "data-testid": "lifeops-mail-search", value: mailSearch, onChange: (event) => setMailSearch(event.target.value), placeholder: "Search subjects, senders, or snippets", "aria-label": "Search mail" }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-muted", children: [_jsx("input", { type: "checkbox", checked: replyNeededOnly, onChange: (event) => setReplyNeededOnly(event.target.checked) }), "Reply-needed only"] }), _jsx("div", { className: "space-y-2", children: filteredGmailMessages.length === 0 ? (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[12rem] rounded-3xl", title: "No mail matches", description: "Clear the filter or turn off reply-needed only to inspect the loaded Gmail triage feed." })) : (filteredGmailMessages.map((message) => (_jsx(GmailMessageCard, { message: message, selected: message.id === selectedGmailMessage?.id, onSelect: setSelectedMessageId, timeZone: timeZone }, message.id)))) })] })] }), _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Draft", heading: selectedGmailMessage?.subject ?? "Select a message", description: selectedGmailMessage?.from ?? "No message selected" }), selectedGmailMessage ? (_jsxs("div", { className: "space-y-3", children: [_jsxs(DetailBlock, { title: "Message detail", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Subject:" }), " ", selectedGmailMessage.subject] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "From:" }), " ", selectedGmailMessage.from] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Snippet:" }), " ", selectedGmailMessage.snippet] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Received:" }), " ", formatLocalDateTime(selectedGmailMessage.receivedAt, timeZone)] })] }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsxs("label", { className: "space-y-1 sm:col-span-1", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Tone" }), _jsxs("select", { value: draftTone, onChange: (event) => setDraftTone(event.target.value), className: "min-h-11 w-full rounded-xl border border-border/60 bg-card/96 px-3 py-2 text-sm text-txt shadow-sm", children: [_jsx("option", { value: "brief", children: "Brief" }), _jsx("option", { value: "neutral", children: "Neutral" }), _jsx("option", { value: "warm", children: "Warm" })] })] }), _jsxs("label", { className: "space-y-1 sm:col-span-2", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Intent" }), _jsx(Input, { "data-testid": "lifeops-draft-intent", value: draftIntent, onChange: (event) => setDraftIntent(event.target.value), placeholder: "What should the reply achieve?" })] })] }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-muted", children: [_jsx("input", { type: "checkbox", checked: draftIncludeQuotedOriginal, onChange: (event) => setDraftIncludeQuotedOriginal(event.target.checked) }), "Include quoted original"] }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleGenerateDraft(), disabled: !dataCapabilities.has("google.gmail.triage") || drafting, children: drafting ? "Drafting..." : "Generate draft" }), _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh triage" })] }), _jsx(Textarea, { "data-testid": "lifeops-draft-body", value: draftBody, onChange: (event) => setDraftBody(event.target.value), placeholder: "Draft body appears here", className: "min-h-48" }), draft ? (_jsxs(DetailBlock, { title: "Draft metadata", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Send allowed:" }), " ", draft.sendAllowed ? "Yes" : "No"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Requires confirmation:" }), " ", draft.requiresConfirmation ? "Yes" : "No"] }), draft.previewLines.length > 0 ? (_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "font-semibold text-txt", children: "Preview:" }), draft.previewLines.map((line) => (_jsx("div", { children: line }, line)))] })) : null] })) : null, _jsx("div", { className: "flex flex-wrap gap-2", children: _jsx(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleSendDraft(), disabled: !dataCapabilities.has("google.gmail.send") ||
491
+ gmailMessages.length === 0 ? (_jsx(PagePanel.Loading, { variant: "surface", heading: "Loading LifeOps workspace", className: "mt-4" })) : null] }), pane === "email" ? (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[minmax(20rem,0.85fr)_minmax(0,1fr)]", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Gmail", heading: "Reply-needed mail", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh mail" }) }), _jsxs("div", { className: "space-y-3", children: [_jsx(Input, { "data-testid": "lifeops-mail-search", value: mailSearch, onChange: (event) => setMailSearch(event.target.value), placeholder: "Search subjects, senders, or snippets", "aria-label": "Search mail" }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-muted", children: [_jsx("input", { type: "checkbox", checked: replyNeededOnly, onChange: (event) => setReplyNeededOnly(event.target.checked) }), "Reply-needed only"] }), _jsx("div", { className: "space-y-2", children: filteredGmailMessages.length === 0 ? (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[12rem] rounded-3xl", title: "No mail matches" })) : (filteredGmailMessages.map((message) => (_jsx(GmailMessageCard, { message: message, selected: message.id === selectedGmailMessage?.id, onSelect: setSelectedMessageId, timeZone: timeZone }, message.id)))) })] })] }), _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Draft", heading: selectedGmailMessage?.subject ?? "Select a message", description: selectedGmailMessage?.from ?? "No message selected" }), selectedGmailMessage ? (_jsxs("div", { className: "space-y-3", children: [_jsxs(DetailBlock, { title: "Message detail", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Subject:" }), " ", selectedGmailMessage.subject] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "From:" }), " ", selectedGmailMessage.from] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Snippet:" }), " ", selectedGmailMessage.snippet] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Received:" }), " ", formatLocalDateTime(selectedGmailMessage.receivedAt, timeZone)] })] }), _jsxs("div", { className: "grid gap-3 sm:grid-cols-3", children: [_jsxs("label", { className: "space-y-1 sm:col-span-1", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Tone" }), _jsxs("select", { value: draftTone, onChange: (event) => setDraftTone(event.target.value), className: "min-h-11 w-full rounded-xl border border-border/60 bg-card/96 px-3 py-2 text-sm text-txt shadow-sm", children: [_jsx("option", { value: "brief", children: "Brief" }), _jsx("option", { value: "neutral", children: "Neutral" }), _jsx("option", { value: "warm", children: "Warm" })] })] }), _jsxs("label", { className: "space-y-1 sm:col-span-2", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Intent" }), _jsx(Input, { "data-testid": "lifeops-draft-intent", value: draftIntent, onChange: (event) => setDraftIntent(event.target.value), placeholder: "What should the reply achieve?" })] })] }), _jsxs("label", { className: "flex items-center gap-2 text-xs text-muted", children: [_jsx("input", { type: "checkbox", checked: draftIncludeQuotedOriginal, onChange: (event) => setDraftIncludeQuotedOriginal(event.target.checked) }), "Include quoted original"] }), _jsxs("div", { className: "flex flex-wrap gap-2", children: [_jsx(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleGenerateDraft(), disabled: !dataCapabilities.has("google.gmail.triage") || drafting, children: drafting ? "Drafting..." : "Generate draft" }), _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh triage" })] }), _jsx(Textarea, { "data-testid": "lifeops-draft-body", value: draftBody, onChange: (event) => setDraftBody(event.target.value), placeholder: "Draft body appears here", className: "min-h-48" }), draft ? (_jsxs(DetailBlock, { title: "Draft metadata", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Send allowed:" }), " ", draft.sendAllowed ? "Yes" : "No"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Requires confirmation:" }), " ", draft.requiresConfirmation ? "Yes" : "No"] }), draft.previewLines.length > 0 ? (_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "font-semibold text-txt", children: "Preview:" }), draft.previewLines.map((line) => (_jsx("div", { children: line }, line)))] })) : null] })) : null, _jsx("div", { className: "flex flex-wrap gap-2", children: _jsx(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleSendDraft(), disabled: !dataCapabilities.has("google.gmail.send") ||
492
492
  sending ||
493
- draftBody.trim().length === 0, children: sending ? "Sending..." : "Send reply" }) })] })) : (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[20rem] rounded-3xl", title: "Select a message", description: "Pick a reply-needed thread to draft or send a follow-up." }))] })] })) : (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[minmax(20rem,0.85fr)_minmax(0,1fr)]", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Calendar", heading: pane === "week" ? "Week agenda" : "Today’s agenda", description: "The live Google calendar feed, grouped by day.", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh calendar" }) }), _jsx("div", { className: "space-y-3", children: groupedCalendarEvents.length === 0 ? (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[12rem] rounded-3xl", title: "No upcoming events", description: "The calendar feed is empty in this window." })) : (groupedCalendarEvents.map((group) => (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-xs-tight font-semibold uppercase tracking-[0.12em] text-muted", children: group.label }), _jsx("div", { className: "space-y-2", children: group.events.map((event) => (_jsx(CalendarEventCard, { event: event, selected: event.id === selectedCalendarEvent?.id, onSelect: setSelectedCalendarId, timeZone: timeZone }, event.id))) })] }, group.dayKey)))) })] }), _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Detail", heading: selectedCalendarEvent?.title ?? "Select an event", description: selectedCalendarEvent
493
+ draftBody.trim().length === 0, children: sending ? "Sending..." : "Send reply" }) })] })) : (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[20rem] rounded-3xl", title: "Select a message" }))] })] })) : (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[minmax(20rem,0.85fr)_minmax(0,1fr)]", children: [_jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Calendar", heading: pane === "week" ? "Week agenda" : "Today’s agenda", actions: _jsx(Button, { variant: "outline", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void loadWorkspace(), children: "Refresh calendar" }) }), _jsx("div", { className: "space-y-3", children: groupedCalendarEvents.length === 0 ? (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[12rem] rounded-3xl", title: "No upcoming events" })) : (groupedCalendarEvents.map((group) => (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "text-xs-tight font-semibold uppercase tracking-[0.12em] text-muted", children: group.label }), _jsx("div", { className: "space-y-2", children: group.events.map((event) => (_jsx(CalendarEventCard, { event: event, selected: event.id === selectedCalendarEvent?.id, onSelect: setSelectedCalendarId, timeZone: timeZone }, event.id))) })] }, group.dayKey)))) })] }), _jsxs(PagePanel, { variant: "section", className: "p-4 lg:p-5", children: [_jsx(PagePanel.Header, { eyebrow: "Detail", heading: selectedCalendarEvent?.title ?? "Select an event", description: selectedCalendarEvent
494
494
  ? formatEventWindow(selectedCalendarEvent, timeZone)
495
495
  : "No calendar event selected." }), selectedCalendarEvent ? (_jsxs("div", { className: "space-y-3", children: [_jsxs(DetailBlock, { title: "Event detail", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Location:" }), " ", selectedCalendarEvent.location || "—"] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Starts:" }), " ", formatLocalDateTime(selectedCalendarEvent.startAt, timeZone)] }), _jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Ends:" }), " ", formatLocalDateTime(selectedCalendarEvent.endAt, timeZone)] }), selectedCalendarEvent.conferenceLink ? (_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Conference:" }), " ", selectedCalendarEvent.conferenceLink] })) : null, selectedCalendarEvent.description.trim().length > 0 ? (_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Description:" }), " ", selectedCalendarEvent.description] })) : null] }), calendarContext ? (_jsxs(DetailBlock, { title: "Preparation", children: [_jsxs("div", { children: [_jsx("span", { className: "font-semibold text-txt", children: "Starts in:" }), " ", calendarContext.startsInMinutes === null
496
496
  ? "—"
497
497
  : `${calendarContext.startsInMinutes} minutes`] }), calendarContext.preparationChecklist.length > 0 ? (_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "font-semibold text-txt", children: "Checklist:" }), calendarContext.preparationChecklist.map((item) => (_jsxs("div", { children: ["\u2022 ", item] }, item)))] })) : null, calendarContext.linkedMail.length > 0 ? (_jsxs("div", { className: "space-y-1", children: [_jsx("div", { className: "font-semibold text-txt", children: "Linked mail:" }), calendarContext.linkedMail.map((message) => (_jsxs("div", { children: [message.subject, " - ", message.from] }, message.id)))] })) : null] })) : null, _jsxs(DetailBlock, { title: "Quick create", children: [_jsxs("div", { className: "grid gap-3 sm:grid-cols-2", children: [_jsxs("label", { className: "space-y-1 sm:col-span-2", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Title" }), _jsx(Input, { "data-testid": "lifeops-create-event-title", value: eventTitle, onChange: (event) => setEventTitle(event.target.value), placeholder: "Weekly planning" })] }), _jsxs("label", { className: "space-y-1", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Date" }), _jsx(Input, { "data-testid": "lifeops-create-event-date", type: "date", value: eventDate, onChange: (event) => setEventDate(event.target.value) })] }), _jsxs("label", { className: "space-y-1", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Time" }), _jsx(Input, { "data-testid": "lifeops-create-event-time", type: "time", value: eventTime, onChange: (event) => setEventTime(event.target.value) })] }), _jsxs("label", { className: "space-y-1", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Duration" }), _jsx(Input, { "data-testid": "lifeops-create-event-duration", type: "number", min: 5, step: 5, value: eventDurationMinutes, onChange: (event) => setEventDurationMinutes(event.target.value) })] }), _jsxs("label", { className: "space-y-1 sm:col-span-2", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Location" }), _jsx(Input, { "data-testid": "lifeops-create-event-location", value: eventLocation, onChange: (event) => setEventLocation(event.target.value), placeholder: "Conference room or link" })] }), _jsxs("label", { className: "space-y-1 sm:col-span-2", children: [_jsx("span", { className: "text-xs-tight font-semibold uppercase tracking-[0.08em] text-muted", children: "Description" }), _jsx(Textarea, { "data-testid": "lifeops-create-event-description", value: eventDescription, onChange: (event) => setEventDescription(event.target.value), placeholder: "Add prep notes", className: "min-h-28" })] })] }), _jsx("div", { className: "mt-3 flex flex-wrap gap-2", children: _jsx(Button, { variant: "default", size: "sm", className: "rounded-full px-4 text-xs-tight font-semibold", onClick: () => void handleCreateEvent(), disabled: creatingEvent ||
498
- !dataCapabilities.has("google.calendar.write"), children: creatingEvent ? "Creating..." : "Create event" }) })] })] })) : (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[20rem] rounded-3xl", title: "Select a day", description: "Pick an event to inspect detail and linked context." }))] })] }))] }));
498
+ !dataCapabilities.has("google.calendar.write"), children: creatingEvent ? "Creating..." : "Create event" }) })] })] })) : (_jsx(PagePanel.Empty, { variant: "surface", className: "min-h-[20rem] rounded-3xl", title: "Select a day" }))] })] }))] }));
499
499
  }
@@ -1 +1 @@
1
- {"version":3,"file":"app-state.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/app-state.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACxD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC7D,CAAC;AAMF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAC/B,OAAO,CAAC,eAAe,CAAC,CAkB1B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,eAAe,CAAC,CAc1B"}
1
+ {"version":3,"file":"app-state.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/lifeops/app-state.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,KAAK,gBAAgB,GAAG;IACtB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACxD,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;CAC7D,CAAC;AAMF,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,GAAG,IAAI,GAC/B,OAAO,CAAC,eAAe,CAAC,CAqB1B;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,gBAAgB,EACzB,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,eAAe,CAAC,CAc1B"}
@@ -1,7 +1,7 @@
1
1
  import { logger } from "@elizaos/core";
2
2
  const LIFEOPS_APP_STATE_CACHE_KEY = "eliza:lifeops-app-state";
3
3
  const DEFAULT_LIFEOPS_APP_STATE = {
4
- enabled: false,
4
+ enabled: true,
5
5
  };
6
6
  export async function loadLifeOpsAppState(runtime) {
7
7
  if (!runtime) {
@@ -9,8 +9,11 @@ export async function loadLifeOpsAppState(runtime) {
9
9
  }
10
10
  try {
11
11
  const cached = await runtime.getCache(LIFEOPS_APP_STATE_CACHE_KEY);
12
+ if (cached == null) {
13
+ return DEFAULT_LIFEOPS_APP_STATE;
14
+ }
12
15
  return {
13
- enabled: cached?.enabled === true,
16
+ enabled: cached.enabled !== false,
14
17
  };
15
18
  }
16
19
  catch (error) {
@@ -1,13 +1,19 @@
1
- import type { IAgentRuntime, Memory } from "@elizaos/core";
2
- type RoleName = "OWNER" | "ADMIN" | "USER" | "GUEST";
3
- export type RoleCheckResult = {
4
- entityId: string;
5
- role: RoleName;
6
- isOwner: boolean;
7
- isAdmin: boolean;
8
- canManageRoles: boolean;
1
+ /**
2
+ * Selfcontrol role checking delegates to the core @elizaos/core roles module.
3
+ *
4
+ * Previously this was a full reimplementation that diverged from core,
5
+ * missing world-resolution fallbacks and silently swallowing errors.
6
+ * Now it's a thin adapter that re-exports the core checkSenderRole
7
+ * with the extra `hasPrivateAccess` field for backward compatibility.
8
+ *
9
+ * When the core module returns null (no world found for the message),
10
+ * we fall back to checking whether the sender matches the configured
11
+ * admin entity ID. This covers dashboard/terminal sessions where the
12
+ * world may not exist yet or the room has no worldId.
13
+ */
14
+ import { type IAgentRuntime, type Memory, type RoleCheckResult as CoreRoleCheckResult } from "@elizaos/core";
15
+ export type RoleCheckResult = CoreRoleCheckResult & {
9
16
  hasPrivateAccess: boolean;
10
17
  };
11
18
  export declare function checkSenderRole(runtime: IAgentRuntime, message: Memory): Promise<RoleCheckResult | null>;
12
- export {};
13
19
  //# sourceMappingURL=roles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/selfcontrol/roles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAK3D,KAAK,QAAQ,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;AAwBrD,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAgRF,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAuCjC"}
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../../../../../apps/app-lifeops/src/selfcontrol/roles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,MAAM,EACX,KAAK,eAAe,IAAI,mBAAmB,EAE5C,MAAM,eAAe,CAAC;AAEvB,MAAM,MAAM,eAAe,GAAG,mBAAmB,GAAG;IAClD,gBAAgB,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,wBAAsB,eAAe,CACnC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAiCjC"}
@@ -1,228 +1,41 @@
1
- const CANONICAL_OWNER_SETTING_KEY = "ELIZA_ADMIN_ENTITY_ID";
2
- const IDENTITY_LINK_TAG = "identity_link";
3
- function normalizeRole(role) {
4
- if (typeof role !== "string") {
5
- return "GUEST";
6
- }
7
- switch (role.toUpperCase()) {
8
- case "OWNER":
9
- return "OWNER";
10
- case "ADMIN":
11
- return "ADMIN";
12
- case "USER":
13
- return "USER";
14
- default:
15
- return "GUEST";
16
- }
17
- }
18
- function resolveCanonicalOwnerId(runtime, metadata) {
19
- if (typeof runtime.getSetting === "function") {
20
- const configured = runtime.getSetting(CANONICAL_OWNER_SETTING_KEY);
21
- if (typeof configured === "string" && configured.trim().length > 0) {
22
- return configured.trim();
23
- }
24
- }
25
- return metadata?.ownership?.ownerId ?? null;
26
- }
27
- async function resolveWorldForMessage(runtime, message) {
28
- const room = await runtime.getRoom(message.roomId);
29
- if (!room?.worldId) {
30
- return null;
31
- }
32
- const world = await runtime.getWorld(room.worldId);
33
- if (!world) {
34
- return null;
35
- }
36
- return (world.metadata ?? {});
37
- }
38
- function normalizeIdentityValue(value) {
39
- if (typeof value === "number" || typeof value === "bigint") {
40
- return String(value);
41
- }
42
- if (typeof value !== "string") {
43
- return null;
44
- }
45
- const normalized = value.trim();
46
- if (normalized.length === 0) {
47
- return null;
48
- }
49
- return normalized.toLowerCase();
50
- }
51
- function collectConnectorIdentities(metadata) {
52
- if (!metadata) {
53
- return [];
54
- }
55
- const identities = [];
56
- for (const [connector, rawConnectorData] of Object.entries(metadata)) {
57
- if (!rawConnectorData || typeof rawConnectorData !== "object") {
58
- continue;
59
- }
60
- const connectorData = rawConnectorData;
61
- const values = new Set();
62
- for (const field of ["id", "userId", "user_id", "fromId", "username"]) {
63
- const normalized = normalizeIdentityValue(connectorData[field]);
64
- if (normalized) {
65
- values.add(normalized);
66
- }
67
- }
68
- if (values.size > 0) {
69
- identities.push({ connector, values });
70
- }
71
- }
72
- return identities;
73
- }
74
- function extractLiveMessageMetadata(message) {
75
- const metadata = message.content?.metadata;
76
- if (metadata && typeof metadata === "object" && !Array.isArray(metadata)) {
77
- return metadata;
78
- }
79
- return undefined;
80
- }
81
- function extractMessageConnectorMetadata(message) {
82
- const metadata = message
83
- .metadata;
84
- if (!metadata || typeof metadata !== "object" || Array.isArray(metadata)) {
85
- return undefined;
86
- }
87
- const source = typeof message.content?.source === "string"
88
- ? message.content.source
89
- : undefined;
90
- const result = {};
91
- const fromId = metadata.fromId ??
92
- metadata.discordUserId ??
93
- metadata.telegramUserId ??
94
- metadata.userId ??
95
- metadata.id;
96
- const username = metadata.username ?? metadata.telegramUsername;
97
- if (source === "discord" ||
98
- typeof metadata.discordServerId === "string" ||
99
- typeof metadata.discordChannelId === "string") {
100
- result.discord = {
101
- userId: fromId,
102
- username,
103
- };
104
- }
105
- if (source === "telegram" ||
106
- typeof metadata.telegramChatId === "string" ||
107
- typeof metadata.telegramUserId === "string") {
108
- result.telegram = {
109
- id: fromId,
110
- username,
1
+ /**
2
+ * Selfcontrol role checking — delegates to the core @elizaos/core roles module.
3
+ *
4
+ * Previously this was a full reimplementation that diverged from core,
5
+ * missing world-resolution fallbacks and silently swallowing errors.
6
+ * Now it's a thin adapter that re-exports the core checkSenderRole
7
+ * with the extra `hasPrivateAccess` field for backward compatibility.
8
+ *
9
+ * When the core module returns null (no world found for the message),
10
+ * we fall back to checking whether the sender matches the configured
11
+ * admin entity ID. This covers dashboard/terminal sessions where the
12
+ * world may not exist yet or the room has no worldId.
13
+ */
14
+ import { checkSenderRole as coreCheckSenderRole, logger, resolveCanonicalOwnerId, } from "@elizaos/core";
15
+ export async function checkSenderRole(runtime, message) {
16
+ const result = await coreCheckSenderRole(runtime, message);
17
+ if (result) {
18
+ return {
19
+ ...result,
20
+ hasPrivateAccess: result.isAdmin,
111
21
  };
112
22
  }
113
- return Object.keys(result).length > 0 ? result : undefined;
114
- }
115
- function sharesConnectorIdentity(left, right) {
116
- if (!left || !right) {
117
- return false;
118
- }
119
- const leftIdentities = collectConnectorIdentities(left);
120
- const rightByConnector = new Map(collectConnectorIdentities(right).map((identity) => [
121
- identity.connector,
122
- identity.values,
123
- ]));
124
- for (const identity of leftIdentities) {
125
- const otherValues = rightByConnector.get(identity.connector);
126
- if (!otherValues) {
127
- continue;
128
- }
129
- for (const value of identity.values) {
130
- if (otherValues.has(value)) {
131
- return true;
132
- }
133
- }
134
- }
135
- return false;
136
- }
137
- async function getEntity(runtime, entityId) {
138
- if (typeof runtime.getEntityById !== "function") {
139
- return null;
140
- }
141
- const entity = await runtime.getEntityById(entityId);
142
- return entity ? entity : null;
143
- }
144
- function isConfirmedIdentityLink(relationship, senderEntityId, canonicalOwnerId) {
145
- if (!Array.isArray(relationship.tags)) {
146
- return false;
147
- }
148
- if (!relationship.tags.includes(IDENTITY_LINK_TAG)) {
149
- return false;
150
- }
151
- const status = normalizeIdentityValue(relationship.metadata?.status);
152
- if (status !== "confirmed") {
153
- return false;
154
- }
155
- return ((relationship.sourceEntityId === senderEntityId &&
156
- relationship.targetEntityId === canonicalOwnerId) ||
157
- (relationship.sourceEntityId === canonicalOwnerId &&
158
- relationship.targetEntityId === senderEntityId));
159
- }
160
- async function senderMatchesCanonicalOwner(runtime, message, canonicalOwnerId) {
23
+ // Fallback: no world found for this message's room. This happens for
24
+ // dashboard/terminal sessions where the world may not be set up yet.
25
+ // If the sender matches the configured canonical owner, grant OWNER.
26
+ const canonicalOwnerId = resolveCanonicalOwnerId(runtime);
161
27
  const senderEntityId = String(message.entityId);
162
- if (senderEntityId === canonicalOwnerId) {
163
- return true;
164
- }
165
- const ownerEntity = await getEntity(runtime, canonicalOwnerId);
166
- const ownerMetadata = ownerEntity?.metadata && typeof ownerEntity.metadata === "object"
167
- ? ownerEntity.metadata
168
- : undefined;
169
- if (ownerMetadata) {
170
- const senderEntity = await getEntity(runtime, senderEntityId);
171
- const senderMetadataCandidates = [
172
- extractMessageConnectorMetadata(message),
173
- extractLiveMessageMetadata(message),
174
- senderEntity?.metadata && typeof senderEntity.metadata === "object"
175
- ? senderEntity.metadata
176
- : undefined,
177
- ];
178
- for (const senderMetadata of senderMetadataCandidates) {
179
- if (sharesConnectorIdentity(senderMetadata, ownerMetadata)) {
180
- return true;
181
- }
182
- }
183
- }
184
- if (typeof runtime.getRelationships !== "function") {
185
- return false;
186
- }
187
- const relationships = (await runtime.getRelationships({
188
- entityIds: [senderEntityId],
189
- tags: [IDENTITY_LINK_TAG],
190
- }));
191
- return relationships.some((relationship) => isConfirmedIdentityLink(relationship, senderEntityId, canonicalOwnerId));
192
- }
193
- export async function checkSenderRole(runtime, message) {
194
- try {
195
- const metadata = await resolveWorldForMessage(runtime, message);
196
- if (!metadata) {
197
- return null;
198
- }
199
- const senderEntityId = String(message.entityId);
200
- const canonicalOwnerId = resolveCanonicalOwnerId(runtime, metadata);
201
- let role;
202
- if (canonicalOwnerId &&
203
- (await senderMatchesCanonicalOwner(runtime, message, canonicalOwnerId))) {
204
- role = "OWNER";
205
- }
206
- else {
207
- const storedRole = normalizeRole(metadata.roles?.[senderEntityId]);
208
- role =
209
- canonicalOwnerId &&
210
- storedRole === "OWNER" &&
211
- senderEntityId !== canonicalOwnerId
212
- ? "GUEST"
213
- : storedRole;
214
- }
215
- const isAdmin = role === "OWNER" || role === "ADMIN";
28
+ if (canonicalOwnerId && senderEntityId === canonicalOwnerId) {
29
+ logger.debug("[selfcontrol] No world for message room, but sender matches configured admin entity — granting OWNER");
216
30
  return {
217
31
  entityId: senderEntityId,
218
- role,
219
- isOwner: role === "OWNER",
220
- isAdmin,
221
- canManageRoles: isAdmin,
222
- hasPrivateAccess: isAdmin,
32
+ role: "OWNER",
33
+ isOwner: true,
34
+ isAdmin: true,
35
+ canManageRoles: true,
36
+ hasPrivateAccess: true,
223
37
  };
224
38
  }
225
- catch {
226
- return null;
227
- }
39
+ logger.debug("[selfcontrol] checkSenderRole returned null — no world found and sender does not match configured admin entity");
40
+ return null;
228
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/app-core",
3
- "version": "2.0.0-alpha.169",
3
+ "version": "2.0.0-alpha.170",
4
4
  "description": "Shared application core for elizaOS white-label agent apps.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -411,17 +411,17 @@
411
411
  "@capacitor/keyboard": "8.0.0",
412
412
  "@capacitor/preferences": "^8.0.1",
413
413
  "@clack/prompts": "^1.0.0",
414
- "@elizaos/agent": "^2.0.0-alpha.169",
414
+ "@elizaos/agent": "^2.0.0-alpha.170",
415
415
  "@elizaos/app-companion": "^0.0.0",
416
416
  "@elizaos/app-shopify": "^0.0.0",
417
417
  "@elizaos/app-steward": "^0.0.0",
418
418
  "@elizaos/app-task-coordinator": "^0.0.0",
419
419
  "@elizaos/app-training": "^0.0.1",
420
420
  "@elizaos/app-vincent": "^0.0.0",
421
- "@elizaos/core": "^2.0.0-alpha.169",
421
+ "@elizaos/core": "^2.0.0-alpha.170",
422
422
  "@elizaos/plugin-wechat": "^0.1.0",
423
- "@elizaos/shared": "^2.0.0-alpha.169",
424
- "@elizaos/ui": "^2.0.0-alpha.169",
423
+ "@elizaos/shared": "^2.0.0-alpha.170",
424
+ "@elizaos/ui": "^2.0.0-alpha.170",
425
425
  "@radix-ui/react-checkbox": "^1.3.3",
426
426
  "@radix-ui/react-dialog": "^1.1.15",
427
427
  "@radix-ui/react-dropdown-menu": "^2.1.16",
@@ -1 +1 @@
1
- {"version":3,"file":"core-plugins.d.ts","sourceRoot":"","sources":["../../../../../../agent/src/runtime/core-plugins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAA2B,CAAC;AAE9E,iGAAiG;AACjG,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAgBzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EA4BlD,CAAC"}
1
+ {"version":3,"file":"core-plugins.d.ts","sourceRoot":"","sources":["../../../../../../agent/src/runtime/core-plugins.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB,EAAE,SAAS,MAAM,EAA2B,CAAC;AAE9E,iGAAiG;AACjG,eAAO,MAAM,YAAY,EAAE,SAAS,MAAM,EAiBzC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EA4BlD,CAAC"}
@@ -20,6 +20,7 @@ export const CORE_PLUGINS = [
20
20
  "@elizaos/plugin-shell", // shell command execution
21
21
  "@elizaos/plugin-agent-skills", // skill execution and marketplace runtime
22
22
  "@elizaos/plugin-commands", // slash command handling (skills auto-register as /commands)
23
+ "@elizaos/app-lifeops", // LifeOps: personal ops — tasks, goals, calendar, inbox, browser companions, website blocking
23
24
  // Built-in runtime capabilities (no longer external plugins):
24
25
  // - experience, form, clipboard, personality: advanced capabilities (advancedCapabilities: true)
25
26
  // - trust: core capability (enableTrust: true)
@@ -34,7 +35,7 @@ export const CORE_PLUGINS = [
34
35
  export const OPTIONAL_CORE_PLUGINS = [
35
36
  // plugin-manager, secrets-manager, trust: now built-in core capabilities
36
37
  // Enable via character settings: ENABLE_PLUGIN_MANAGER, ENABLE_SECRETS_MANAGER, ENABLE_TRUST
37
- "@elizaos/app-lifeops", // LifeOps: browser companions + hosts-file website blocker
38
+ // "@elizaos/app-lifeops" moved to CORE_PLUGINS above
38
39
  "@elizaos/plugin-pdf", // PDF processing (published bundle broken in alpha.15)
39
40
  "@elizaos/plugin-cua", // CUA computer-use agent (cloud sandbox automation)
40
41
  "@elizaos/plugin-obsidian", // Obsidian vault CLI integration
@@ -131,7 +131,7 @@ ElizaClient.prototype.createCloudCompatAgentManagedGithubOauth =
131
131
  params.set("return_url", request.returnUrl);
132
132
  }
133
133
  const fallback = await this.initiateCloudOauth("github", {
134
- redirectUrl: `/api/v1/app/lifeops/github-complete?${params.toString()}`,
134
+ redirectUrl: `/api/v1/milady/lifeops/github-complete?${params.toString()}`,
135
135
  connectionRole: "agent",
136
136
  scopes: request.scopes,
137
137
  });
@@ -1 +1 @@
1
- {"version":3,"file":"plugins-compat-routes.d.ts","sourceRoot":"","sources":["../../../../../src/api/plugins-compat-routes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugins-compat-routes.d.ts","sourceRoot":"","sources":["../../../../../src/api/plugins-compat-routes.ts"],"names":[],"mappings":"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"}
@@ -244,7 +244,13 @@ export function analyzePluginStateDrift(pluginList, configRecord, configEntries,
244
244
  compatEnabled !== entryEnabled) {
245
245
  driftFlags.push("entries_vs_compat");
246
246
  }
247
- if (enabledAllowList !== null && entryEnabled !== undefined) {
247
+ // Connector and streaming plugins load from config.connectors / config.streaming,
248
+ // not from plugins.allow. Only flag allowlist drift for plugins whose load path
249
+ // actually depends on the allow list (i.e. optional core plugins).
250
+ if (enabledAllowList !== null &&
251
+ entryEnabled !== undefined &&
252
+ category !== "connector" &&
253
+ category !== "streaming") {
248
254
  if (enabledAllowList !== entryEnabled) {
249
255
  driftFlags.push("entries_vs_allowlist");
250
256
  }
@@ -117,9 +117,9 @@ export function Header({ mobileLeft, pageRightExtras, transparent: _transparent
117
117
  }, children: _jsx(Menu, { className: "pointer-events-none w-5 h-5" }) })) : null, children: showNavigationMenu ? (_jsx("nav", { className: "scrollbar-hide hidden flex-1 items-center justify-start gap-1.5 overflow-x-auto whitespace-nowrap sm:flex", children: tabGroups.map((group) => {
118
118
  const primaryTab = group.tabs[0];
119
119
  const isActive = group.tabs.includes(tab);
120
- return (_jsxs(Button, { variant: isActive ? "default" : "ghost", "data-testid": `header-nav-button-${primaryTab}`, className: `relative z-10 min-h-touch shrink-0 rounded-xl border border-transparent px-3 py-2.5 text-xs transition-all duration-200 md:px-3.5 xl:px-4 ${isActive
121
- ? "border-accent/30 bg-accent/12 text-txt font-semibold shadow-[0_2px_10px_rgba(3,5,10,0.08)] ring-1 ring-inset ring-accent/18 dark:shadow-[0_0_0_1px_rgba(var(--accent-rgb),0.14),0_0_14px_rgba(var(--accent-rgb),0.14)]"
122
- : "text-muted hover:border-border/45 hover:bg-bg-hover/70 hover:text-txt"}`, onClick: () => setTab(primaryTab), title: group.description, style: {
120
+ return (_jsxs(Button, { variant: "ghost", "data-testid": `header-nav-button-${primaryTab}`, className: `relative z-10 min-h-touch shrink-0 rounded-none border-b-2 border-transparent bg-transparent px-3 py-2.5 text-xs transition-all duration-200 md:px-3.5 xl:px-4 ${isActive
121
+ ? "border-b-accent text-accent font-semibold"
122
+ : "text-muted hover:text-txt"}`, onClick: () => setTab(primaryTab), title: group.description, style: {
123
123
  clipPath: "none",
124
124
  WebkitClipPath: "none",
125
125
  touchAction: "manipulation",
@@ -136,9 +136,9 @@ export function Header({ mobileLeft, pageRightExtras, transparent: _transparent
136
136
  }, children: _jsx(X, { className: "pointer-events-none h-4 w-4" }) })] }) }), _jsxs("div", { className: "flex flex-1 flex-col px-3 py-3", children: [_jsx("div", { className: "flex-1 overflow-y-auto pr-1", children: _jsx("div", { className: "flex flex-col gap-1", children: tabGroups.map((group, index) => {
137
137
  const primaryTab = group.tabs[0];
138
138
  const isActive = group.tabs.includes(tab);
139
- return (_jsxs(Button, { variant: isActive ? "default" : "ghost", className: `flex min-h-[48px] w-full rounded-xl border px-3 py-3 text-sm font-medium transition-all duration-200 ${isActive
140
- ? "border-accent/30 bg-accent/12 text-txt shadow-[0_2px_10px_rgba(3,5,10,0.08)] ring-1 ring-inset ring-accent/18 dark:shadow-[0_0_0_1px_rgba(var(--accent-rgb),0.14),0_0_14px_rgba(var(--accent-rgb),0.14)]"
141
- : "border-transparent bg-transparent text-txt hover:border-border/45 hover:bg-bg-hover/70"}`, style: {
139
+ return (_jsxs(Button, { variant: "ghost", className: `flex min-h-[48px] w-full rounded-none border-b-2 border-transparent bg-transparent px-3 py-3 text-sm font-medium transition-all duration-200 ${isActive
140
+ ? "border-b-accent text-accent font-semibold"
141
+ : "text-txt hover:text-accent/70"}`, style: {
142
142
  clipPath: "none",
143
143
  WebkitClipPath: "none",
144
144
  touchAction: "manipulation",
@@ -1 +1 @@
1
- {"version":3,"file":"eliza.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/eliza.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAiBxC,cAAc,8BAA8B,CAAC;AAK7C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,qBAAqB,IAAI,6BAA6B,EACtD,gBAAgB,IAAI,wBAAwB,EAE5C,kBAAkB,IAAI,0BAA0B,EAGhD,UAAU,IAAI,kBAAkB,EACjC,MAAM,8BAA8B,CAAC;AAQtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAiDhF,eAAO,MAAM,kBAAkB;;;;CAG9B,CAAC;AAkEF,wBAAgB,kBAAkB,CAChC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,GACrD,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAa/C;AAED,wBAAgB,qBAAqB,CACnC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,GACxD,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAKlD;AA0bD,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;CACjD;AAED,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,0BAA+B,GACpC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAqB/D;AAED,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;CACjD;AAuOD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED,wBAAgB,iCAAiC,IAAI,MAAM,EAAE,CAE5D;AAED,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CA0HzD"}
1
+ {"version":3,"file":"eliza.d.ts","sourceRoot":"","sources":["../../../../../src/runtime/eliza.ts"],"names":[],"mappings":"AAAA,OAAO,gCAAgC,CAAC;AAiBxC,cAAc,8BAA8B,CAAC;AAK7C,OAAO,EACL,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,qBAAqB,IAAI,6BAA6B,EACtD,gBAAgB,IAAI,wBAAwB,EAE5C,kBAAkB,IAAI,0BAA0B,EAGhD,UAAU,IAAI,kBAAkB,EACjC,MAAM,8BAA8B,CAAC;AAQtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAiDhF,eAAO,MAAM,kBAAkB;;;;CAG9B,CAAC;AAkEF,wBAAgB,kBAAkB,CAChC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC,GACrD,UAAU,CAAC,OAAO,0BAA0B,CAAC,CAa/C;AAED,wBAAgB,qBAAqB,CACnC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,GACxD,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAKlD;AAmcD,MAAM,WAAW,0BAA2B,SAAQ,uBAAuB;IACzE,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;CACjD;AAED,wBAAsB,gBAAgB,CACpC,IAAI,GAAE,0BAA+B,GACpC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CAqB/D;AAED,MAAM,WAAW,oBAAqB,SAAQ,iBAAiB;IAC7D,oEAAoE;IACpE,mBAAmB,CAAC,EAAE,yBAAyB,CAAC;CACjD;AAuOD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,OAAO,GACX,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwBxB;AAED,wBAAgB,iCAAiC,IAAI,MAAM,EAAE,CAE5D;AAED,wBAAsB,UAAU,CAC9B,OAAO,CAAC,EAAE,oBAAoB,GAC7B,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC,CA0HzD"}
@@ -149,8 +149,17 @@ async function registerAppRoutePlugins(runtime) {
149
149
  const { lifeopsPlugin } = await import("@elizaos/app-lifeops/routes/plugin");
150
150
  for (const plugin of [vincentPlugin, shopifyPlugin, stewardPlugin, lifeopsPlugin]) {
151
151
  try {
152
- await runtime.registerPlugin(plugin);
153
- logger.info(`[eliza] Registered app route plugin: ${plugin.name}`);
152
+ // Push rawPath routes directly onto runtime.routes to avoid the core's
153
+ // registerPlugin() path mangling (which prepends /<pluginName>/ to every
154
+ // route path). The rawPath flag means these routes already have their
155
+ // final absolute paths (e.g. /api/lifeops/app-state).
156
+ if (plugin.routes?.length) {
157
+ for (const route of plugin.routes) {
158
+ const routePath = route.path.startsWith("/") ? route.path : `/${route.path}`;
159
+ runtime.routes.push({ ...route, path: routePath });
160
+ }
161
+ }
162
+ logger.info(`[eliza] Registered app route plugin: ${plugin.name} (${plugin.routes?.length ?? 0} routes)`);
154
163
  }
155
164
  catch (err) {
156
165
  logger.warn(`[eliza] Failed to register app route plugin ${plugin.name}: ${err instanceof Error ? err.message : String(err)}`);
@@ -1668,11 +1668,6 @@ export declare const allActionsSpec: {
1668
1668
  readonly description: "Check ElizaCloud credit balance, container costs, and estimated remaining runtime.";
1669
1669
  readonly parameters: readonly [];
1670
1670
  readonly similes: readonly ["check credits", "check balance", "how much credit", "cloud billing"];
1671
- }, {
1672
- readonly name: "CLEAR_SHELL_HISTORY";
1673
- readonly description: "Clears the recorded history of shell commands for the current conversation";
1674
- readonly parameters: readonly [];
1675
- readonly similes: readonly ["RESET_SHELL", "CLEAR_TERMINAL", "CLEAR_HISTORY", "RESET_HISTORY"];
1676
1671
  }, {
1677
1672
  readonly name: "COMMANDS_LIST";
1678
1673
  readonly description: "List all available commands with their aliases. Only activates for /commands or /cmds slash commands.";
@@ -1715,16 +1710,6 @@ export declare const allActionsSpec: {
1715
1710
  readonly description: "Edit an existing message in a Discord channel";
1716
1711
  readonly parameters: readonly [];
1717
1712
  readonly similes: readonly ["UPDATE_MESSAGE", "MODIFY_MESSAGE", "CHANGE_MESSAGE", "EDIT_DISCORD_MESSAGE"];
1718
- }, {
1719
- readonly name: "EVM_TRANSFER_TOKENS";
1720
- readonly description: "Transfer tokens between addresses on the same chain";
1721
- readonly parameters: readonly [];
1722
- readonly similes: readonly ["EVM_TRANSFER", "EVM_SEND_TOKENS", "EVM_TOKEN_TRANSFER", "EVM_MOVE_TOKENS"];
1723
- }, {
1724
- readonly name: "EXECUTE_COMMAND";
1725
- readonly description: "Execute ANY shell command in the terminal. Use this to run ANY command including: brew install, npm install, apt-get, system commands, file operations (create, write, delete), navigate directories, execute scripts, or perform any other shell operation. I CAN and SHOULD execute commands when asked. This includes brew, npm, git, ls, cd, echo, touch, cat, mkdir, system_profiler, and literally ANY other terminal command.";
1726
- readonly parameters: readonly [];
1727
- readonly similes: readonly ["RUN_COMMAND", "SHELL_COMMAND", "TERMINAL_COMMAND", "EXEC", "RUN", "EXECUTE", "CREATE_FILE", "WRITE_FILE", "MAKE_FILE", "INSTALL", "BREW_INSTALL", "NPM_INSTALL", "APT_INSTALL"];
1728
1713
  }, {
1729
1714
  readonly name: "FINALIZE_WORKSPACE";
1730
1715
  readonly description: "Finalize workspace changes by committing, pushing, and optionally creating a pull request. ";
@@ -1 +1 @@
1
- {"version":3,"file":"action-docs.d.ts","sourceRoot":"","sources":["../../../../../../typescript/src/generated/action-docs.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgrC2C,CAAC;AACxE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwlE4C,CAAC;AACxE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ6C,CAAC;AAC5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ8C,CAAC;AAC5E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoK9B,CAAC;AACF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoK7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,SAAS,EAA4B,CAAC;AAC5E,eAAO,MAAM,aAAa,EAAE,SAAS,SAAS,EAA2B,CAAC;AAC1E,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EACvB,CAAC;AAC7B,eAAO,MAAM,eAAe,EAAE,SAAS,WAAW,EACvB,CAAC;AAC5B,eAAO,MAAM,iBAAiB,EAAE,SAAS,YAAY,EACvB,CAAC;AAC/B,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EACvB,CAAC"}
1
+ {"version":3,"file":"action-docs.d.ts","sourceRoot":"","sources":["../../../../../../typescript/src/generated/action-docs.ts"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgrC2C,CAAC;AACxE,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4iE4C,CAAC;AACxE,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ6C,CAAC;AAC5E,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoJ8C,CAAC;AAC5E,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoK9B,CAAC;AACF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoK7B,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,SAAS,SAAS,EAA4B,CAAC;AAC5E,eAAO,MAAM,aAAa,EAAE,SAAS,SAAS,EAA2B,CAAC;AAC1E,eAAO,MAAM,gBAAgB,EAAE,SAAS,WAAW,EACvB,CAAC;AAC7B,eAAO,MAAM,eAAe,EAAE,SAAS,WAAW,EACvB,CAAC;AAC5B,eAAO,MAAM,iBAAiB,EAAE,SAAS,YAAY,EACvB,CAAC;AAC/B,eAAO,MAAM,gBAAgB,EAAE,SAAS,YAAY,EACvB,CAAC"}
@@ -2392,17 +2392,6 @@ export const allActionsSpec = {
2392
2392
  "cloud billing",
2393
2393
  ],
2394
2394
  },
2395
- {
2396
- name: "CLEAR_SHELL_HISTORY",
2397
- description: "Clears the recorded history of shell commands for the current conversation",
2398
- parameters: [],
2399
- similes: [
2400
- "RESET_SHELL",
2401
- "CLEAR_TERMINAL",
2402
- "CLEAR_HISTORY",
2403
- "RESET_HISTORY",
2404
- ],
2405
- },
2406
2395
  {
2407
2396
  name: "COMMANDS_LIST",
2408
2397
  description: "List all available commands with their aliases. Only activates for /commands or /cmds slash commands.",
@@ -2469,37 +2458,6 @@ export const allActionsSpec = {
2469
2458
  "EDIT_DISCORD_MESSAGE",
2470
2459
  ],
2471
2460
  },
2472
- {
2473
- name: "EVM_TRANSFER_TOKENS",
2474
- description: "Transfer tokens between addresses on the same chain",
2475
- parameters: [],
2476
- similes: [
2477
- "EVM_TRANSFER",
2478
- "EVM_SEND_TOKENS",
2479
- "EVM_TOKEN_TRANSFER",
2480
- "EVM_MOVE_TOKENS",
2481
- ],
2482
- },
2483
- {
2484
- name: "EXECUTE_COMMAND",
2485
- description: "Execute ANY shell command in the terminal. Use this to run ANY command including: brew install, npm install, apt-get, system commands, file operations (create, write, delete), navigate directories, execute scripts, or perform any other shell operation. I CAN and SHOULD execute commands when asked. This includes brew, npm, git, ls, cd, echo, touch, cat, mkdir, system_profiler, and literally ANY other terminal command.",
2486
- parameters: [],
2487
- similes: [
2488
- "RUN_COMMAND",
2489
- "SHELL_COMMAND",
2490
- "TERMINAL_COMMAND",
2491
- "EXEC",
2492
- "RUN",
2493
- "EXECUTE",
2494
- "CREATE_FILE",
2495
- "WRITE_FILE",
2496
- "MAKE_FILE",
2497
- "INSTALL",
2498
- "BREW_INSTALL",
2499
- "NPM_INSTALL",
2500
- "APT_INSTALL",
2501
- ],
2502
- },
2503
2461
  {
2504
2462
  name: "FINALIZE_WORKSPACE",
2505
2463
  description: "Finalize workspace changes by committing, pushing, and optionally creating a pull request. ",