Ship Assistent 0.15.2: apply closed generate patches immediately, recover stalled streams, and skip repeat greetings when a chat already has replies.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+14
-3
@@ -3,6 +3,7 @@ import assert from 'node:assert/strict';
|
||||
import {
|
||||
userAsksLook,
|
||||
userAsksNoGenerate,
|
||||
userAsksGenerate,
|
||||
resolveTurnIntent,
|
||||
packWantsVision,
|
||||
} from '../src/intent.js';
|
||||
@@ -19,7 +20,14 @@ describe('intent.js', () => {
|
||||
assert.equal(userAsksNoGenerate('нарисуй лису'), false);
|
||||
});
|
||||
|
||||
it('resolveTurnIntent uses model generate only + veto', () => {
|
||||
it('userAsksGenerate detects сгенерируй', () => {
|
||||
assert.equal(userAsksGenerate('сгенерируй'), true);
|
||||
assert.equal(userAsksGenerate('нарисуй лису'), true);
|
||||
assert.equal(userAsksGenerate('что ты умеешь'), false);
|
||||
assert.equal(userAsksGenerate('не генерируй'), false);
|
||||
});
|
||||
|
||||
it('resolveTurnIntent uses model generate + user generate ask + veto', () => {
|
||||
const lookOnly = resolveTurnIntent({ look_at: ['generate'] }, 'что не так с кадром?', {});
|
||||
assert.equal(lookOnly.generate, false);
|
||||
assert.equal(lookOnly.look, true);
|
||||
@@ -27,12 +35,15 @@ describe('intent.js', () => {
|
||||
const gen = resolveTurnIntent({ prompt: 'fox', generate: true }, 'нарисуй лису', {});
|
||||
assert.equal(gen.generate, true);
|
||||
|
||||
const userGen = resolveTurnIntent({ prompt: 'A slender redhead in leather' }, 'сгенерируй', {});
|
||||
assert.equal(userGen.generate, true);
|
||||
|
||||
const vetoed = resolveTurnIntent({ prompt: 'fox', generate: true }, 'только запомни промпт', {});
|
||||
assert.equal(vetoed.generate, false);
|
||||
assert.equal(vetoed.vetoed, true);
|
||||
|
||||
const noHeuristic = resolveTurnIntent({ prompt: 'fox' }, 'нарисуй красивую лису в снегу', {});
|
||||
assert.equal(noHeuristic.generate, false);
|
||||
const chatOnly = resolveTurnIntent({ prompt: 'fox' }, 'что ты умеешь про генерацию?', {});
|
||||
assert.equal(chatOnly.generate, false);
|
||||
});
|
||||
|
||||
it('packWantsVision for critique pack', () => {
|
||||
|
||||
@@ -32,6 +32,30 @@ describe('patch.js', () => {
|
||||
assert.equal(p.generate, true);
|
||||
});
|
||||
|
||||
it('extractPatch prefers last terminal fence over a later weak pack fence', () => {
|
||||
const text = [
|
||||
'ok',
|
||||
'```json',
|
||||
'{"prompt":"A slender redhead in a leather jacket, 85mm, street light","generate":true}',
|
||||
'```',
|
||||
'```json',
|
||||
'{"pack":"ordinary"}',
|
||||
'```',
|
||||
].join('\n');
|
||||
const { patch } = extractPatch(text);
|
||||
assert.equal(patch.generate, true);
|
||||
assert.match(patch.prompt, /redhead/);
|
||||
});
|
||||
|
||||
it('extractPatch accepts generate true string and unfenced object', () => {
|
||||
const fenced = extractPatch('ok\n```json\n{"prompt":"A slender redhead in a leather jacket, 85mm","generate":"true"}\n```');
|
||||
assert.equal(fenced.patch.generate, true);
|
||||
assert.match(fenced.patch.prompt, /redhead/);
|
||||
const raw = extractPatch('done\n{"prompt":"A fiery redhead in leather, street light","generate":true}');
|
||||
assert.equal(raw.patch.generate, true);
|
||||
assert.equal(raw.prose, 'done');
|
||||
});
|
||||
|
||||
it('scheduler-only patch is detected with full key list', () => {
|
||||
setPatchKeys(['prompt', 'scheduler', 'generate', 'ask']);
|
||||
assert.equal(isPatchObject({ scheduler: 'euler' }), true);
|
||||
@@ -77,6 +101,17 @@ describe('session.js', () => {
|
||||
assert.equal(intent.vetoed, true);
|
||||
});
|
||||
|
||||
it('resolveTurnIntent honors сгенерируй when prompt is present', () => {
|
||||
const intent = resolveTurnIntent(
|
||||
{ prompt: 'A slender redhead in a leather jacket' },
|
||||
'сгенерируй',
|
||||
{ askGenerateFn: (t) => /сгенер/i.test(t) },
|
||||
);
|
||||
assert.equal(intent.generate, true);
|
||||
assert.equal(patchWantsGenerate({ generate: 'true' }), true);
|
||||
assert.equal(patchWantsGenerate({ generate: true }), true);
|
||||
});
|
||||
|
||||
it('mergeExactParamsForGenerate fills turbo profile when LLM omits steps/cfg', () => {
|
||||
const exact = {
|
||||
generation: { profile: 'turbo', steps: 8, cfg: 1, sigma_shift: 1.15 },
|
||||
|
||||
Reference in New Issue
Block a user