release: ship v1.5.0 with on-device writing suggestions
Some checks failed
deploy-site / deploy (push) Failing after 33s
portable-unsigned / portable-windows (push) Failing after 4m7s
release / release-windows (push) Failing after 3m16s

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:
Yun Chan 2026-09-23 16:04:27 +09:00
parent 99f06c253c
commit 5c11ee2fde
104 changed files with 14410 additions and 174 deletions

View file

@ -20,8 +20,10 @@ import {
renderInstructionPrompt,
buildInstructionInvocation,
resolveSystemPrompt,
buildSuggestionPrompt,
DEFAULT_TARGET_LANGUAGE,
BASE_SYSTEM_PROMPTS,
SUGGESTION_NO_THINK_PREFIX,
} from '../../../src/main/services/llm-prompts'
beforeEach(() => {
@ -167,3 +169,47 @@ describe('resolveSystemPrompt', () => {
}
})
})
describe('buildSuggestionPrompt', () => {
it('지시문은 시스템 프롬프트에만 있고 사용자 텍스트에는 들어가지 않는다', () => {
const { systemPrompt, text } = buildSuggestionPrompt({
prefix: '오늘 회의에서 논의한 내용을 정리해서',
appName: 'chrome.exe',
windowTitle: '회의록 - Chrome',
phraseHints: ['지난번에는 이렇게 정리했습니다'],
candidates: 3,
maxChars: 120
})
// 지시문이 사용자 텍스트 자리로 새면 모델이 지시문 자체를 다듬어 돌려준다
// (commit 9c2b4d4 회와 같은 부류).
expect(systemPrompt).toContain('다음 문장')
expect(text).not.toContain('규칙:')
expect(text).toContain('오늘 회의에서 논의한 내용을 정리해서')
expect(text).toContain('지난번에는 이렇게 정리했습니다')
expect(text).toContain('chrome.exe')
})
it('후보 수와 길이 상한을 프롬프트에 반영한다', () => {
const { systemPrompt, text } = buildSuggestionPrompt({ prefix: 'abc', candidates: 2, maxChars: 60 })
expect(systemPrompt).toContain('60')
expect(text).toContain('2')
})
it('추론 모델용 no_think prefix 를 붙인다', () => {
const { systemPrompt } = buildSuggestionPrompt({ prefix: 'abc' })
expect(systemPrompt.startsWith(SUGGESTION_NO_THINK_PREFIX)).toBe(true)
})
it('후보 수/길이는 안전 범위로 클램프한다', () => {
const { systemPrompt, text } = buildSuggestionPrompt({
prefix: 'abc',
candidates: 99,
maxChars: 99999
})
expect(systemPrompt).toContain('400')
expect(text).toContain('5')
})
})