feat: add auth gate and Chinese command parsing

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
owo
2026-08-14 16:04:38 +08:00
co-authored by Cursor
parent a070a77e6b
commit db09bc6327
4 changed files with 82 additions and 0 deletions
+9
View File
@@ -0,0 +1,9 @@
export function isAuthorized(opts: {
allowAllUsers: boolean
allowedUserIds: number[]
userId?: number
}): boolean {
if (opts.allowAllUsers) return true
if (opts.userId === undefined) return false
return opts.allowedUserIds.includes(opts.userId)
}
+39
View File
@@ -0,0 +1,39 @@
export const MSG = {
DENIED: '无权限。',
WELCOME:
'你好,我是 DeepSeek Harness 渠道机器人。直接发消息开始对话,或发送 /help 查看命令。',
HELP: [
'/start — 开始 / 欢迎',
'/new 或 /clear — 新开会话',
'/help — 显示帮助',
'',
'仅白名单用户可对话;会话在内存中,重启 Harness 后需重新发消息建立。',
].join('\n'),
NEW_SESSION: '已开启新会话。',
unknown(command: string): string {
return `未知命令 ${command}。发送 /help 查看可用命令。`
},
} as const
export type ParsedCommand =
| { type: 'start'; text: string }
| { type: 'help'; text: string }
| { type: 'new'; text: string }
| { type: 'unknown'; command: string; text: string }
| { type: 'plain'; text: string }
export function parseCommand(text: string): ParsedCommand {
if (!text.startsWith('/')) return { type: 'plain', text }
const command = text.split(/\s+/)[0] ?? text
switch (command) {
case '/start':
return { type: 'start', text }
case '/help':
return { type: 'help', text }
case '/new':
case '/clear':
return { type: 'new', text }
default:
return { type: 'unknown', command, text }
}
}
+16
View File
@@ -0,0 +1,16 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { isAuthorized } from '../src/auth.ts'
test('empty allowlist rejects even with userId', () => {
assert.equal(isAuthorized({ allowAllUsers: false, allowedUserIds: [], userId: 1 }), false)
})
test('allowAllUsers accepts missing userId', () => {
assert.equal(isAuthorized({ allowAllUsers: true, allowedUserIds: [], userId: undefined }), true)
})
test('allowlist match', () => {
assert.equal(isAuthorized({ allowAllUsers: false, allowedUserIds: [42], userId: 42 }), true)
assert.equal(isAuthorized({ allowAllUsers: false, allowedUserIds: [42], userId: 7 }), false)
})
+18
View File
@@ -0,0 +1,18 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { MSG, parseCommand } from '../src/commands.ts'
test('parse slash commands', () => {
assert.equal(parseCommand('/start').type, 'start')
assert.equal(parseCommand('/help extra').type, 'help')
assert.equal(parseCommand('/new').type, 'new')
assert.equal(parseCommand('/clear').type, 'new')
assert.equal(parseCommand('/foo').type, 'unknown')
assert.equal(parseCommand('hello').type, 'plain')
})
test('Chinese copy is non-empty', () => {
assert.ok(MSG.DENIED.includes('权限') || MSG.DENIED.includes('授权'))
assert.ok(MSG.HELP.includes('/new'))
assert.ok(MSG.WELCOME.length > 0)
})