@casatwy/deyo 0.2.0 → 0.2.1

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  `deyo` 是 [https://deyo.miaobi.fun](https://deyo.miaobi.fun) 的命令行工具。你可以直接在终端里提交音视频链接或本地音视频文件进行转写,并把结果输出到终端或保存到本地文件。
4
4
 
5
- CLI `0.2.0` 新增可选的稳定正文事件。默认不会把正文写入进度日志;只有显式使用 `--stream-transcript --progress-format jsonl`,且最终格式为 `text` 时,才会在 stderr JSONL 中输出稳定的 Whisper 正文增量。stdout 或 `-O` 始终只接收最终 Whisper 原稿,CLI 本身不做 AI 整理。
5
+ CLI `0.2.1` 在保留可选稳定正文事件的同时,改为在省略 `--language` 时请求服务端自动检测转写语言;只有用户明确指定语言时,CLI 才会把 `language` 字段发送给链接或本地文件任务。默认不会把正文写入进度日志;只有显式使用 `--stream-transcript --progress-format jsonl`,且最终格式为 `text` 时,才会在 stderr JSONL 中输出稳定的 Whisper 正文增量。stdout 或 `-O` 始终只接收最终 Whisper 原稿,CLI 本身不做 AI 整理。
6
6
 
7
7
  当前支持 8 类链接来源 + 本地音视频上传。链接来源包括小宇宙单集、喜马拉雅单集(含 `xima.tv` 短链)、B 站单视频、抖音单视频、小红书单视频笔记、YouTube 单视频、Apple Podcasts 单集和 Twitter/X 单条推文。其中 YouTube 如果命中可直接使用的字幕,会直接输出字幕或文本结果,不进入完整转写、不扣分钟;喜马拉雅合集链接会返回 422 并提示选择单集,不会扣分钟或创建转写任务;抖音图文内容、小红书图文笔记、Twitter/X 文本或图片推文会返回不支持转写的提示。B 站支持普通 BV 链接、`b23.tv` 短链、带 `bvid` 的 `player.bilibili.com/player.html` 嵌入播放器链接,以及可由 Whisper 解出 BV 页面的 `bilibili://video/...` App 分享视频链接;CLI 会识别并透传 App 链接,不在本地解码或推导 BV。
8
8
 
@@ -28,7 +28,7 @@ deyo --help
28
28
 
29
29
  ## 安装 Deyo Skill
30
30
 
31
- Deyo CLI 和 Deyo Skill 是两个独立产物:CLI 负责登录、上传、转写、结构化进度和 Whisper 原稿;Skill 负责让 Codex、Claude、Gemini 或 OpenClaw 正确调用 CLI,并在普通 text 场景按约束整理正文。它们独立安装、独立版本、独立更新,版本号不要求相同。当前 Skill 要求 CLI 至少为 `0.2.0`。
31
+ Deyo CLI 和 Deyo Skill 是两个独立产物:CLI 负责登录、上传、转写、结构化进度和 Whisper 原稿;Skill 负责让 Codex、Claude、Gemini 或 OpenClaw 正确调用 CLI,并在普通 text 场景按约束整理正文。它们独立安装、独立版本、独立更新,版本号不要求相同。下一版 Skill 要求 CLI 至少为 `0.2.1`。
32
32
 
33
33
  先确认 CLI 版本,再交给 Deyo CLI 调用各平台的原生管理器安装 Skill:
34
34
 
@@ -246,7 +246,7 @@ deyo --api-key 'deyo_sk_other' 'https://www.youtube.com/watch?v=xxxx'
246
246
 
247
247
  `--language <value>`
248
248
 
249
- 指定转写语言。默认是 `zh`,也就是中文输出。也可以写 `en`,英文输出。
249
+ 显式指定转写语言,例如 `zh` 或 `en`。省略该参数时,CLI 不会在链接任务或本地文件任务的请求体里发送 `language` 字段,由服务端和 Whisper 自动检测;不要根据终端语言或内容标题自行推断。
250
250
 
251
251
  `-O, --output <path>`
252
252
 
package/deyo.mjs CHANGED
@@ -11,7 +11,6 @@ import { handleSkillCommand } from './skill-manager.mjs'
11
11
  const CLI_VERSION = createRequire(import.meta.url)('./package.json').version
12
12
 
13
13
  const DEFAULT_BASE_URL = 'https://deyo.miaobi.fun'
14
- const DEFAULT_LANGUAGE = 'zh'
15
14
  const POLL_INTERVAL_MS = 1500
16
15
  const SSE_RECONNECT_DELAYS_MS = [1000, 2000, 4000]
17
16
  const SSE_RECOVERY_INTERVAL_MS = 15000
@@ -91,7 +90,7 @@ function printUsage() {
91
90
  --source <name> 可选,显式指定来源:xiaoyuzhou | ximalaya | bilibili | douyin | xiaohongshu | youtube | apple-podcasts | twitter
92
91
  --file <path> 可选,显式指定本地单个音视频文件
93
92
  --mime-type <type> 可选,上传本地文件时显式指定 MIME,例如 audio/mpeg 或 video/mp4
94
- --language <value> 可选,转写语言,默认 ${DEFAULT_LANGUAGE}
93
+ --language <value> 可选,显式指定转写语言;省略时自动检测
95
94
  --format <value> 可选,text | srt | vtt | json | verbose_json
96
95
  --progress-format <v> 可选,auto | text | jsonl,默认 auto
97
96
  --stream-transcript 可选,通过 stderr JSONL 输出稳定正文;仅支持 text 且必须搭配 --progress-format jsonl
@@ -2085,7 +2084,7 @@ async function uploadLocalFile(fileInput, args, baseUrl, apiKey, reporter, runCo
2085
2084
  retry: true,
2086
2085
  body: {
2087
2086
  uploadId,
2088
- language: args.language || DEFAULT_LANGUAGE,
2087
+ ...(args.language ? { language: args.language } : {}),
2089
2088
  },
2090
2089
  })
2091
2090
  const checkedTask = getUploadTaskFromCheckResult(checkResult)
@@ -2192,7 +2191,7 @@ async function handleAuthCommand(argv) {
2192
2191
  function buildUrlTaskCreatePayload(args, input) {
2193
2192
  const createPayload = {
2194
2193
  url: input.url,
2195
- language: args.language || DEFAULT_LANGUAGE,
2194
+ ...(args.language ? { language: args.language } : {}),
2196
2195
  }
2197
2196
 
2198
2197
  if (args.source) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@casatwy/deyo",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Deyo transcription CLI with link/file input, JSONL progress, and opt-in stable transcript streaming",
5
5
  "homepage": "https://deyo.miaobi.fun/docs",
6
6
  "license": "UNLICENSED",
package/skill-manager.mjs CHANGED
@@ -25,6 +25,8 @@ const PLUGIN_ID = `deyo@${MARKETPLACE_NAME}`
25
25
  const GITHUB_REPOSITORY = 'casatwy/deyo-skill'
26
26
  const GIT_SOURCE_URL = 'https://github.com/casatwy/deyo-skill.git'
27
27
  const OPENCLAW_SKILL = '@casatwy/deyo'
28
+ const OPENCLAW_REGISTRY = 'https://clawhub.ai'
29
+ const STABLE_SEMVER = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/
28
30
 
29
31
  const DEFAULT_SCOPES = {
30
32
  codex: 'user',
@@ -1010,15 +1012,15 @@ function getOpenClawSkillPath(scope) {
1010
1012
 
1011
1013
  function isOfficialOpenClawOrigin(origin) {
1012
1014
  if (!isPlainObject(origin)) return false
1013
- for (const key of ['ref', 'source', 'package']) {
1014
- if (typeof origin[key] === 'string' && origin[key].trim().toLowerCase() === OPENCLAW_SKILL) {
1015
- return true
1016
- }
1017
- }
1018
- const owner = origin.owner || origin.publisher || origin.publisherHandle || origin.namespace
1019
- const slug = origin.slug || origin.skill || origin.name || origin.package
1020
- return String(owner || '').replace(/^@/, '').toLowerCase() === 'casatwy'
1021
- && String(slug || '').replace(/^@casatwy\//, '').toLowerCase() === 'deyo'
1015
+ const registry = typeof origin.registry === 'string' ? origin.registry.replace(/\/+$/, '') : ''
1016
+ return origin.version === 1
1017
+ && registry === OPENCLAW_REGISTRY
1018
+ && String(origin.ownerHandle || '').replace(/^@/, '').toLowerCase() === 'casatwy'
1019
+ && String(origin.slug || '').replace(/^@casatwy\//, '').toLowerCase() === 'deyo'
1020
+ && typeof origin.installedVersion === 'string'
1021
+ && STABLE_SEMVER.test(origin.installedVersion)
1022
+ && Number.isFinite(origin.installedAt)
1023
+ && /^[a-f0-9]{64}$/.test(origin.fingerprint || '')
1022
1024
  }
1023
1025
 
1024
1026
  async function inspectOpenClawSkill(scope) {
@@ -1055,7 +1057,7 @@ async function inspectOpenClawSkill(scope) {
1055
1057
  managed: metadata.exists,
1056
1058
  officialSource: metadata.safe && isOfficialOpenClawOrigin(origin),
1057
1059
  origin,
1058
- version: origin?.version || origin?.skillVersion || null,
1060
+ version: isOfficialOpenClawOrigin(origin) ? origin.installedVersion : null,
1059
1061
  safe: metadata.safe,
1060
1062
  }
1061
1063
  }