Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ CUED_IMESSAGE_NATIVE_BINARY=
CUED_CALL_HISTORY_DB_PATH=
CUED_CONTACTS_NATIVE_BINARY=
CUED_CONTACTS_JSON_PATH=
CUED_SIGNAL_CLI_PATH=
CUED_SIGNAL_ACCOUNT=
CUED_WHATSAPP_HELPER_BINARY=
CUED_WHATSAPP_DESKTOP_SOURCE_PATH=
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,12 +159,13 @@ final class RootWindowController: NSWindowController {
let daemonSupervisor = self.daemonSupervisor
let statusStore = self.statusStore
let shouldEnsurePrerequisites = consumePrerequisiteSetupIntent()
let shouldRefreshPermissions = forceActivePermissionRefresh || shouldRefreshLivePermissions()
let fastPermissionKeys = shouldRefreshPermissions
let shouldRefreshFastPermissions = forceActivePermissionRefresh || shouldRefreshLivePermissions()
let shouldRefreshManagedIntegrations = shouldRefreshFastPermissions
let fastPermissionKeys = shouldRefreshFastPermissions
? (pendingLivePermissionKeys.isEmpty ? liveRefreshPermissionKeys : pendingLivePermissionKeys)
: []

if shouldRefreshPermissions {
if shouldRefreshFastPermissions {
applyFastPermissionStatuses(for: fastPermissionKeys)
}

Expand All @@ -190,7 +191,7 @@ final class RootWindowController: NSWindowController {
let snapshot = Self.decodeJSON(
daemonSupervisor: daemonSupervisor,
RootSnapshotResponse.self,
arguments: onboardingSnapshotArguments(refreshPermissions: shouldRefreshPermissions)
arguments: onboardingSnapshotArguments(refreshManagedIntegrations: shouldRefreshManagedIntegrations)
)

guard let snapshot else {
Expand Down Expand Up @@ -952,7 +953,7 @@ func shouldActivelyRefreshPermissions(for flags: [String]) -> Bool {
return !keys.isDisjoint(with: liveRefreshPermissionKeys)
}

func onboardingSnapshotArguments(refreshPermissions: Bool) -> [String] {
func onboardingSnapshotArguments(refreshManagedIntegrations: Bool) -> [String] {
["onboarding", "snapshot"] +
(refreshPermissions ? ["--refresh-managed", "--refresh-permissions"] : [])
(refreshManagedIntegrations ? ["--refresh-managed"] : [])
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ final class RootViewTests: XCTestCase {

func testActivePermissionSnapshotRefreshAlsoRefreshesManagedIntegrations() {
XCTAssertEqual(
onboardingSnapshotArguments(refreshPermissions: true),
["onboarding", "snapshot", "--refresh-managed", "--refresh-permissions"]
onboardingSnapshotArguments(refreshManagedIntegrations: true),
["onboarding", "snapshot", "--refresh-managed"]
)
XCTAssertEqual(
onboardingSnapshotArguments(refreshPermissions: false),
onboardingSnapshotArguments(refreshManagedIntegrations: false),
["onboarding", "snapshot"]
)
}
Expand Down
25 changes: 5 additions & 20 deletions src/cli.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@ import {
} from "./platforms/core/state/status.js";
import {
getPlatformFeatureMatrixRow,
getPlatformFutureFeatureNotes,
getPlatformHelperRequirements,
getPlatformPermissionRequirements,
getSupportedHostOsForPlatform,
Expand Down Expand Up @@ -136,7 +135,7 @@ Usage:
cued update install
cued cli install|status
cued login-item enable|disable|status
cued onboarding complete|snapshot|status [--refresh-managed] [--refresh-permissions]
cued onboarding complete|snapshot|status [--refresh-managed]
cued telemetry status|enable|disable|smoke
cued skill install-global|status
cued permissions doctor|status|request [--all|--contacts|--full-disk-access]
Expand Down Expand Up @@ -368,7 +367,6 @@ async function handleLocalIntegrationCommand(
permissionRequirements: getPlatformPermissionRequirements(platform),
helperRequirements: getPlatformHelperRequirements(platform),
features: getPlatformFeatureMatrixRow(platform),
futureFeatures: getPlatformFutureFeatureNotes(platform),
}));
}

Expand Down Expand Up @@ -685,7 +683,6 @@ async function main(): Promise<void> {
}
case "onboarding": {
const refreshManaged = rest.includes("--refresh-managed");
const refreshPermissions = rest.includes("--refresh-permissions");
let daemonResponse: Awaited<ReturnType<typeof sendDaemonRequest>> | null = null;
try {
switch (subcommand) {
Expand All @@ -696,7 +693,6 @@ async function main(): Promise<void> {
daemonResponse = await sendDaemonRequest({
command: "onboarding-snapshot",
refreshManagedIntegrations: refreshManaged,
refreshPermissions,
});
break;
case "status":
Expand All @@ -715,7 +711,7 @@ async function main(): Promise<void> {
}

const db =
subcommand === "snapshot" && !refreshManaged && !refreshPermissions
subcommand === "snapshot" && !refreshManaged
? openCuedDatabaseReadOnly()
: openCuedDatabase();
try {
Expand All @@ -733,12 +729,11 @@ async function main(): Promise<void> {
await sendTelemetryEventSafe(db, "onboarding_started", {
component: "onboarding",
operation: "snapshot",
stage: refreshPermissions ? "permissions" : refreshManaged ? "managed" : "status",
stage: refreshManaged ? "managed" : "status",
});
printJson(
await buildOnboardingSnapshot(db, {
refreshManagedIntegrations: refreshManaged,
refreshPermissions,
}),
);
return;
Expand All @@ -747,7 +742,7 @@ async function main(): Promise<void> {
return;
default:
throw new Error(
"Usage: cued onboarding complete | snapshot [--refresh-managed] [--refresh-permissions] | status",
"Usage: cued onboarding complete | snapshot [--refresh-managed] | status",
);
}
} finally {
Expand Down Expand Up @@ -907,17 +902,7 @@ async function main(): Promise<void> {
printJson(daemonResponse.result ?? null);
return;
}
const db = openCuedDatabaseReadOnly();
try {
printJson(
await buildPermissionStatus({
mode: "passive",
db,
}),
);
} finally {
db.close();
}
printJson(await buildPermissionStatus());
}
return;
case "request": {
Expand Down
12 changes: 1 addition & 11 deletions src/core/platform-capabilities.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
import { beforeEach, describe, expect, it, vi } from "vitest";
import {
getPlatformFeatureSupport,
getPlatformFutureFeatureNotes,
} from "../platforms/core/types.js";
import { getPlatformFeatureSupport } from "../platforms/core/types.js";
import { summarizePlatformCapability } from "./platform-capabilities.js";

const inspectSlackHelperMock = vi.fn();
Expand Down Expand Up @@ -239,11 +236,4 @@ describe("platform capability resolver", () => {
expect(getPlatformFeatureSupport("linkedin", "read_receipts")).toBe("partial");
expect(getPlatformFeatureSupport("imessage", "realtime_ingest")).toBe("yes");
});

it("does not expose outbound send notes in product capabilities", () => {
expect(getPlatformFutureFeatureNotes("contacts")).toEqual({});
expect(getPlatformFutureFeatureNotes("gmail")).toEqual({});
expect(getPlatformFutureFeatureNotes("imessage")).toEqual({});
expect(getPlatformFutureFeatureNotes("signal")).toEqual({});
});
});
15 changes: 0 additions & 15 deletions src/platforms/core/registry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ export { isAdapterPlatform } from "../../core/types/provider.js";
export interface AdapterDefinition {
platform: AdapterPlatform;
workerEntrypoint: string;
autoSync: boolean;
workerTimeoutMs: number;
}

Expand All @@ -21,49 +20,41 @@ const ADAPTER_DEFINITIONS: Record<AdapterPlatform, AdapterDefinition> = {
imessage: {
platform: "imessage",
workerEntrypoint: join(MODULE_DIRNAME, "../imessage/worker.js"),
autoSync: true,
workerTimeoutMs: 120_000,
},
discord: {
platform: "discord",
workerEntrypoint: join(MODULE_DIRNAME, "../discord/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 120_000,
},
contacts: {
platform: "contacts",
workerEntrypoint: join(MODULE_DIRNAME, "../contacts/worker.js"),
autoSync: true,
workerTimeoutMs: 120_000,
},
gmail: {
platform: "gmail",
workerEntrypoint: join(MODULE_DIRNAME, "../gmail/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 600_000,
},
linkedin: {
platform: "linkedin",
workerEntrypoint: join(MODULE_DIRNAME, "../linkedin/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 120_000,
},
slack: {
platform: "slack",
workerEntrypoint: join(MODULE_DIRNAME, "../slack/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 600_000,
},
signal: {
platform: "signal",
workerEntrypoint: join(MODULE_DIRNAME, "../signal/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 60_000,
},
whatsapp: {
platform: "whatsapp",
workerEntrypoint: join(MODULE_DIRNAME, "../whatsapp/sync/worker.js"),
autoSync: true,
workerTimeoutMs: 60_000,
},
};
Expand All @@ -72,12 +63,6 @@ export function listAdapterPlatforms(): AdapterPlatform[] {
return [...ADAPTER_PLATFORM_VALUES];
}

export function listAutoSyncPlatforms(): AdapterPlatform[] {
return Object.values(ADAPTER_DEFINITIONS)
.filter((definition) => definition.autoSync)
.map((definition) => definition.platform);
}

export function getAdapterDefinition(platform: string): AdapterDefinition | null {
return isAdapterPlatform(platform) ? ADAPTER_DEFINITIONS[platform] : null;
}
3 changes: 0 additions & 3 deletions src/platforms/core/runner.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ const { getAdapterDefinitionMock, spawnMock } = vi.hoisted(() => ({
getAdapterDefinitionMock: vi.fn(() => ({
platform: "slack",
workerEntrypoint: "/tmp/fake-worker.js",
autoSync: true,
workerTimeoutMs: 50,
})),
spawnMock: vi.fn(),
Expand Down Expand Up @@ -39,7 +38,6 @@ describe("adapter runner", () => {
getAdapterDefinitionMock.mockReturnValue({
platform: "slack",
workerEntrypoint: "/tmp/fake-worker.js",
autoSync: true,
workerTimeoutMs: 50,
});
while (tempDirs.length > 0) {
Expand Down Expand Up @@ -102,7 +100,6 @@ describe("adapter runner", () => {
getAdapterDefinitionMock.mockReturnValue({
platform: "signal",
workerEntrypoint: join(dir, "signal-worker.js"),
autoSync: true,
workerTimeoutMs: 50,
});

Expand Down
5 changes: 0 additions & 5 deletions src/platforms/core/state/integration-state.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@ describe("integration state management", () => {
delete process.env.CUED_CONTACTS_NATIVE_BINARY;
delete process.env.CUED_IMESSAGE_DB_PATH;
delete process.env.CUED_SIGNAL_DIR;
delete process.env.CUED_SIGNAL_CLI_PATH;
delete process.env.CUED_SLACK_APP_BINARY;
delete process.env.CUED_SLACK_HELPER_BINARY;
delete process.env.CUED_AUTH_NATIVE_BINARY;
Expand Down Expand Up @@ -1535,10 +1534,6 @@ process.exit(44);

it("refreshes signal and whatsapp managed states for every persisted account", async () => {
installSecurityTool({});
process.env.CUED_SIGNAL_CLI_PATH = join(
createTempDir("cued-missing-signal-cli-"),
"signal-cli",
);
process.env.CUED_WHATSAPP_HELPER_BINARY = join(
createTempDir("cued-missing-whatsapp-helper-"),
"cued-whatsapp-helper",
Expand Down
7 changes: 0 additions & 7 deletions src/platforms/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,6 @@ export type PlatformFeature = (typeof PLATFORM_FEATURE_VALUES)[number];
export const PLATFORM_FEATURE_SUPPORT_VALUES = ["yes", "partial", "no"] as const;
export type PlatformFeatureSupport = (typeof PLATFORM_FEATURE_SUPPORT_VALUES)[number];

export type PlatformFutureFeatureNotes = Record<string, never>;

type PlatformDefinition = {
adapter: boolean;
defaultAccountKey: "default" | "local";
Expand Down Expand Up @@ -429,11 +427,6 @@ export function getPlatformFeatureMatrixRow(
return PLATFORM_FEATURE_MATRIX[platform];
}

export function getPlatformFutureFeatureNotes(platform: Platform): PlatformFutureFeatureNotes {
void platform;
return {};
}

export function isIntegrationAuthState(value: string): value is IntegrationAuthState {
return integrationAuthStateSet.has(value);
}
Expand Down
12 changes: 3 additions & 9 deletions src/runtime/daemon/server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import {
buildAdapterInvocationEnv,
selectAdapterInvocationProofs,
} from "../../platforms/core/invocation.js";
import { isAdapterPlatform, listAutoSyncPlatforms } from "../../platforms/core/registry.js";
import { isAdapterPlatform, listAdapterPlatforms } from "../../platforms/core/registry.js";
import { runAdapter } from "../../platforms/core/runner.js";
import { loadIntegrationSecret } from "../../platforms/core/secrets/keychain.js";
import { refreshLocalIntegrationStates } from "../../platforms/core/state/local-refresh.js";
Expand Down Expand Up @@ -419,7 +419,7 @@ export function getAutoSyncTargets(
return [];
}

return listAutoSyncPlatforms().map((platform) => ({
return listAdapterPlatforms().map((platform) => ({
platform,
accountKey: getDefaultAccountKeyForPlatform(platform),
}));
Expand Down Expand Up @@ -5264,12 +5264,7 @@ async function dispatchRequest(
return {
id: request.id,
ok: true,
result: await db.withBusyTimeout(DAEMON_STATUS_BUSY_TIMEOUT_MS, () =>
buildPermissionStatus({
mode: "passive",
db,
}),
),
result: await buildPermissionStatus(),
};
case "onboarding-status":
return {
Expand All @@ -5292,7 +5287,6 @@ async function dispatchRequest(
result: await db.withBusyTimeout(DAEMON_STATUS_BUSY_TIMEOUT_MS, () =>
buildOnboardingSnapshot(db, {
refreshManagedIntegrations: request.refreshManagedIntegrations,
refreshPermissions: request.refreshPermissions,
}),
),
};
Expand Down
9 changes: 3 additions & 6 deletions src/runtime/doctor-status.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import { buildPermissionStatus } from "./doctor.js";

const itDarwin = process.platform === "darwin" ? it : it.skip;

describe("permission status modes", () => {
describe("permission status", () => {
const tempDirs: string[] = [];

afterEach(() => {
Expand All @@ -43,7 +43,7 @@ describe("permission status modes", () => {
return db;
}

itDarwin("omits removed permission checks in passive mode", async () => {
itDarwin("omits removed permission checks", async () => {
const db = createDb();
process.env.CUED_CONTACTS_NATIVE_BINARY = "/tmp/cued-native-helper";
process.env.CUED_IMESSAGE_NATIVE_BINARY = "/tmp/cued-native-helper";
Expand All @@ -58,10 +58,7 @@ describe("permission status modes", () => {
throw new Error(`unexpected command: ${command}`);
});

const status = await buildPermissionStatus({
mode: "passive",
db,
});
const status = await buildPermissionStatus();

expect(status.permissions.map((permission) => permission.key)).toEqual([
"contacts",
Expand Down
Loading