- /status:绑定会话/会话 ID/工作区/当前模型/思考强度/上下文长度/ 首 token 平均/输出速率/输入输出 tokens —— 与 Web 底部统计条同源 同算法(sessionProjections: sessionStats/tokenUsage/contextPressure), 投影插件缺失时逐组优雅降级;冷会话不强制 resume - /compact:复用 ctx.compaction.compactNow 手动压缩绑定会话历史, 异步执行不阻塞轮询,完成/失败均中文通知,同会话去重, 桥停止/热重载自动中止进行中的压缩 - 全部用户可见文案不使用 emoji - rendering 默认改 html(兼容优先)+ userQuestions/approval 双通道等 既有修改一并合入(此前已上线确认) - tests:+6 覆盖 /status 全字段与 /compact 各分支(51 全绿)
49 lines
2.2 KiB
TypeScript
49 lines
2.2 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import test from 'node:test'
|
|
import { MSG, parseCommand } from '../src/commands.ts'
|
|
|
|
test('parse slash commands for remote control', () => {
|
|
assert.equal(parseCommand('/start').type, 'start')
|
|
assert.equal(parseCommand('/help').type, 'help')
|
|
assert.equal(parseCommand('/sessions').type, 'sessions')
|
|
assert.equal(parseCommand('/list').type, 'sessions')
|
|
assert.equal(parseCommand('/status').type, 'status')
|
|
assert.equal(parseCommand('/unbind').type, 'unbind')
|
|
assert.equal(parseCommand('/disconnect').type, 'unbind')
|
|
assert.equal(parseCommand('/model').type, 'model')
|
|
assert.equal(parseCommand('/last').type, 'last')
|
|
assert.equal(parseCommand('/context').type, 'last')
|
|
assert.equal(parseCommand('/sessions@MyBot').type, 'sessions')
|
|
assert.equal(parseCommand('/foo').type, 'unknown')
|
|
assert.equal(parseCommand('hello').type, 'plain')
|
|
})
|
|
|
|
test('parse /rich with optional mode argument', () => {
|
|
const bare = parseCommand('/rich')
|
|
assert.equal(bare.type, 'rich')
|
|
assert.equal(bare.type === 'rich' ? bare.arg : 'x', undefined)
|
|
const on = parseCommand('/rich on')
|
|
assert.equal(on.type, 'rich')
|
|
assert.equal(on.type === 'rich' ? on.arg : 'x', 'on')
|
|
assert.equal(parseCommand('/rich off').type === 'rich' && parseCommand('/rich off').arg, 'off')
|
|
assert.equal(parseCommand('/rich ON').type === 'rich' && parseCommand('/rich ON').arg, 'on')
|
|
assert.equal(parseCommand('/render auto').type === 'rich' && parseCommand('/render auto').arg, 'auto')
|
|
assert.equal(parseCommand('/setting').type, 'rich')
|
|
assert.equal(parseCommand('/setting html').type === 'rich' && parseCommand('/setting html').arg, 'html')
|
|
})
|
|
|
|
test('Chinese copy mentions sessions and bind', () => {
|
|
assert.ok(MSG.DENIED.includes('权限') || MSG.DENIED.includes('授权'))
|
|
assert.ok(MSG.HELP.includes('/sessions'))
|
|
assert.ok(MSG.HELP.includes('/last'))
|
|
assert.ok(MSG.HELP.includes('/model'))
|
|
assert.ok(MSG.NEED_BIND.includes('/sessions'))
|
|
assert.ok(MSG.WELCOME.includes('Web') || MSG.WELCOME.includes('遥控器'))
|
|
})
|
|
|
|
test('parse /compact', () => {
|
|
assert.equal(parseCommand('/compact').type, 'compact')
|
|
assert.equal(parseCommand('/compact@MyBot').type, 'compact')
|
|
assert.equal(parseCommand('/compact now').type, 'compact')
|
|
})
|