fix(mobile): preserve assistant IDs and scope state

This commit is contained in:
2026-07-12 12:15:02 +08:00
parent 36b7bf28bf
commit 0d64cf0f21
8 changed files with 91 additions and 39 deletions
@@ -3,6 +3,15 @@ import { readFile } from 'node:fs/promises';
import test from 'node:test';
const source = (path) => readFile(new URL(path, import.meta.url), 'utf8');
const idHelpers = await import('../src/services/personal-assistant-id.ts');
test('Snowflake ID 全程保留字符串精度并安全生成详情路径', () => {
const hugeId = '1990000000000000000';
assert.equal(idHelpers.normalizeBackendId(hugeId), hugeId);
assert.equal(idHelpers.personalItemRoute(hugeId), `/pages/user/assistant/item?id=${hugeId}`);
assert.equal(idHelpers.personalItemApiPath(hugeId), `/api/aihr/personal-assistant/items/${hugeId}`);
assert.equal(idHelpers.personalSessionApiPath(hugeId), `/api/aihr/personal-assistant/sessions/${hugeId}`);
});
test('个人助理 API 固定使用登录态且不接收 owner 参数', async () => {
const [client, api] = await Promise.all([
@@ -13,6 +22,10 @@ test('个人助理 API 固定使用登录态且不接收 owner 参数', async ()
assert.match(client, /\/api\/aihr\/personal-assistant\/ask/);
assert.match(client, /\/api\/aihr\/personal-assistant\/items\/file/);
assert.match(client, /uni\.uploadFile/);
assert.match(client, /sessionId\?: string/);
assert.match(client, /itemIds\?: string\[\]/);
assert.match(client, /loadPersonalItem = \(id: string\)/);
assert.match(client, /loadPersonalSession = \(id: string\)/);
assert.doesNotMatch(client, /ownerUserId|tenantId/);
assert.doesNotMatch(client, /clearAuthOnUnauthorized:\s*false/);
assert.doesNotMatch(api, /statusCode === 401 \|\| statusCode === 403/);
@@ -32,6 +45,10 @@ test('问答首页默认只查询个人资料并展示真实引用域', async ()
assert.doesNotMatch(page, /loadPersonalItem/);
assert.match(page, /answer\.value = undefined/);
assert.match(page, /requestGeneration/);
assert.match(page, /:disabled="asking"/);
assert.match(page, /if \(asking\.value\) return/);
assert.match(page, /scopeSnapshot/);
assert.match(page, /scopeKey\(scopes\.value\)/);
assert.match(page, /收藏资料/);
assert.doesNotMatch(page, /ownerUserId|tenantId/);
});
@@ -69,6 +86,8 @@ test('个人资料详情包含全部状态、重试、下载和明确删除提
assert.match(page, /deletePersonalItem/);
assert.match(page, /downloadPersonalItem/);
assert.match(page, /附件、解析正文和搜索索引/);
assert.match(page, /normalizeBackendId\(String\(options\?\.id/);
assert.doesNotMatch(page, /Number\(options\?\.id|parseInt\(options\?\.id|Number\.isSafeInteger/);
});
test('会话页覆盖列表、详情和删除且不伪造会话', async () => {