feat: unify app ordering and simplify app settings access
This commit is contained in:
@@ -35,12 +35,12 @@ export type BuiltInApplicationId = typeof builtInApplicationIds[number]
|
||||
export const editableApplicationIds = ['magic-notes', 'local-inference'] as const
|
||||
export type EditableApplicationId = typeof editableApplicationIds[number]
|
||||
export const defaultApplicationNavigation = {
|
||||
order: [...editableApplicationIds],
|
||||
pinned: { 'magic-notes': true, 'local-inference': true }
|
||||
order: ['knowledge', 'heartbeat', 'magic-notes', 'local-inference'] as BuiltInApplicationId[],
|
||||
pinned: { 'magic-notes': true, 'local-inference': false }
|
||||
}
|
||||
export const applicationNavigationSchema = z.object({
|
||||
order: z.array(z.enum(editableApplicationIds)).length(editableApplicationIds.length)
|
||||
.refine(ids => new Set(ids).size === editableApplicationIds.length, 'Each application must occur exactly once'),
|
||||
order: z.array(z.enum(builtInApplicationIds)).length(builtInApplicationIds.length)
|
||||
.refine(ids => new Set(ids).size === builtInApplicationIds.length, 'Each application must occur exactly once'),
|
||||
pinned: z.object({
|
||||
'magic-notes': z.boolean(), 'local-inference': z.boolean()
|
||||
}).strict()
|
||||
|
||||
@@ -18,6 +18,22 @@ import { defaultLocalToolEnvironmentSettings } from './local-tool-environment-co
|
||||
import { defaultApplicationNavigation } from './application-settings-contracts'
|
||||
|
||||
describe('GoodBuddy configuration contracts', () => {
|
||||
it('uses the authoritative full application order for configuration-tool writes', () => {
|
||||
const operation = {
|
||||
operation: 'application.update',
|
||||
updates: { applicationNavigation: {
|
||||
...defaultApplicationNavigation,
|
||||
order: ['local-inference', 'heartbeat', 'magic-notes', 'knowledge'],
|
||||
} },
|
||||
}
|
||||
expect(goodbuddyConfigOperationSchema.parse(operation)).toEqual(operation)
|
||||
for (const order of [['magic-notes', 'local-inference'], ['knowledge', 'heartbeat', 'magic-notes', 'magic-notes'], ['knowledge', 'heartbeat', 'magic-notes', 'invalid']]) {
|
||||
expect(goodbuddyConfigOperationSchema.safeParse({ ...operation, updates: {
|
||||
applicationNavigation: { ...defaultApplicationNavigation, order },
|
||||
} }).success).toBe(false)
|
||||
}
|
||||
})
|
||||
|
||||
it('publishes one valid generated example for every operation', () => {
|
||||
const operationNames = goodbuddyConfigOperationNameSchema.options
|
||||
|
||||
|
||||
Reference in New Issue
Block a user