release: ship v1.5.0 with on-device writing suggestions
Adds next-sentence suggestions while typing, weekly input insights and a personal phrase memory to the desktop app, and fixes custom instructions so they process the text instead of inserting the instruction's own wording. Local model requests are now bounded and individually cancellable. Bumps the product version to 1.5.0 (Android/iOS build 1050000), refreshes the landing and web download links, and records the new INPUT feature rows and the open verification gaps in the infrastructure map.
This commit is contained in:
parent
99f06c253c
commit
5c11ee2fde
104 changed files with 14410 additions and 174 deletions
|
|
@ -3,12 +3,64 @@
|
|||
|
||||
import { EventEmitter } from 'events'
|
||||
import type { AppConfig, ConfigChangedEvent, KeyBindingActionId, KeyBindingMap } from '@d3ro/core/types'
|
||||
import { createDefaultBindingMap, normalizeBinding, parseBindingMap } from '@d3ro/core/keybinding'
|
||||
import {
|
||||
createDefaultBindingMap,
|
||||
findActionSpec,
|
||||
normalizeBinding,
|
||||
parseBindingMap
|
||||
} from '@d3ro/core/keybinding'
|
||||
import { D3ROError, ErrorCode } from '@d3ro/core/errors'
|
||||
import { getLogger } from './LoggerService'
|
||||
|
||||
const logger = getLogger('ConfigService')
|
||||
|
||||
/** 제안/텔레메트리 튜닝 기본값의 현재 개정판. 기본값을 바꾸면 올린다. */
|
||||
const SUGGESTION_TUNING_REVISION = 4
|
||||
|
||||
const INITIAL_SUGGESTION_TUNING = {
|
||||
suggestionTriggerDelayMs: 300,
|
||||
suggestionMinPrefixChars: 8,
|
||||
suggestionMaxRequestsPerMinute: 12,
|
||||
suggestionDailyBudget: 500
|
||||
} as const
|
||||
|
||||
/** 저장된 튜닝 값을 해당 개정판에서만 변경된 항목으로 올린다. */
|
||||
function migrateSuggestionTuning(activeStore: ElectronStore<AppConfig>): void {
|
||||
const raw = activeStore.store as unknown as Record<string, unknown>
|
||||
const current = Number(raw.suggestionTuningRevision ?? 0)
|
||||
if (Number.isFinite(current) && current >= SUGGESTION_TUNING_REVISION) return
|
||||
|
||||
if (current < 1) {
|
||||
for (const [key, value] of Object.entries(INITIAL_SUGGESTION_TUNING)) {
|
||||
activeStore.set(key as keyof AppConfig, value as AppConfig[keyof AppConfig])
|
||||
}
|
||||
}
|
||||
|
||||
if (current < 2) {
|
||||
const rawBindings = raw.keyBindings as unknown
|
||||
const bindings = parseBindingMap(rawBindings)
|
||||
const defaults = createDefaultBindingMap()
|
||||
const suggestionActions = ['suggestion-accept', 'suggestion-next', 'suggestion-prev', 'suggestion-dismiss'] as const
|
||||
for (const action of suggestionActions) {
|
||||
const spec = findActionSpec(action)
|
||||
if (!spec) continue
|
||||
bindings[action] = defaults[action] ?? spec.defaultBindings.map((binding) => ({ ...binding }))
|
||||
}
|
||||
activeStore.set('keyBindings', bindings)
|
||||
}
|
||||
|
||||
if (current < 3) activeStore.set('suggestionRequestTimeoutMs', 8000)
|
||||
if (current < 4) {
|
||||
activeStore.set('suggestionTriggerDelayMs', 600)
|
||||
activeStore.set('suggestionMaxRequestsPerMinute', 6)
|
||||
}
|
||||
|
||||
activeStore.set('suggestionTuningRevision', SUGGESTION_TUNING_REVISION)
|
||||
logger.info(
|
||||
`Migrated suggestion tuning values to revision ${SUGGESTION_TUNING_REVISION}`
|
||||
)
|
||||
}
|
||||
|
||||
// electron-store v10은 ESM 전용이므로 동적 import 필요
|
||||
interface ElectronStore<T> {
|
||||
get<K extends keyof T>(key: K): T[K]
|
||||
|
|
@ -82,6 +134,21 @@ const CONFIG_DEFAULTS: AppConfig = {
|
|||
updateChannel: 'latest',
|
||||
updateDeviceId: '',
|
||||
skippedUpdateVersion: null,
|
||||
// 입력 인텔리전스 — 옵트인. 켜기 전까지 어떤 입력도 수집하지 않는다.
|
||||
inputTelemetryEnabled: false,
|
||||
inputTelemetryPaused: false,
|
||||
inputLearnTypedText: false,
|
||||
inputExcludedApps: [],
|
||||
suggestionEnabled: false,
|
||||
suggestionModelId: null,
|
||||
// 기본값 정본: packages/core/src/input-intelligence.ts SUGGESTION_DEFAULTS
|
||||
suggestionTriggerDelayMs: 600,
|
||||
suggestionMinPrefixChars: 8,
|
||||
suggestionMaxRequestsPerMinute: 6,
|
||||
suggestionDailyBudget: 500,
|
||||
suggestionOverlayInteractive: true,
|
||||
suggestionRequestTimeoutMs: 8000,
|
||||
suggestionTuningRevision: 4,
|
||||
}
|
||||
|
||||
let store: ElectronStore<AppConfig> | null = null
|
||||
|
|
@ -195,6 +262,7 @@ export async function initConfigService(): Promise<void> {
|
|||
defaults: CONFIG_DEFAULTS
|
||||
})
|
||||
migrateKeyBindings(store)
|
||||
migrateSuggestionTuning(store)
|
||||
logger.info('ConfigService initialized')
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue