mirror of
https://github.com/stablyai/orca.git
synced 2026-10-03 00:02:19 +00:00
The split silently dropped jira.searchUsers and runtimeEnvironments.retryControlConnection. Neither failed typecheck: the bridge modules carried no satisfies annotation and the composed api object was unannotated, so a missing key was only a runtime TypeError in the renderer. Annotates each module against PreloadApi, the type window.api is already declared as, so the contract supplies the shape rather than a parallel copy. Deleting jira.searchUsers now fails with TS2741 naming the key. Turning this on surfaced 106 places where a bridge locally annotated Promise<unknown> or unknown[] over a contract that declares concrete types -- the bridge was erasing types the renderer relied on. Those annotations are gone. Also exposes app.awaitBeforeUnloadCheckpoint, which was declared and called but never actually on the bridge, so the lazy-chunk recovery reload optional-chained to a no-op and navigated without joining the checkpoint. The missing key was caught by the new annotation rather than by hand.
132 lines
4.1 KiB
TypeScript
132 lines
4.1 KiB
TypeScript
import { ipcRenderer } from 'electron'
|
|
import type { LinearProjectDetail } from '../../shared/linear/project-types'
|
|
import type { PreloadApi } from '../api-types'
|
|
|
|
export const linearApi = {
|
|
connect: (args: { apiKey: string }) => ipcRenderer.invoke('linear:connect', args),
|
|
|
|
disconnect: (args?: { workspaceId?: string }): Promise<void> =>
|
|
ipcRenderer.invoke('linear:disconnect', args),
|
|
|
|
selectWorkspace: (args: { workspaceId: string }) =>
|
|
ipcRenderer.invoke('linear:selectWorkspace', args),
|
|
|
|
status: () => ipcRenderer.invoke('linear:status'),
|
|
|
|
testConnection: (args?: { workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:testConnection', args),
|
|
|
|
searchIssues: (args: { query: string; limit?: number; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:searchIssues', args),
|
|
|
|
listIssues: (args?: {
|
|
filter?: 'assigned' | 'created' | 'all' | 'completed'
|
|
limit?: number
|
|
workspaceId?: string
|
|
attributeFilter?: unknown
|
|
}) => ipcRenderer.invoke('linear:listIssues', args),
|
|
|
|
createIssue: (args: {
|
|
teamId: string
|
|
title: string
|
|
description?: string
|
|
workspaceId?: string
|
|
parentIssueId?: string
|
|
projectId?: string | null
|
|
stateId?: string
|
|
priority?: number
|
|
assigneeId?: string | null
|
|
labelIds?: string[]
|
|
}): Promise<
|
|
| { ok: true; id: string; identifier: string; title: string; url: string }
|
|
| { ok: false; error: string }
|
|
> => ipcRenderer.invoke('linear:createIssue', args),
|
|
|
|
getIssue: (args: { id: string; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:getIssue', args),
|
|
|
|
updateIssue: (args: {
|
|
id: string
|
|
updates: unknown
|
|
workspaceId?: string
|
|
}): Promise<{ ok: true } | { ok: false; error: string }> =>
|
|
ipcRenderer.invoke('linear:updateIssue', args),
|
|
|
|
addIssueComment: (args: {
|
|
issueId: string
|
|
body: string
|
|
workspaceId?: string
|
|
}): Promise<{ ok: true; id: string } | { ok: false; error: string }> =>
|
|
ipcRenderer.invoke('linear:addIssueComment', args),
|
|
|
|
issueComments: (args: { issueId: string; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:issueComments', args),
|
|
|
|
listTeams: (args?: { workspaceId?: string }) => ipcRenderer.invoke('linear:listTeams', args),
|
|
|
|
listProjects: (args?: {
|
|
query?: string
|
|
limit?: number
|
|
workspaceId?: string
|
|
force?: boolean
|
|
}) => ipcRenderer.invoke('linear:listProjects', args),
|
|
|
|
createProject: (args: {
|
|
name: string
|
|
description?: string
|
|
content?: string
|
|
teamIds: string[]
|
|
workspaceId?: string
|
|
leadId?: string | null
|
|
memberIds?: string[]
|
|
labelIds?: string[]
|
|
priority?: number
|
|
startDate?: string
|
|
targetDate?: string
|
|
}): Promise<{ ok: true; project: LinearProjectDetail } | { ok: false; error: string }> =>
|
|
ipcRenderer.invoke('linear:createProject', args),
|
|
|
|
getProject: (args: { id: string; workspaceId: string; force?: boolean }) =>
|
|
ipcRenderer.invoke('linear:getProject', args),
|
|
|
|
listProjectIssues: (args: {
|
|
projectId: string
|
|
limit?: number
|
|
workspaceId: string
|
|
force?: boolean
|
|
}) => ipcRenderer.invoke('linear:listProjectIssues', args),
|
|
|
|
listCustomViews: (args: {
|
|
model: string
|
|
limit?: number
|
|
workspaceId?: string
|
|
force?: boolean
|
|
}) => ipcRenderer.invoke('linear:listCustomViews', args),
|
|
|
|
getCustomView: (args: { viewId: string; model: string; workspaceId: string; force?: boolean }) =>
|
|
ipcRenderer.invoke('linear:getCustomView', args),
|
|
|
|
listCustomViewIssues: (args: {
|
|
viewId: string
|
|
limit?: number
|
|
workspaceId: string
|
|
force?: boolean
|
|
}) => ipcRenderer.invoke('linear:listCustomViewIssues', args),
|
|
|
|
listCustomViewProjects: (args: {
|
|
viewId: string
|
|
limit?: number
|
|
workspaceId: string
|
|
force?: boolean
|
|
}) => ipcRenderer.invoke('linear:listCustomViewProjects', args),
|
|
|
|
teamStates: (args: { teamId: string; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:teamStates', args),
|
|
|
|
teamLabels: (args: { teamId: string; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:teamLabels', args),
|
|
|
|
teamMembers: (args: { teamId: string; workspaceId?: string }) =>
|
|
ipcRenderer.invoke('linear:teamMembers', args)
|
|
} satisfies PreloadApi['linear']
|