Files
fusion/plugins/fusion-plugin-even-realities-glasses/src/settings.ts
Fusion 858bab241b feat(FN-3970): consolidate Even plugin APIs into unified package with webho
Collapsed the Even plugin architecture into a single unified plugin by merging board card routes and replacing the transport stub with a real webhook implementation, removing the separate cards plugin from the workspace. The new unified plugin (`fusion-plugin-even-realities-glasses`) now exports con

Fusion-Task-Id: FN-3970
2026-05-11 06:47:42 -07:00

108 lines
3.5 KiB
TypeScript

import type { PluginSettingSchema } from "@fusion/plugin-sdk";
const DEFAULT_BASE_URL = "http://localhost:4040";
const DEFAULT_POLLING_INTERVAL_SECONDS = 30;
const MIN_POLLING_INTERVAL_SECONDS = 5;
const DEFAULT_NOTIFY_COLUMNS = ["in-review"];
const DEFAULT_QUICK_CAPTURE_COLUMN = "triage";
type TaskColumn = "triage" | "todo" | "in-progress" | "in-review" | "done";
const COLUMN_SET = new Set<TaskColumn>(["triage", "todo", "in-progress", "in-review", "done"]);
export const settingsSchema: Record<string, PluginSettingSchema> = {
fusionApiBaseUrl: {
type: "string",
label: "Fusion API Base URL",
defaultValue: DEFAULT_BASE_URL,
},
fusionApiToken: {
type: "password",
label: "Fusion API Token",
},
apiKey: {
type: "password",
label: "Glasses Route API Key",
},
glassesDeviceId: {
type: "string",
label: "Glasses Device ID",
},
companionWebhookUrl: {
type: "string",
label: "Companion Webhook URL",
},
pollingIntervalSeconds: {
type: "number",
label: "Polling Interval (seconds)",
defaultValue: DEFAULT_POLLING_INTERVAL_SECONDS,
},
notifyOnColumns: {
type: "array",
label: "Notify on Columns",
itemType: "string",
defaultValue: DEFAULT_NOTIFY_COLUMNS,
},
quickCaptureDefaultColumn: {
type: "enum",
label: "Quick Capture Default Column",
enumValues: [...COLUMN_SET],
defaultValue: DEFAULT_QUICK_CAPTURE_COLUMN,
},
enableAgentActions: {
type: "boolean",
label: "Enable Agent Actions",
defaultValue: true,
},
};
function getSettingString(settings: Record<string, unknown>, key: string): string | undefined {
const value = settings[key];
return typeof value === "string" && value.trim().length > 0 ? value.trim() : undefined;
}
export function getFusionBaseUrl(settings: Record<string, unknown>): string {
return getSettingString(settings, "fusionApiBaseUrl") ?? DEFAULT_BASE_URL;
}
export function getFusionToken(settings: Record<string, unknown>): string | undefined {
return getSettingString(settings, "fusionApiToken");
}
export function getCompanionWebhookUrl(settings: Record<string, unknown>): string | undefined {
return getSettingString(settings, "companionWebhookUrl");
}
export function getPollingIntervalMs(settings: Record<string, unknown>): number {
const raw = settings.pollingIntervalSeconds;
if (typeof raw !== "number" || !Number.isFinite(raw)) {
return DEFAULT_POLLING_INTERVAL_SECONDS * 1000;
}
const seconds = Math.max(MIN_POLLING_INTERVAL_SECONDS, Math.floor(raw));
return seconds * 1000;
}
export function getNotifyColumns(settings: Record<string, unknown>): TaskColumn[] {
const raw = settings.notifyOnColumns;
if (!Array.isArray(raw)) {
return [...DEFAULT_NOTIFY_COLUMNS] as TaskColumn[];
}
const columns = raw
.filter((value): value is string => typeof value === "string")
.map((value) => value.trim())
.filter((value): value is TaskColumn => COLUMN_SET.has(value as TaskColumn));
return columns.length > 0 ? columns : ([...DEFAULT_NOTIFY_COLUMNS] as TaskColumn[]);
}
export function getQuickCaptureColumn(settings: Record<string, unknown>): TaskColumn {
const raw = getSettingString(settings, "quickCaptureDefaultColumn");
return raw && COLUMN_SET.has(raw as TaskColumn) ? (raw as TaskColumn) : DEFAULT_QUICK_CAPTURE_COLUMN;
}
export function agentActionsEnabled(settings: Record<string, unknown>): boolean {
const raw = settings.enableAgentActions;
return typeof raw === "boolean" ? raw : true;
}
export type { TaskColumn };