@yosai/cli 0.0.0-stage → 0.2.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.
- package/LICENSE +201 -0
- package/README.md +66 -2
- package/dist/cli.js +188 -0
- package/dist/commands/context.js +6 -0
- package/dist/commands/docs-download.js +85 -0
- package/dist/commands/doctor.js +102 -0
- package/dist/commands/domain.js +16 -0
- package/dist/commands/index.js +10 -0
- package/dist/commands/kb-upload.js +210 -0
- package/dist/commands/kb.js +165 -0
- package/dist/commands/login.js +35 -0
- package/dist/commands/ping.js +40 -0
- package/dist/commands/skill.js +22 -0
- package/dist/commands/tool.js +129 -0
- package/dist/commands/update.js +73 -0
- package/dist/commands/version.js +44 -0
- package/dist/config.js +55 -0
- package/dist/domain-commands.js +477 -0
- package/dist/domain-executor.js +257 -0
- package/dist/endpoints.js +1 -0
- package/dist/errors.js +37 -0
- package/dist/index.js +5 -0
- package/dist/npm-meta.js +96 -0
- package/dist/openapis-client.js +112 -0
- package/dist/output.js +21 -0
- package/dist/prompt.js +40 -0
- package/dist/skill-sync.js +34 -0
- package/dist/skills/yos/SKILL.md +86 -0
- package/dist/skills/yos-install/SKILL.md +162 -0
- package/dist/skills/yos-kb/SKILL.md +388 -0
- package/dist/skills/yos-retrieval/SKILL.md +220 -0
- package/dist/skills/yos-shared/SKILL.md +185 -0
- package/dist/skills/yos-support/SKILL.md +141 -0
- package/dist/skills/yos-transcript/SKILL.md +92 -0
- package/dist/tool-domains.js +38 -0
- package/dist/version-state.js +30 -0
- package/package.json +30 -4
|
@@ -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.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.2.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
|
+
}
|