@yosai/cli 0.0.0-stage → 0.2.1-test.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,141 @@
1
+ ---
2
+ name: yos-support
3
+ description: YOS 帮助与支持(manual/manual-read/manual-search 帮助手册,upgrade/upgrade-log 客户端版本,feedback 提交反馈)。用户问 YOS 怎么用、要客户端最新版本、要报问题时使用
4
+ ---
5
+
6
+ # YOS 帮助与支持(support)
7
+
8
+ 五个只读命令 + 一个写命令。手册回答「YOS 怎么用」,`upgrade*` 回答「客户端最新版是什么」,`feedback` 把诉求登记给客服。
9
+
10
+ **领域内 ID 精度坑(三条命令都涉及)**:`manual` 目录树里的 `id` 是**带引号的字符串**,可安全使用;`manual-read` 与 `manual-search` 返回的 `id` 是**无引号的 19 位数字**,一旦 `JSON.parse` 就丢精度(`2100513671581945858` → `2100513671581945900`)。因此节点 ID 一律**从 `yos support manual` 的目录树取**,不要把 search/read 输出解析后再回传给 `manual-read`。
11
+
12
+ ## 1. `support manual` — 手册目录树(先调这个)
13
+
14
+ ```bash
15
+ yos support manual # 无参数,返回完整树
16
+ ```
17
+
18
+ 真实响应(数组,非分页壳):
19
+
20
+ ```json
21
+ [{"id":"2100511993159897090","parentId":null,"type":"FOLDER","title":"开始使用","sortOrder":0,
22
+ "children":[{"id":"2100513671581945858","parentId":"2100511993159897090","type":"FILE","title":"YOS 是什么","sortOrder":0,"children":[]},
23
+ {"id":"2100511408478113794","type":"FILE","title":"快速开始","sortOrder":1,"children":[]}]}]
24
+ ```
25
+
26
+ - `type`:`FOLDER`(无正文)/ `FILE`(文章)。只有 `FILE` 的 `id` 能传给 `manual-read`
27
+ - 递归字段是 `children`(叶子为 `[]`,不是 `null`);`parentId` 顶层为 `null`
28
+ - 全文目录一次性返回,没有分页参数、没有关键字过滤 → 想按标题找文章就在本地遍历 `title`,或直接改用 `manual-search`
29
+
30
+ ## 2. `support manual-read <node_id>` — 读文章正文
31
+
32
+ ```bash
33
+ yos support manual-read 2100513671581945858 # 「YOS 是什么」
34
+ ```
35
+
36
+ | 位置参数 | 工具参数 | 说明 |
37
+ |---|---|---|
38
+ | `<node_id>` | `node_id` | 文章节点 ID,来自 `manual` 目录树的 `id` 字段(字符串那一份) |
39
+
40
+ 正常响应:
41
+
42
+ ```json
43
+ {"id":2100513671581945858,"type":"FILE","title":"YOS 是什么","content":"YOS 是渝欧数智自主研发的企业级 AI 操作系统,……"}
44
+ ```
45
+
46
+ - `content` 是**富文本清洗后的纯文本**:没有 Markdown 标题符号、列表符号和图片地址,向用户复述时可直接引用,但不要承诺格式还原
47
+ - 传 `FOLDER` 节点的 ID **不报错(exit 0)**,返回 `{"id":…,"type":"FOLDER","title":"开始使用","content":"","message":"文件夹无正文,请根据目录树选择其下的文章节点"}` → 见到 `content:""` 就回目录树换 `FILE` 节点,别重复请求
48
+ - ID 不存在:`工具执行失败:帮助手册节点不存在:999`(exit 1)→ 说明 ID 取错或精度已丢,重新从 `manual` 取
49
+
50
+ ## 3. `support manual-search <keyword>` — 关键词检索
51
+
52
+ ```bash
53
+ yos support manual-search 登录
54
+ yos support manual-search 知识库
55
+ ```
56
+
57
+ | 位置参数 | 工具参数 | 说明 |
58
+ |---|---|---|
59
+ | `<keyword>` | `keyword` | 单个关键词。标题或正文命中其一即算,大小写不敏感;**没有分词/多词/正则能力** |
60
+
61
+ 真实响应:
62
+
63
+ ```json
64
+ {"keyword":"登录","total":6,"records":[
65
+ {"id":2100513705551613953,"title":"常见问题","path":"帮助","snippet":"按主题分组。找不到答案时,通过问题反馈提交。\n\n安装与登录\n\n下载被浏览器拦截\n\n用 Chrome 下载;提示有害时点击 操作 → 保留 → …"}]}
66
+ ```
67
+
68
+ - `path` 是**所在目录名**(如 `帮助`),不是完整路径链;要层级关系回到 `manual` 树里查
69
+ - `snippet` 是正文摘录,**不等于全文**:确定要引用的操作细节必须再用 `manual-read`(ID 从 `manual` 取)
70
+ - 实测各主题命中量:`转写=10`、`更新=9`、`设置=8`、`版本=7`、`登录=6`、`知识库=5`、`上传=4`
71
+ - **`total:0` 是常见结论,不是失败**:实测 `令牌` 和 `访问令牌` 都是 `0`(手册里没有访问令牌主题)。此时直接按 `yos` 总入口的登录步骤回答(客户端「个人设置-访问令牌」),不要反复换近义词空转
72
+ - 检索是**子串式关键词匹配**:`--` 之类符号、英文短语(`MCP`)请按用户原词与可能的中英文写法各试一次,两次为 `0` 就停手走 `feedback`
73
+
74
+ ## 4. `support upgrade` / `support upgrade-log` — 客户端版本
75
+
76
+ ```bash
77
+ yos support upgrade --platform MAC_ARM64 # 该平台对当前用户可见的最新版
78
+ yos support upgrade-log # 全部升级记录(新发布在前)
79
+ yos support upgrade-log --platform WIN --page 1 --size 5
80
+ yos support upgrade-log --start 2026-10-01 --end 2026-10-10 # 按发布日期区间
81
+ ```
82
+
83
+ | flag | 工具参数 | 说明 | 缺省 |
84
+ |---|---|---|---|
85
+ | `--platform` | `platform` | `upgrade` **必填**;`upgrade-log` 可选(不传=全平台)。取值只有 `WIN` / `MAC_X64` / `MAC_ARM64`,**没有 LINUX** | — |
86
+ | `--start` / `--end` | `start_date` / `end_date` | 严格 `yyyy-MM-dd`,含当日;中文时间表达需自行换算。格式非法 → `错误: --start 日期格式应为 yyyy-MM-dd:本周`;起晚于止 → `错误: 日期区间非法:--start 晚于 --end`(均 exit 2) | 不过滤 |
87
+ | `--page` / `--size` | `page` / `size` | `size` 1~50,越界 → `错误: --size 低于下限 1:0` + `提示: 取值范围 1~50`(exit 2) | 1 / 10 |
88
+
89
+ 真实响应:
90
+
91
+ ```json
92
+ // upgrade
93
+ {"id":"2108510276780978177","version":"v0.2.0-test.14","platform":"MAC_ARM64","platformName":"macOS Apple Silicon 版",
94
+ "releaseDate":"2026-10-09","isForceUpdate":false,"content":null}
95
+
96
+ // upgrade-log
97
+ {"records":[{"id":"2108722559616446465","version":"v0.2.0-test.14","platform":"WIN","platformName":"Windows",
98
+ "releaseDate":"2026-10-10","isForceUpdate":false,"content":""}],
99
+ "total":107,"page":1,"size":2}
100
+ ```
101
+
102
+ - 平台取值只有三个,写错由 CLI 本地拦下(不发请求,exit 2):`错误: --platform 取值非法:NOSUCH` + `提示: 可选:WIN / MAC_X64 / MAC_ARM64`;`upgrade` 漏传 → `错误: 缺少 --platform`(exit 2)
103
+ - `content` 是**公告全文纯文本**,但**可能为 `null` 或 `""`**(实测两平台同版本一为 `null` 一为 `""`)→ 没有公告时只报版本号与日期,不要编造更新内容;用户问「更新了什么」就换 `upgrade-log` 找有公告的记录
104
+ - `upgrade` 只给三平台的当前可见最新版,**灰度中的版本仅白名单用户可见**:用户说「同事有 x 版本我没有」时,先 `upgrade-log` 确认该版本是否存在,再解释灰度,不要判定为版本不存在
105
+ - `isForceUpdate` 对应客户端是否强制更新,回答升级建议时值得带上
106
+ - 返回的 `version` 是 **YOS 桌面客户端**版本(形如 `v0.2.0-test.14`,测试环境带 `-test`),与 `@yosai/cli` 自身的 npm 版本是两回事(CLI 自身版本用 `yos version` 查),不要混用
107
+
108
+ ## 5. `support feedback '<内容>'` — 提交反馈(写操作)
109
+
110
+ ```bash
111
+ yos support feedback '知识库上传 20MB 以上的 PDF 会失败,希望支持大文件分片'
112
+ yos support feedback -- '转写结果说话人识别不准,希望提供纠错入口' # 内容以 - 开头时必须加 --
113
+ ```
114
+
115
+ - 位置参数 `content`(variadic,多个位置参数以空格拼接为一个字符串),上限 **2000 字**
116
+ - **写入类操作**:内容会自动关联当前用户与其所属企业并进入客服工单流程。调用前必须把最终原文给用户看过并取得明确同意
117
+ - 空内容:`错误: 反馈内容不能为空` + `提示: 用法: yos support feedback <内容...>`(exit 2);超 2000 字:`错误: 反馈内容超长(实际 2001 字,上限 2000 字)`(exit 2)→ 压缩为一条诉求或拆成多次提交(先问用户)
118
+ - 成功:`反馈提交成功,反馈编号:2108742524868513794` → 把编号回给用户,这是唯一可追溯凭证
119
+ - **编号无法再查询**:CLI 没有反馈详情/进度/撤回命令,提交后不要承诺「帮你跟进这条反馈的状态」
120
+ - 无附件:日志、截图只能靠用户在客户端内提交,CLI 路径只收文本
121
+
122
+ ## 6. 标准流程
123
+
124
+ ```bash
125
+ # 用户问「YOS 怎么用 / X 功能在哪」
126
+ yos support manual-search '<关键词>' # 1. 定位候选文章
127
+ yos support manual # 2. 从目录树取该文章 id(字符串形态那份)
128
+ yos support manual-read <FILE 节点 id> # 3. 读正文后再回答
129
+
130
+ # 用户问「客户端最新版本 / 更新了什么」
131
+ yos support upgrade --platform MAC_ARM64 # 单平台最新版
132
+ yos support upgrade-log --platform MAC_ARM64 --size 5 # 公告 content 为 null 时改查这里
133
+
134
+ # 用户报问题或提诉求
135
+ 先 manual-search 确认不是已有文档的用法问题 → 把手册答案给用户
136
+ 确认为缺陷/新需求 → 与用户确认原文 → yos support feedback '<原文>'
137
+ ```
138
+
139
+ ## 7. 做不到的事
140
+
141
+ 不提供手册编辑/新增;不把 `path` 展开为完整目录链;不按功能名反查版本号(只能按平台/日期过滤后人工比对公告);不下载客户端安装包;不查询反馈进度、不撤回反馈;反馈不带附件。有这类诉求时说明边界,并可用 `yos support feedback` 登记。
@@ -0,0 +1,92 @@
1
+ ---
2
+ name: yos-transcript
3
+ description: YOS 录音转写查询(transcript list 列表 / transcript detail 详情,含分段、纪要、思维导图、音频地址与字段坑)。用户想看会议录音转写、要纪要、查某次会议内容时使用
4
+ ---
5
+
6
+ # YOS 录音转写(transcript)
7
+
8
+ 只读两个命令:`list` 拿记录 ID,`detail` 拿全文。**CLI 不提供转写正文的检索入口**,`retrieve` 域查不到会议内容。
9
+
10
+ ## 1. `transcript list` — 我的转写
11
+
12
+ ```bash
13
+ yos transcript list # 第 1 页,10 条
14
+ yos transcript list --json # 需要 transcriptionUserId 时必须用这个
15
+ yos transcript list --keyword 节前周会 --json # 只匹配标题(不搜正文)
16
+ yos transcript list --relation owner --json # owner=我建的 / shared=别人分享的
17
+ yos transcript list --start 2026-09-28 --end 2026-10-10 --json # 必须 yyyy-MM-dd
18
+ yos transcript list --page 2 --size 20 --json # size 上限 50
19
+ yos transcript list --status summarized --json # 状态过滤(合法值见下)
20
+ ```
21
+
22
+ | flag | 工具参数 | 说明 | 缺省 |
23
+ |---|---|---|---|
24
+ | `--page` | `page` | ≥1 | 1 |
25
+ | `--size` | `size` | 每页条数,1~50;越界 → `错误: --size 超过上限 50:1000`(exit 2) | 10 |
26
+ | `--status` | `status` | `recording`(录制中/转写中)\| `recorded`(待总结)\| `summarizing`(总结中)\| `summarized`(总结完成,实测 `statusName: 总结完成`)。非法值 → `错误: --status 取值非法:xxx` + `提示: 可选:recording / recorded / summarizing / summarized`(exit 2) | 不过滤 |
27
+ | `--relation` | `relation_type` | `owner`(我创建)\| `shared`(他人分享给我)\| `all`(实测记录里 `relationType: "owner"`)。非法值 → exit 2 | `all` |
28
+ | `--keyword` | `keyword` | **只按标题匹配**,正文/纪要里的词搜不到(实测:某词在纪要 JSON 中出现 6 次,但 `--keyword` 结果 `total=0`) | 无 |
29
+ | `--start` / `--end` | `start_date` / `end_date` | 格式严格 `yyyy-MM-dd`,含当日;中文时间表达由 CLI 本地拒绝:`错误: --start 日期格式应为 yyyy-MM-dd:本周`;起晚于止 → `错误: 日期区间非法:--start 晚于 --end` + `提示: 起 … 应不晚于止 …`(均 exit 2,不发请求) | 无 |
30
+
31
+ 真实响应(注意:分页壳与 `kb list` 不同,用 `list` 字段而非 `records`):
32
+
33
+ ```json
34
+ {"current":1,"size":10,"pages":7,"total":67,"list":[
35
+ {"transcriptionUserId":"2105108032979103745","transcriptionCode":"TT00006601","title":"节前周会",
36
+ "transcriptionType":"realtime","status":"summarized","statusName":"总结完成",
37
+ "totalDurationMs":1778346,"createTime":"2026-09-30 09:30:40","creatorName":"张三","relationType":"owner"}]}
38
+ ```
39
+
40
+ - 列表字段是 **`list`**,分页字段为 `current` / `size` / `pages` / `total`(`pages` 即总页数);与 `kb list` / `upgrade-log` 的 `records` / `page` 壳不同,解析时不要套用
41
+ - `transcriptionType` 实测值 `realtime`(实时录音);时长 `totalDurationMs` 是毫秒,向用户表述要换算成分钟
42
+ - **失败状态的记录恒被服务端排除**,在 CLI 里永远看不到,用户问「今天那个转写失败的会议」时直接说明该记录不可见,不要反复换过滤条件找
43
+ - 不加 `--json` 也输出同一段 JSON 原文(本域没有人类渲染)
44
+
45
+ ## 2. `transcript detail` — 取全文与纪要
46
+
47
+ ```bash
48
+ yos transcript detail 2105108032979103745 --json
49
+ ```
50
+
51
+ 位置参数是 **`transcriptionUserId`(19 位纯数字,来自返回体 `list[].transcriptionUserId` 字段)**,不是 `TT` 开头的 `transcriptionCode`:
52
+
53
+ ```
54
+ $ yos transcript detail TT00006601
55
+ 错误: 转写归属记录 ID 需为数字,实际收到:TT00006601
56
+ 提示: TT 开头的是转写编码,本命令需要对应的数字 ID # exit 2,不发请求
57
+ ```
58
+
59
+ 真实响应字段(`--json` 二次解析后):
60
+
61
+ | 字段 | 形态与用途 |
62
+ |---|---|
63
+ | `summary` | **Markdown 字符串**(实测 3202 字),结构为「一、核心结论 / 二、整体概述 / 关键决策展开」。可直接落盘或摘录,是回答「这次会说了什么」的首选 |
64
+ | `sentences[]` | 逐句:`globalStartMs` / `globalEndMs` / `speakerName` / `speakerLabel` / 文本。实测某会议 154 句 |
65
+ | `speakers[]` | 仅 `userCode` / `userName` |
66
+ | `mindMap` | **双重编码 JSON 字符串**(形如 `"{\"children\":[...]}"`),需再 `JSON.parse` 一次才能用;不解析就当它是空 |
67
+ | `audioUrl` | COS 预签名下载地址(原音频可下载,注意有效期) |
68
+ | `transcriptionCode` / `title` / `status` | 与 list 一致 |
69
+
70
+ 说话人可信度(表述时必须带保留):
71
+
72
+ - `speakerLabel`(声纹聚类编号)与人名是**多对多**:实测 label `3` 同时对应「张三/李四/王五/说话人」四个名字,label `1` 对应三个
73
+ - 实测 154 句里 **41 句(27%)`speakerName` 是未解析的「说话人」**
74
+ - 没有 `speakerLabel ↔ userCode` 的映射字段,也没有按说话人/时间戳过滤的参数:要「某人说了什么」就拉全量 `sentences` 在本地按 `speakerName` 过滤,并向用户说明未识别句段可能存在
75
+ - 说话人纠错、纪要编辑 CLI 都不支持(转写域仅两个工具),需要改动请引导用户到客户端
76
+
77
+ 非「已完成」状态的转写调 `detail` 会被服务端拒绝(转写中/失败不可读)。
78
+
79
+ ## 3. 标准流程
80
+
81
+ ```bash
82
+ yos transcript list --json # 1. 取 transcriptionUserId
83
+ yos transcript list --keyword '<标题关键词>' --json # 或按标题缩小;--start/--end 缩小日期范围
84
+ yos transcript detail 2105108032979103745 --json # 2. 取纪要与逐句
85
+ # 3. 回答:先给 summary 要点,需举证时引用 sentences 的毫秒时间戳(换算成 mm:ss)
86
+ ```
87
+
88
+ 「最近一次会议」= `list` 首条(实测按时间新在前),但用户给的是主题词时优先 `--keyword` + 标题人工确认,不要凭顺序猜是哪场会。
89
+
90
+ ## 4. 做不到的事
91
+
92
+ 不检索转写正文(`--keyword` 只搜标题);不按说话人或时间点过滤;不导出(自行把 `summary` 落盘);不查询转写进度;不纠错说话人、不改纪要;看不到失败记录。有这类诉求用 `yos support feedback '<诉求>'` 记录。
@@ -0,0 +1,38 @@
1
+ const DOMAIN_ORDER = [
2
+ '知识库管理',
3
+ 'cortex 检索原语',
4
+ '帮助手册与客户端升级',
5
+ '转写查询',
6
+ '用户反馈',
7
+ '其他',
8
+ ];
9
+ function matchDomain(name) {
10
+ if (name.startsWith('retrieve_')) {
11
+ return 'cortex 检索原语';
12
+ }
13
+ if (name.startsWith('kb_') || name.startsWith('docs_')) {
14
+ return '知识库管理';
15
+ }
16
+ if (name.startsWith('support_feedback')) {
17
+ return '用户反馈';
18
+ }
19
+ if (name.startsWith('support_')) {
20
+ return '帮助手册与客户端升级';
21
+ }
22
+ if (name.startsWith('transcript_')) {
23
+ return '转写查询';
24
+ }
25
+ return '其他';
26
+ }
27
+ export function groupTools(tools) {
28
+ const buckets = new Map();
29
+ for (const tool of tools) {
30
+ const domain = matchDomain(tool.name);
31
+ const list = buckets.get(domain) ?? [];
32
+ list.push(tool);
33
+ buckets.set(domain, list);
34
+ }
35
+ return DOMAIN_ORDER
36
+ .map((domain) => ({ domain, tools: buckets.get(domain) ?? [] }))
37
+ .filter((group) => group.tools.length > 0);
38
+ }
@@ -0,0 +1,30 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { configDir } from './config.js';
4
+ function versionStatePath() {
5
+ return join(configDir(), 'version-state');
6
+ }
7
+ export function loadVersionState() {
8
+ const path = versionStatePath();
9
+ if (!existsSync(path)) {
10
+ return null;
11
+ }
12
+ try {
13
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
14
+ if (typeof parsed.version !== 'string' || parsed.version === '') {
15
+ return null;
16
+ }
17
+ return {
18
+ version: parsed.version,
19
+ updatedAt: typeof parsed.updatedAt === 'string' ? parsed.updatedAt : '',
20
+ };
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export function saveVersionState(version) {
27
+ mkdirSync(configDir(), { recursive: true, mode: 0o700 });
28
+ const state = { version, updatedAt: new Date().toISOString() };
29
+ writeFileSync(versionStatePath(), `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
30
+ }
package/package.json CHANGED
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "name": "@yosai/cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.2.1-test.0",
4
+ "description": "YOS 能力的 Agent 执行入口:工具调用、知识库管理与文件上传",
5
+ "type": "module",
6
+ "bin": {
7
+ "yos": "dist/index.js"
8
+ },
9
+ "engines": {
10
+ "node": ">=18"
11
+ },
12
+ "files": [
13
+ "dist"
14
+ ],
15
+ "publishConfig": {
16
+ "registry": "https://registry.npmjs.org",
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc && node scripts/copy-assets.mjs && chmod +x dist/index.js",
21
+ "typecheck": "tsc --noEmit",
22
+ "test": "vitest run",
23
+ "release": "node scripts/release.mjs"
24
+ },
25
+ "license": "Apache-2.0",
26
+ "private": false,
27
+ "devDependencies": {
28
+ "@types/node": "^26.6.3",
29
+ "typescript": "^7.0.2",
30
+ "vitest": "^5.0.2"
31
+ }
32
+ }