feat(desktop): persist desktop bootstrap and org restrictions (#1479)

* feat(den-api): expose desktop config from env

* feat(desktop): persist den bootstrap config across updates

* feat(den): manage desktop restrictions per organization

* fix(app): stabilize cloud org selection

* docs(desktop): add bootstrap config PRD

---------

Co-authored-by: src-opn <src-opn@users.noreply.github.com>
This commit is contained in:
Source Open
2026-04-19 15:59:03 -07:00
committed by GitHub
parent 3baaac6488
commit da9a4f24e9
47 changed files with 2045 additions and 181 deletions

View File

@@ -0,0 +1,31 @@
{
"name": "@openwork/types",
"private": true,
"type": "module",
"exports": {
".": {
"types": "./src/index.ts",
"development": "./src/index.ts",
"default": "./src/index.ts"
},
"./den/desktop-app-restrictions": {
"types": "./src/den/desktop-app-restrictions.ts",
"development": "./src/den/desktop-app-restrictions.ts",
"default": "./src/den/desktop-app-restrictions.ts"
}
},
"files": [
"src",
"dist"
],
"scripts": {
"build": "tsup"
},
"dependencies": {
"zod": "^4.3.6"
},
"devDependencies": {
"tsup": "^8.5.0",
"typescript": "^5.6.3"
}
}

View File

@@ -0,0 +1,30 @@
import { z } from "zod"
export const desktopAppRestrictionsSchema = z.object({
disallowNonCloudModels: z.boolean().optional(),
blockZenModel: z.boolean().optional(),
blockMultipleWorkspaces: z.boolean().optional(),
}).meta({ ref: "DenDesktopAppRestrictions" })
export type DesktopAppRestrictions = z.infer<typeof desktopAppRestrictionsSchema>
export function normalizeDesktopAppRestrictions(value: unknown): DesktopAppRestrictions {
const parsed = desktopAppRestrictionsSchema.safeParse(value)
if (parsed.success) {
return {
...(parsed.data.disallowNonCloudModels === true ? { disallowNonCloudModels: true } : {}),
...(parsed.data.blockZenModel === true ? { blockZenModel: true } : {}),
...(parsed.data.blockMultipleWorkspaces === true ? { blockMultipleWorkspaces: true } : {}),
}
}
const legacy = value as {
models?: {
removeZen?: unknown
}
} | null
return {
...(legacy?.models?.removeZen === true ? { blockZenModel: true } : {}),
}
}

View File

@@ -0,0 +1 @@
export * from "./den/desktop-app-restrictions"

View File

@@ -0,0 +1,17 @@
{
"compilerOptions": {
"target": "ES2022",
"module": "ESNext",
"moduleResolution": "Bundler",
"rootDir": "src",
"outDir": "dist",
"declaration": true,
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true
},
"include": [
"src/**/*"
]
}

View File

@@ -0,0 +1,20 @@
import { defineConfig } from "tsup"
export default defineConfig({
entry: {
index: "src/index.ts",
"den/desktop-app-restrictions": "src/den/desktop-app-restrictions.ts",
},
tsconfig: "./tsconfig.json",
format: ["esm"],
dts: {
tsconfig: "./tsconfig.json",
},
clean: true,
target: "es2022",
platform: "neutral",
sourcemap: false,
splitting: false,
treeshake: true,
external: ["zod"],
})