Files
AgentCompany/src/preload/index.ts
T
ZacharyZhang-NY 86aa6fdb29 Ship skills built-in: bundle the catalogue, assign per hire, force humanizer
Skills no longer come from the user's ~/.agents library - most users have
none, and the CEO branch that compiled the entire catalogue into its
prompt overflowed the model context (1.1MB) and failed every CEO run.

- Bundle "built-in skills/" with the app (extraResources) and stage it
  at startup into <profile>/builtin-skills as one dir-per-skill copy -
  both bundle shapes (SKILL.md dirs and flat category .md files)
  normalize into the same importable layout
- Import the staged catalogue per org at startup and inside onboarding,
  so the CEO's first run already carries it
- Forced house style: resolveRuntimeSnapshot unions the humanizer skill
  into every agent's runtime (CEO included) as a resolution rule - no
  binding row to forget, delete, or bypass; revoke_skill refuses it
- CEO staffs hires with skills: hire_agent accepts a skills array,
  grant_skill/revoke_skill adjust later, list_skills now shows
  descriptions from skill frontmatter
- Kill the c_suite compile-all branch; everyone resolves bindings-only,
  capped at 200k chars with omissions named in the prompt
- Remove the Skills settings page and its import/sync/test IPC surface;
  drop ~/.agents discovery and the AGENTCOMPANY_NEW_SKILLS_ROOT seam in
  favor of AGENTCOMPANY_NEW_BUILTIN_SKILLS_DIR
- Tests: staging/import/forced-resolution/cap units, real-bundle CI
  check, e2e asserts the tab is gone and the catalogue self-imports
2026-07-08 21:18:50 -04:00

100 lines
6.9 KiB
TypeScript

import { contextBridge, ipcRenderer } from "electron";
import { IPC_CHANNELS } from "../shared/ipc";
import type { DesktopApi, RendererEvent } from "../shared/desktop-api";
function invoke<T>(channel: string, payload?: unknown): Promise<T> {
return ipcRenderer.invoke(channel, payload) as Promise<T>;
}
const api: DesktopApi = {
loadSnapshot: () => invoke(IPC_CHANNELS.loadSnapshot),
bootstrapOnboarding: (input) => invoke(IPC_CHANNELS.bootstrapOnboarding, input),
createOrganization: (input) => invoke(IPC_CHANNELS.createOrganization, input),
setActiveOrganization: (input) => invoke(IPC_CHANNELS.setActiveOrganization, input),
setUiPreferences: (input) => invoke(IPC_CHANNELS.setUiPreferences, input),
deleteOrganization: (input) => invoke(IPC_CHANNELS.deleteOrganization, input),
createAgent: (input) => invoke(IPC_CHANNELS.createAgent, input),
updateAgent: (input) => invoke(IPC_CHANNELS.updateAgent, input),
createTask: (input) => invoke(IPC_CHANNELS.createTask, input),
updateTask: (input) => invoke(IPC_CHANNELS.updateTask, input),
deleteTask: (input) => invoke(IPC_CHANNELS.deleteTask, input),
updateTaskStatus: (input) => invoke(IPC_CHANNELS.updateTaskStatus, input),
runTask: (input) => invoke(IPC_CHANNELS.runTask, input),
createGoal: (input) => invoke(IPC_CHANNELS.createGoal, input),
createProject: (input) => invoke(IPC_CHANNELS.createProject, input),
createWorkspace: (input) => invoke(IPC_CHANNELS.createWorkspace, input),
createDocument: (input) => invoke(IPC_CHANNELS.createDocument, input),
updateDocument: (input) => invoke(IPC_CHANNELS.updateDocument, input),
deleteDocument: (input) => invoke(IPC_CHANNELS.deleteDocument, input),
createKnowledgeEntry: (input) => invoke(IPC_CHANNELS.createKnowledgeEntry, input),
deleteKnowledgeEntry: (input) => invoke(IPC_CHANNELS.deleteKnowledgeEntry, input),
createAutomationRule: (input) => invoke(IPC_CHANNELS.createAutomationRule, input),
updateAutomationRule: (input) => invoke(IPC_CHANNELS.updateAutomationRule, input),
deleteAutomationRule: (input) => invoke(IPC_CHANNELS.deleteAutomationRule, input),
createMeeting: (input) => invoke(IPC_CHANNELS.createMeeting, input),
deleteMeeting: (input) => invoke(IPC_CHANNELS.deleteMeeting, input),
createSprint: (input) => invoke(IPC_CHANNELS.createSprint, input),
deleteSprint: (input) => invoke(IPC_CHANNELS.deleteSprint, input),
createApproval: (input) => invoke(IPC_CHANNELS.createApproval, input),
decideApproval: (input) => invoke(IPC_CHANNELS.decideApproval, input),
syncEmployeeIdentity: (input) => invoke(IPC_CHANNELS.syncEmployeeIdentity, input),
grantRole: (input) => invoke(IPC_CHANNELS.grantRole, input),
createChatSpace: (input) => invoke(IPC_CHANNELS.createChatSpace, input),
sendMessage: (input) => invoke(IPC_CHANNELS.sendMessage, input),
editMessage: (input) => invoke(IPC_CHANNELS.editMessage, input),
deleteMessage: (input) => invoke(IPC_CHANNELS.deleteMessage, input),
markChatSpaceRead: (input) => invoke(IPC_CHANNELS.markChatSpaceRead, input),
saveProviderCredential: (input) => invoke(IPC_CHANNELS.saveProviderCredential, input),
revokeProviderCredential: (input) => invoke(IPC_CHANNELS.revokeProviderCredential, input),
launchProviderSignIn: (input) => invoke(IPC_CHANNELS.launchProviderSignIn, input),
startProviderOAuth: (input) => invoke(IPC_CHANNELS.startProviderOAuth, input),
cancelProviderOAuth: (input) => invoke(IPC_CHANNELS.cancelProviderOAuth, input),
checkProviderHealth: (input) => invoke(IPC_CHANNELS.checkProviderHealth, input),
listProviderModels: (input) => invoke(IPC_CHANNELS.listProviderModels, input),
updateProviderPolicy: (input) => invoke(IPC_CHANNELS.updateProviderPolicy, input),
openExternalUrl: (url) => invoke(IPC_CHANNELS.openExternalUrl, url),
createProviderResponse: (input) => invoke(IPC_CHANNELS.createProviderResponse, input),
streamProviderResponse: (input) => invoke(IPC_CHANNELS.streamProviderResponse, input),
cancelProviderResponse: (input) => invoke(IPC_CHANNELS.cancelProviderResponse, input),
createSocialAccount: (input) => invoke(IPC_CHANNELS.createSocialAccount, input),
launchSocialLogin: (input) => invoke(IPC_CHANNELS.launchSocialLogin, input),
createScheduledPost: (input) => invoke(IPC_CHANNELS.createScheduledPost, input),
setScheduledPostState: (input) => invoke(IPC_CHANNELS.setScheduledPostState, input),
importFile: (input) => invoke(IPC_CHANNELS.importFile, input),
openFile: (input) => invoke(IPC_CHANNELS.openFile, input),
pickDirectory: () => invoke(IPC_CHANNELS.pickDirectory),
setFilePinned: (input) => invoke(IPC_CHANNELS.setFilePinned, input),
createMigrationReport: (input) => invoke(IPC_CHANNELS.createMigrationReport, input),
createRollbackSnapshot: (input) => invoke(IPC_CHANNELS.createRollbackSnapshot, input),
setRollbackSnapshotActive: (input) => invoke(IPC_CHANNELS.setRollbackSnapshotActive, input),
resolveMigrationReconciliation: (input) => invoke(IPC_CHANNELS.resolveMigrationReconciliation, input),
setFeatureFlag: (input) => invoke(IPC_CHANNELS.setFeatureFlag, input),
runChaosDrill: (input) => invoke(IPC_CHANNELS.runChaosDrill, input),
runSdlcReview: (input) => invoke(IPC_CHANNELS.runSdlcReview, input),
runEvalSuite: (input) => invoke(IPC_CHANNELS.runEvalSuite, input),
setPrBotGate: (input) => invoke(IPC_CHANNELS.setPrBotGate, input),
createComplianceExport: (input) => invoke(IPC_CHANNELS.createComplianceExport, input),
createAuditReplay: (input) => invoke(IPC_CHANNELS.createAuditReplay, input),
createLegalHold: (input) => invoke(IPC_CHANNELS.createLegalHold, input),
setLegalHoldState: (input) => invoke(IPC_CHANNELS.setLegalHoldState, input),
createRetentionFreeze: (input) => invoke(IPC_CHANNELS.createRetentionFreeze, input),
setRetentionFreezeState: (input) => invoke(IPC_CHANNELS.setRetentionFreezeState, input),
listConnectorCatalog: () => invoke(IPC_CHANNELS.listConnectorCatalog),
connectComposioToolkit: (input) => invoke(IPC_CHANNELS.connectComposioToolkit, input),
disconnectComposioToolkit: (input) => invoke(IPC_CHANNELS.disconnectComposioToolkit, input),
refreshComposioAccounts: (input) => invoke(IPC_CHANNELS.refreshComposioAccounts, input),
search: (input) => invoke(IPC_CHANNELS.search, input),
subscribe: (callback) => {
const listener = (_event: Electron.IpcRendererEvent, payload: RendererEvent) => callback(payload);
ipcRenderer.on(IPC_CHANNELS.rendererEvent, listener);
return () => ipcRenderer.removeListener(IPC_CHANNELS.rendererEvent, listener);
},
platform: process.platform as DesktopApi["platform"],
language: (process.argv.find((arg) => arg.startsWith("--app-language="))?.slice("--app-language=".length) === "zh" ? "zh" : "en") as DesktopApi["language"],
windowMinimize: () => invoke<void>(IPC_CHANNELS.windowMinimize),
windowMaximize: () => invoke<void>(IPC_CHANNELS.windowMaximize),
windowClose: () => invoke<void>(IPC_CHANNELS.windowClose),
};
contextBridge.exposeInMainWorld("agentCompany", api);