@windsland52/maafw-live 0.0.0-stage → 0.3.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +278 -2
  3. package/bin/maafw-live.mjs +25 -0
  4. package/docs/daemon-protocol.md +116 -0
  5. package/docs/keyframe-evidence-contract-v0.md +61 -0
  6. package/docs/keyframe-retention-contract-v0.md +236 -0
  7. package/lib/client/daemon.js +234 -0
  8. package/lib/client/daemon.js.map +1 -0
  9. package/lib/commands/annotate.js +172 -0
  10. package/lib/commands/annotate.js.map +1 -0
  11. package/lib/commands/calibrate.js +61 -0
  12. package/lib/commands/calibrate.js.map +1 -0
  13. package/lib/commands/color.js +73 -0
  14. package/lib/commands/color.js.map +1 -0
  15. package/lib/commands/crop.js +228 -0
  16. package/lib/commands/crop.js.map +1 -0
  17. package/lib/commands/env.js +215 -0
  18. package/lib/commands/env.js.map +1 -0
  19. package/lib/commands/index.js +64 -0
  20. package/lib/commands/index.js.map +1 -0
  21. package/lib/commands/input.js +219 -0
  22. package/lib/commands/input.js.map +1 -0
  23. package/lib/commands/kf.js +131 -0
  24. package/lib/commands/kf.js.map +1 -0
  25. package/lib/commands/reco.js +211 -0
  26. package/lib/commands/reco.js.map +1 -0
  27. package/lib/commands/repl.js +698 -0
  28. package/lib/commands/repl.js.map +1 -0
  29. package/lib/commands/runtime.js +514 -0
  30. package/lib/commands/runtime.js.map +1 -0
  31. package/lib/commands/skill.js +169 -0
  32. package/lib/commands/skill.js.map +1 -0
  33. package/lib/commands/timing.js +229 -0
  34. package/lib/commands/timing.js.map +1 -0
  35. package/lib/commands/version.js +66 -0
  36. package/lib/commands/version.js.map +1 -0
  37. package/lib/daemon/framed.mjs +2850 -0
  38. package/lib/daemon/reco_child.mjs +146 -0
  39. package/lib/exec.js +96 -0
  40. package/lib/exec.js.map +1 -0
  41. package/lib/flags.js +42 -0
  42. package/lib/flags.js.map +1 -0
  43. package/lib/image.js +90 -0
  44. package/lib/image.js.map +1 -0
  45. package/lib/index.js +139 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/interface/index.js +12 -0
  48. package/lib/interface/index.js.map +1 -0
  49. package/lib/interface/jsonc.js +95 -0
  50. package/lib/interface/jsonc.js.map +1 -0
  51. package/lib/interface/load.js +307 -0
  52. package/lib/interface/load.js.map +1 -0
  53. package/lib/interface/override.js +103 -0
  54. package/lib/interface/override.js.map +1 -0
  55. package/lib/interface/plan.js +188 -0
  56. package/lib/interface/plan.js.map +1 -0
  57. package/lib/pkg.js +18 -0
  58. package/lib/pkg.js.map +1 -0
  59. package/lib/protocol.js +90 -0
  60. package/lib/protocol.js.map +1 -0
  61. package/lib/runtime/actions.js +110 -0
  62. package/lib/runtime/actions.js.map +1 -0
  63. package/lib/runtime/keyframes.js +73 -0
  64. package/lib/runtime/keyframes.js.map +1 -0
  65. package/lib/runtime/session.js +86 -0
  66. package/lib/runtime/session.js.map +1 -0
  67. package/lib/types/client/daemon.d.ts +86 -0
  68. package/lib/types/commands/annotate.d.ts +3 -0
  69. package/lib/types/commands/calibrate.d.ts +7 -0
  70. package/lib/types/commands/color.d.ts +9 -0
  71. package/lib/types/commands/crop.d.ts +3 -0
  72. package/lib/types/commands/env.d.ts +2 -0
  73. package/lib/types/commands/index.d.ts +13 -0
  74. package/lib/types/commands/input.d.ts +17 -0
  75. package/lib/types/commands/kf.d.ts +10 -0
  76. package/lib/types/commands/reco.d.ts +23 -0
  77. package/lib/types/commands/repl.d.ts +2 -0
  78. package/lib/types/commands/runtime.d.ts +48 -0
  79. package/lib/types/commands/skill.d.ts +17 -0
  80. package/lib/types/commands/timing.d.ts +64 -0
  81. package/lib/types/commands/version.d.ts +3 -0
  82. package/lib/types/exec.d.ts +31 -0
  83. package/lib/types/flags.d.ts +58 -0
  84. package/lib/types/image.d.ts +27 -0
  85. package/lib/types/index.d.ts +1 -0
  86. package/lib/types/interface/index.d.ts +11 -0
  87. package/lib/types/interface/jsonc.d.ts +9 -0
  88. package/lib/types/interface/load.d.ts +113 -0
  89. package/lib/types/interface/override.d.ts +33 -0
  90. package/lib/types/interface/plan.d.ts +47 -0
  91. package/lib/types/pkg.d.ts +6 -0
  92. package/lib/types/protocol.d.ts +108 -0
  93. package/lib/types/runtime/actions.d.ts +166 -0
  94. package/lib/types/runtime/keyframes.d.ts +43 -0
  95. package/lib/types/runtime/session.d.ts +53 -0
  96. package/lib/types/update-check.d.ts +20 -0
  97. package/lib/types/usage.d.ts +3 -0
  98. package/lib/update-check.js +97 -0
  99. package/lib/update-check.js.map +1 -0
  100. package/lib/usage.js +50 -0
  101. package/lib/usage.js.map +1 -0
  102. package/package.json +81 -4
  103. package/skills/README.md +51 -0
  104. package/skills/maafw-live/SKILL.md +263 -0
  105. package/skills/maafw-live/references/examples.md +238 -0
  106. package/skills/maafw-live/references/pitfalls.md +118 -0
  107. package/skills/maafw-live/references/workflows.md +159 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/interface/plan.ts"],"names":[],"mappings":"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"}
package/lib/pkg.js ADDED
@@ -0,0 +1,18 @@
1
+ /** 读取 CLI 自身包信息。src 与 lib 都在包根下一层,故 `../package.json` 两种运行方式都成立。 */
2
+ import { readFileSync } from 'node:fs';
3
+ import { fileURLToPath } from 'node:url';
4
+ let cached = null;
5
+ export function cliPackage() {
6
+ if (cached)
7
+ return cached;
8
+ try {
9
+ const p = fileURLToPath(new URL('../package.json', import.meta.url));
10
+ const j = JSON.parse(readFileSync(p, 'utf8'));
11
+ cached = { name: j.name ?? 'maafw-live', version: j.version ?? '0.0.0', description: j.description };
12
+ }
13
+ catch {
14
+ cached = { name: 'maafw-live', version: '0.0.0' };
15
+ }
16
+ return cached;
17
+ }
18
+ //# sourceMappingURL=pkg.js.map
package/lib/pkg.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkg.js","sourceRoot":"","sources":["../src/pkg.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAQxC,IAAI,MAAM,GAAuB,IAAI,CAAA;AAErC,MAAM,UAAU,UAAU;IACxB,IAAI,MAAM;QAAE,OAAO,MAAM,CAAA;IACzB,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;QACpE,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAyB,CAAA;QACrE,MAAM,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IACtG,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,CAAA;IACnD,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
@@ -0,0 +1,90 @@
1
+ /** 信封结构版本。字段增删时递增,消费方可据此拒绝不认识的形状。 */
2
+ export const SCHEMA_VERSION = 1;
3
+ /**
4
+ * 退出码语义。
5
+ *
6
+ * 关键区分:`FAIL` 是「命令没跑成」,`FINDINGS` 是「跑成了,但发现了问题」。
7
+ * 技能与 CI 必须能分开这两种情况——reco 识别未命中不是执行失败,
8
+ * 但也不该返回 0 让调用方以为一切正常。
9
+ */
10
+ export const EXIT = {
11
+ /** 命令正常完成,未发现问题 */
12
+ OK: 0,
13
+ /** 命令自身失败(未预期异常、IO 错误) */
14
+ FAIL: 1,
15
+ /** 参数 / 用法错误 */
16
+ USAGE: 2,
17
+ /** 命令正常跑完,但发现了问题(reco 未命中、run 调用级失败、观测类命令的警告等) */
18
+ FINDINGS: 3,
19
+ /** 前置环境缺失(缺 maa-node / 缺 checkout / 缺设备) */
20
+ ENV: 4,
21
+ };
22
+ export function toEnvelope(command, r) {
23
+ return {
24
+ schemaVersion: SCHEMA_VERSION,
25
+ command,
26
+ ok: r.exitCode === EXIT.OK || r.exitCode === EXIT.FINDINGS,
27
+ exitCode: r.exitCode,
28
+ root: r.root ?? null,
29
+ written: r.written ?? [],
30
+ removed: r.removed ?? [],
31
+ skipped: r.skipped ?? [],
32
+ pending: r.pending ?? [],
33
+ suggestedCommands: r.suggestedCommands ?? [],
34
+ warnings: r.warnings ?? [],
35
+ data: r.data ?? null,
36
+ error: r.error ?? null,
37
+ };
38
+ }
39
+ const ANSI = {
40
+ reset: '\u001b[0m',
41
+ dim: '\u001b[2m',
42
+ red: '\u001b[31m',
43
+ yellow: '\u001b[33m',
44
+ green: '\u001b[32m',
45
+ cyan: '\u001b[36m',
46
+ };
47
+ function paint(text, code, on) {
48
+ return on ? code + text + ANSI.reset : text;
49
+ }
50
+ /**
51
+ * 输出命令结果。
52
+ *
53
+ * --json 时只输出信封(stdout 保持纯 JSON,可被管道解析);
54
+ * 否则输出命令自己的 human 渲染 + 警告 + 建议命令。
55
+ * 错误与警告一律走 stderr,避免污染 stdout 的 JSON。
56
+ */
57
+ export function emit(command, r, o) {
58
+ if (o.json) {
59
+ process.stdout.write(JSON.stringify(toEnvelope(command, r), null, 2) + '\n');
60
+ return;
61
+ }
62
+ for (const line of r.human ?? [])
63
+ process.stdout.write(line + '\n');
64
+ for (const w of r.warnings ?? []) {
65
+ process.stderr.write(paint('warning: ', ANSI.yellow, o.color) + w + '\n');
66
+ }
67
+ if (r.error) {
68
+ process.stderr.write(paint('error: ', ANSI.red, o.color) + r.error.message +
69
+ paint(' [' + r.error.code + ']', ANSI.dim, o.color) + '\n');
70
+ if (r.error.hint) {
71
+ process.stderr.write(paint(' hint: ' + r.error.hint, ANSI.dim, o.color) + '\n');
72
+ }
73
+ }
74
+ if (r.pending?.length) {
75
+ process.stdout.write('\n待办:\n');
76
+ for (const p of r.pending)
77
+ process.stdout.write(' - ' + p + '\n');
78
+ }
79
+ if (r.suggestedCommands?.length) {
80
+ process.stdout.write('\n建议下一步:\n');
81
+ for (const c of r.suggestedCommands) {
82
+ process.stdout.write(' ' + paint(c, ANSI.cyan, o.color) + '\n');
83
+ }
84
+ }
85
+ }
86
+ /** 失败结果的快捷构造 */
87
+ export function fail(code, message, hint, exitCode = EXIT.FAIL) {
88
+ return { exitCode, error: { code, message, ...(hint ? { hint } : {}) } };
89
+ }
90
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * 运行时动作层:把 daemon 的 JSON 行命令包成有类型、有超时、有默认值的函数。
3
+ *
4
+ * 命令(`src/commands/*`)与 `maafw-live repl` 都只调这一层——同一条链路上不允许出现第二份
5
+ * 参数拼装逻辑,否则 CLI 与 REPL 会各长出一套规则。项目(interface.json)驱动的连接与运行
6
+ * 也在这里收口,避免"手动连 vs 项目连"两条路径对资源与坐标系的解释分叉。
7
+ */
8
+ import { tmpdir } from 'node:os';
9
+ import { join } from 'node:path';
10
+ import { rmSync } from 'node:fs';
11
+ import { loadInterface, planController, resolveResourcePaths, } from '../interface/index.js';
12
+ import { spawnDaemon } from '../client/daemon.js';
13
+ /** 起一个 daemon、跑 fn、无论如何都收掉子进程。一次性命令用它,REPL 用长活客户端。 */
14
+ export async function withDaemon(fn, options = {}) {
15
+ const client = spawnDaemon(options);
16
+ try {
17
+ return await fn(client);
18
+ }
19
+ finally {
20
+ client.close();
21
+ }
22
+ }
23
+ /* ─────────────────────────── 直通命令 ─────────────────────────── */
24
+ export const probe = (c) => c.call('probe', {}, 30000);
25
+ export const deviceList = (c, kind = 'all') => c.call('device_list', { kind }, 40000);
26
+ export const connect = (c, args) => c.call('connect', args, 40000);
27
+ export const disconnect = (c) => c.call('disconnect', {}, 20000);
28
+ export const screencap = (c, out) => c.call('screencap', out ? { out } : {}, 30000);
29
+ /**
30
+ * 一次性命令的"先产生一次观测":截一帧进 daemon 的 L0,然后**把临时文件删掉**。
31
+ *
32
+ * 为什么需要这一帧:L0 是进程态,一次性命令(`crop` / `annotate` / `color`)每次 spawn 自己的
33
+ * daemon,不先截一帧就没有原图可用。为什么必须删:daemon 收帧时就把像素读进缓冲了,
34
+ * 落盘那份只为喂它一次——不删就是每跑一次在系统临时目录留一张 720p 截图(实测攒到 42 张 / 54MB)。
35
+ * 失败不抛:没有观测时命令自己会报"先 screencap / stream"这类可行动的错。
36
+ */
37
+ export async function seedObservation(c, prefix) {
38
+ const file = join(tmpdir(), 'maafw_' + prefix + '_' + Date.now() + '.png');
39
+ try {
40
+ await screencap(c, file).catch(() => null);
41
+ }
42
+ finally {
43
+ try {
44
+ rmSync(file, { force: true });
45
+ }
46
+ catch { /* ignore */ }
47
+ }
48
+ }
49
+ export const streamStart = (c, args = {}) => c.call('stream_start', args, 15000);
50
+ export const streamStop = (c) => c.call('stream_stop', {}, 10000);
51
+ export const streamStatus = (c) => c.call('stream_status', {}, 10000);
52
+ export const frameGet = (c, args) => c.call('frame_get', args, 30000);
53
+ /** 等状态谓词成立:stable=画面静下来 / change=画面动了。取代调用方硬睡时钟。 */
54
+ export const waitState = (c, args = {}) => c.call('wait', args, Math.min(120000, Number(args.timeout ?? 10000)) + 5000);
55
+ /** 两帧在若干 ROI 上的差分:回答"这一步改了哪几格"。 */
56
+ export const frameDiff = (c, args) => c.call('frame_diff', args, 30000);
57
+ export const colorProbe = (c, args) => c.call('color_probe', args, 15000);
58
+ export const tplCrop = (c, args) => c.call('tpl_crop', args, 240000);
59
+ export const annotate = (c, args) => c.call('annotate', args, 120000);
60
+ export const calibrate = (c, args = {}) => c.call('calibrate', args, 120000);
61
+ export const runStop = (c) => c.call('run_stop', {}, 10000);
62
+ export const l0Status = (c) => c.call('l0_status', {}, 10000);
63
+ export const kfPromote = (c, args) => c.call('kf_promote', args, 30000);
64
+ export function run(c, args, timeoutMs = 30000) {
65
+ /* timeoutMs=0 = 不自动停(停止权交调用方):客户端调用超时放到 24h 档。
66
+ * 不用 Infinity——Node 的 setTimeout 上限 2^31-1,超限会立即触发,反而误杀。 */
67
+ const t = Number(timeoutMs);
68
+ const budget = t === 0 ? 86400000 : Math.min(86400000, Math.max(500, t || 30000));
69
+ return c.call('run', { ...args, timeoutMs: t === 0 ? 0 : budget }, budget + 15000);
70
+ }
71
+ export const input = (c, payload, timeoutMs = 20000) => c.call('input', payload, timeoutMs);
72
+ export const recoTest = (c, args) => c.call('reco_test', args, 90000);
73
+ /* ─────────────────────── 项目(interface.json)驱动 ─────────────────────── */
74
+ /** 控制器类型 → 需要扫描的设备类型。控制器没声明时按第一个控制器推断。 */
75
+ export function deviceKindFor(loaded, controllerName) {
76
+ const c = controllerName ? loaded.controllers.find((x) => x.name === controllerName) : loaded.controllers[0];
77
+ return String(c?.type) === 'Adb' ? 'adb' : 'win32';
78
+ }
79
+ /**
80
+ * 载入项目 → 扫设备 → 规划控制器 → 解析资源路径。
81
+ *
82
+ * 为什么不猜设备:interface.json 的 controller[] 已经声明了 Adb/Win32、窗口类名与标题正则、
83
+ * 截图与输入方法、以及识别缩放(display_short_side)——猜错不只是连错窗口,还会把 roi 与
84
+ * 模板的坐标系一起猜错。interface.json 的读法只有 src/interface/ 一份,别处不许再解析一遍。
85
+ */
86
+ export async function planProject(c, dir, overrides = {}) {
87
+ const loaded = loadInterface(dir);
88
+ if (!loaded.file) {
89
+ return { loaded, plan: null, controllerName: null, resource: null, error: loaded.problems[0]?.message ?? '未找到 interface.json' };
90
+ }
91
+ const controllerName = overrides.controller ?? loaded.controllers[0]?.name ?? null;
92
+ const kind = deviceKindFor(loaded, controllerName);
93
+ let devices = [];
94
+ try {
95
+ devices = await deviceList(c, kind);
96
+ }
97
+ catch (e) {
98
+ return { loaded, plan: null, controllerName, resource: null, error: '扫描设备失败:' + String(e.message || e) };
99
+ }
100
+ const plan = planController(loaded, {
101
+ controller: controllerName ?? undefined,
102
+ win32: { hwnd: overrides.hwnd ?? null },
103
+ gamepad: { hwnd: overrides.gamepadHwnd ?? null },
104
+ adb: { address: overrides.address ?? null },
105
+ manualTarget: overrides.manualTarget ?? null,
106
+ }, devices);
107
+ const resource = resolveResourcePaths(loaded, controllerName ?? undefined, overrides.resource);
108
+ return { loaded, plan, controllerName, resource };
109
+ }
110
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/runtime/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * 关键帧库的离线读侧:list / resolve 不依赖 daemon 存活(契约 §4.1)。
3
+ *
4
+ * manifest 格式与 daemon/framed.mjs 的写入侧一一对应:
5
+ * { schema:1, libraryId, next, frames:[{ id, file, sha256, session, capturedAt,
6
+ * captureSeq, ctrlW, ctrlH, smallW, smallH, scale, source, note }] }
7
+ * 写侧(升格)在 daemon;本模块只读,两个消费方(CLI kf、REPL kf)共用,不出现第二份解析。
8
+ */
9
+ import { createHash } from 'node:crypto';
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { homedir } from 'node:os';
12
+ import { join } from 'node:path';
13
+ export const KF_SCHEMA = 1;
14
+ export function defaultFramesDir() {
15
+ return join(homedir(), '.maafw-live', 'frames');
16
+ }
17
+ /** 读 manifest。坏文件/未知 schema 明确报错,不默认为当前版。 */
18
+ export function loadManifest(dir) {
19
+ const file = join(dir, 'manifest.json');
20
+ if (!existsSync(file))
21
+ return {};
22
+ let raw;
23
+ try {
24
+ raw = JSON.parse(readFileSync(file, 'utf8'));
25
+ }
26
+ catch (e) {
27
+ return { error: 'manifest.json 损坏(非合法 JSON):' + String(e.message) };
28
+ }
29
+ const m = raw;
30
+ if (!m || typeof m !== 'object' || !Array.isArray(m.frames)) {
31
+ return { error: 'manifest.json 结构不符(缺 frames 数组)' };
32
+ }
33
+ if (m.schema !== KF_SCHEMA) {
34
+ return { error: 'manifest schema=' + String(m.schema) + ' 不被当前版本支持(认识:' + KF_SCHEMA + ')' };
35
+ }
36
+ return { manifest: m };
37
+ }
38
+ /** 按完整 ID 帧解析:available 时给出经过完整性校验的路径;missing/corrupt/unsupported 各自可诊断。 */
39
+ export function resolveFrame(dir, id) {
40
+ /* 非字符串 id(缺字段、拼错的调用方)也走"不可复核"这条路,而不是抛 TypeError——
41
+ * 解析函数的契约是**如实报状态**,不该给调用方一个异常。 */
42
+ if (typeof id !== 'string' || !id.startsWith('kf:')) {
43
+ return { status: 'missing', reason: '要完整 ID:kf:<库UUID>:<序号>(裸序号只可作展示简称,不能跨库引用)' };
44
+ }
45
+ const { manifest, error } = loadManifest(dir);
46
+ if (error)
47
+ return { status: 'unsupported', reason: error };
48
+ if (!manifest)
49
+ return { status: 'missing', reason: '库内无 manifest(本机不可复核,不代表历史从未观测)' };
50
+ const rec = manifest.frames.find((f) => f.id === id);
51
+ if (!rec)
52
+ return { status: 'missing', reason: 'manifest 无此 ID 记录' };
53
+ const abs = join(dir, ...rec.file.split('/'));
54
+ if (!existsSync(abs))
55
+ return { status: 'missing', record: rec, reason: 'L0 文件丢失' };
56
+ let sha = '';
57
+ try {
58
+ sha = createHash('sha256').update(readFileSync(abs)).digest('hex');
59
+ }
60
+ catch (e) {
61
+ return { status: 'corrupt', record: rec, reason: '读取失败:' + String(e.message) };
62
+ }
63
+ if (sha !== rec.sha256)
64
+ return { status: 'corrupt', record: rec, reason: 'sha256 不匹配(文件损坏或被改)' };
65
+ return { status: 'available', record: rec, path: abs };
66
+ }
67
+ /** list 用:一行人类可读摘要(与 --json 的 data 各自完整,不共用裁剪)。 */
68
+ export function describeRecord(r) {
69
+ const dt = r.capturedAt ? r.capturedAt.replace('T', ' ').replace(/\.\d+Z$/, 'Z') : '?';
70
+ return r.id + ' seq=' + r.captureSeq + ' ' + r.ctrlW + 'x' + r.ctrlH + ' ' + dt + ' [' + r.source + ']' +
71
+ (r.note ? ' ' + r.note : '');
72
+ }
73
+ //# sourceMappingURL=keyframes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keyframes.js","sourceRoot":"","sources":["../../src/runtime/keyframes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import { loadInterface, resolveResourcePaths } from '../interface/index.js';
2
+ import { planProject, connect } from './actions.js';
3
+ export class SessionError extends Error {
4
+ code;
5
+ constructor(message, code) {
6
+ super(message);
7
+ this.code = code;
8
+ this.name = 'SessionError';
9
+ }
10
+ }
11
+ /** 需要设备时连一次;项目模式下先规划控制器再连(拒绝猜设备)。 */
12
+ export async function ensureSession(client, o) {
13
+ if (!o.project && !o.kind)
14
+ return { connected: false };
15
+ if (o.project) {
16
+ const planned = await planProject(client, o.project, {
17
+ controller: o.controller,
18
+ hwnd: o.hwnd,
19
+ address: o.address,
20
+ resource: o.resource,
21
+ manualTarget: o.target ?? undefined,
22
+ });
23
+ if (!planned.plan)
24
+ throw new SessionError(planned.error ?? '控制器规划失败', 'PLAN_FAILED');
25
+ if (!planned.plan.ok) {
26
+ const cands = (planned.plan.candidates ?? []).map((d) => d.name || d.id).slice(0, 10);
27
+ throw new SessionError(planned.plan.error + (cands.length ? '(候选:' + cands.join(' / ') + ')' : ''), planned.plan.code || 'PLAN_FAILED');
28
+ }
29
+ const conn = await connect(client, { ...planned.plan.connect });
30
+ if (conn && conn.ok === false)
31
+ throw new SessionError(conn.error ?? '连接失败', 'CONNECT_FAILED');
32
+ return {
33
+ connected: true, plan: planned, session: conn.session ?? null, notes: planned.plan.notes,
34
+ ...(conn.streamStopped === true ? { streamStopped: true } : {}),
35
+ };
36
+ }
37
+ const conn = await connect(client, {
38
+ kind: o.kind,
39
+ ...(o.target ? { target: o.target } : {}),
40
+ ...(o.shortSide ? { shortSide: o.shortSide } : {}),
41
+ ...(o.longSide ? { longSide: o.longSide } : {}),
42
+ ...(o.rawSize ? { rawSize: true } : {}),
43
+ });
44
+ if (conn && conn.ok === false)
45
+ throw new SessionError(conn.error ?? '连接失败', 'CONNECT_FAILED');
46
+ return {
47
+ connected: true, session: conn.session ?? null,
48
+ ...(conn.streamStopped === true ? { streamStopped: true } : {}),
49
+ };
50
+ }
51
+ /**
52
+ * 离线资源解析:只读 interface.json 拿资源目录,不扫设备、不连接。
53
+ *
54
+ * 为什么需要它:从关键帧库留存帧裁模板这条动线**不需要设备**(这正是"不可复现状态"的意义——
55
+ * 设备早已不在那个画面上)。但自匹配要加载资源,而资源声明在项目里。项目此刻只是资源的
56
+ * 来源,不是连接的对象,所以走 interface 的规划函数而不走 planProject(后者要扫设备)。
57
+ */
58
+ export function offlineResource(project, controller, resource) {
59
+ const loaded = loadInterface(project);
60
+ if (!loaded.file) {
61
+ return { paths: [], controllerName: null, error: loaded.problems[0]?.message ?? '未找到 interface.json' };
62
+ }
63
+ const controllerName = controller ?? loaded.controllers[0]?.name ?? null;
64
+ const plan = resolveResourcePaths(loaded, controllerName ?? undefined, resource);
65
+ return { paths: plan.paths, controllerName };
66
+ }
67
+ /** 连接结果的行渲染(human 输出与 --json 共用一份事实)。 */ export function describeSession(s) {
68
+ const lines = [];
69
+ if (!s.connected)
70
+ return lines;
71
+ const sess = s.session ?? {};
72
+ lines.push('已连接:' + String(sess.kind ?? '?') + ' ' + String(sess.target ?? '') +
73
+ (sess.name ? ' (' + String(sess.name) + ')' : ''));
74
+ const res = sess.resolution;
75
+ if (res && res.w)
76
+ lines.push(' 分辨率:' + res.w + 'x' + res.h);
77
+ if (s.plan) {
78
+ lines.push(' 控制器:' + s.plan.controllerName + '(来自 interface.json)');
79
+ if (s.plan.resource?.paths.length)
80
+ lines.push(' 资源:' + s.plan.resource.paths.join(' , '));
81
+ }
82
+ for (const n of s.notes ?? [])
83
+ lines.push(' note: ' + n);
84
+ return lines;
85
+ }
86
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/runtime/session.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAoB,MAAM,cAAc,CAAA;AA4BrE,MAAM,OAAO,YAAa,SAAQ,KAAK;IACC;IAAtC,YAAY,OAAe,EAAW,IAAY;QAChD,KAAK,CAAC,OAAO,CAAC,CAAA;QADsB,SAAI,GAAJ,IAAI,CAAQ;QAEhD,IAAI,CAAC,IAAI,GAAG,cAAc,CAAA;IAC5B,CAAC;CACF;AAED,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAoB,EAAE,CAAiB;IACzE,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;IAEtD,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;YACnD,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,YAAY,EAAE,CAAC,CAAC,MAAM,IAAI,SAAS;SACpC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,KAAK,IAAI,SAAS,EAAE,aAAa,CAAC,CAAA;QACpF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACrF,MAAM,IAAI,YAAY,CACpB,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAC3E,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,aAAa,CACnC,CAAA;QACH,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/D,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK;YAAE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,gBAAgB,CAAC,CAAA;QAC7F,OAAO;YACL,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK;YACxF,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAA;IACH,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;QACjC,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/C,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC,CAAA;IACF,IAAI,IAAI,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK;QAAE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,IAAI,MAAM,EAAE,gBAAgB,CAAC,CAAA;IAC7F,OAAO;QACL,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;QAC9C,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAe,EACf,UAAmB,EACnB,QAAiB;IAEjB,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;IACrC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,IAAI,oBAAoB,EAAE,CAAA;IACxG,CAAC;IACD,MAAM,cAAc,GAAG,UAAU,IAAI,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAA;IACxE,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,cAAc,IAAI,SAAS,EAAE,QAAQ,CAAC,CAAA;IAChF,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,CAAA;AAC9C,CAAC;AAED,yCAAyC,CAAA,MAAM,UAAU,eAAe,CAAC,CAAe;IACtF,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,KAAK,CAAA;IAC9B,MAAM,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAA;IAC5B,KAAK,CAAC,IAAI,CACR,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QACjE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CACpD,CAAA;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,UAA2D,CAAA;IAC5E,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IAC5D,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAAA;QACpE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5F,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAA;IACzD,OAAO,KAAK,CAAA;AACd,CAAC"}
@@ -0,0 +1,86 @@
1
+ /** 帧元数据(像素默认不出 daemon;预览帧落盘后给路径)。 */
2
+ export interface FrameMeta {
3
+ seq: number;
4
+ t: number;
5
+ diff?: number;
6
+ w?: number;
7
+ h?: number;
8
+ preview?: string;
9
+ }
10
+ /** 帧流事件:画面变化/稳定,以及 Tasker 的节点级消息(按帧序对齐)。 */
11
+ export interface StreamEvent {
12
+ type: string;
13
+ seq?: number;
14
+ t: number;
15
+ diff?: number;
16
+ node?: string | null;
17
+ msg?: string;
18
+ id?: number | string | null;
19
+ }
20
+ export interface DaemonEvents {
21
+ frames: FrameMeta[];
22
+ events: StreamEvent[];
23
+ /** 流级异常与通知:`stream_error`(设备掉线等)与 `stream_stopped`(控制器销毁导致流被停) */
24
+ errors: string[];
25
+ logs: string[];
26
+ /** 最新预览帧路径(daemon 收到 init 的 runDir 后写入 runDir/preview.png) */
27
+ preview: string | null;
28
+ }
29
+ /**
30
+ * daemon 推送的消息种类。`subscribe` 的回调按种类拿不同载荷:
31
+ * `frame` → FrameMeta、`event` → StreamEvent、`stream_error` → 错误文本、`stream_stopped` → 停流原因。
32
+ */
33
+ export type DaemonMessageKind = 'frame' | 'event' | 'stream_error' | 'stream_stopped';
34
+ /** `init` 的回执:daemon 身份与落点(客户端 spawn 后立刻握手的那一次)。 */
35
+ export interface DaemonInit {
36
+ previewPath: string | null;
37
+ daemonId: string;
38
+ framesDir: string;
39
+ kfQuota: number;
40
+ }
41
+ /**
42
+ * 握手结果。**失败不抛异常**:老实现用 `id:-1` 发出去就不管,回执在分发链里被丢弃,
43
+ * init 失败无从得知;现在如实回报,同时不把"daemon 不回 init"变成调用方的致命错误
44
+ * (协议要求每条请求都有应答,但客户端不该因为对方没回一条就全盘不进)。
45
+ */
46
+ export type DaemonInitResult = {
47
+ ok: true;
48
+ data: DaemonInit;
49
+ } | {
50
+ ok: false;
51
+ error: string;
52
+ };
53
+ export interface DaemonClient {
54
+ readonly events: DaemonEvents;
55
+ /** spawn 后那次 `init` 握手的回执(framesDir / daemonId / kfQuota);需要时才会 spawn daemon。 */
56
+ init(): Promise<DaemonInitResult>;
57
+ /** 发一条命令并等应答;超时会硬杀 daemon(下次调用自动重生)。 */
58
+ call<T = unknown>(cmd: string, args?: Record<string, unknown>, timeoutMs?: number): Promise<T>;
59
+ /** daemon stderr + 非 JSON stdout 行(maa 原生日志,识别失败根因常在这)。 */
60
+ logTail(n?: number): string[];
61
+ /** 订阅帧/事件/流错误/流停止;返回退订函数。 */
62
+ subscribe(kind: DaemonMessageKind, cb: (message: unknown) => void): () => void;
63
+ stats(): {
64
+ calls: number;
65
+ restarts: number;
66
+ alive: boolean;
67
+ pid: number | null;
68
+ daemonPath: string;
69
+ };
70
+ /** 停流 + 断开 + 结束子进程。 */
71
+ close(): void;
72
+ }
73
+ export interface SpawnOptions {
74
+ /** 预览帧与临时产物的目录;默认 ~/.maafw-live */
75
+ runDir?: string;
76
+ /** 显式 daemon 路径;默认包内 lib/daemon/framed.mjs,可用 MAA_DAEMON 覆盖 */
77
+ daemonPath?: string;
78
+ /** 默认调用超时 */
79
+ timeoutMs?: number;
80
+ /** 关键帧库磁盘配额(字节,>0 生效;缺省 1GiB,daemon 侧 env MAAFW_KF_QUOTA_BYTES 亦可覆盖) */
81
+ kfQuotaBytes?: number;
82
+ }
83
+ export declare function defaultRunDir(): string;
84
+ /** 定位 daemon 脚本:显式参数 → MAA_DAEMON → 包内 lib/daemon/framed.mjs。 */
85
+ export declare function resolveDaemonPath(explicit?: string): string;
86
+ export declare function spawnDaemon(options?: SpawnOptions): DaemonClient;
@@ -0,0 +1,3 @@
1
+ import { type Command } from '../protocol.js';
2
+ export declare const annotateCommand: Command;
3
+ export declare const ANNOTATE_COMMANDS: Command[];
@@ -0,0 +1,7 @@
1
+ /**
2
+ * 变化检测阈值校准:静止画面采帧,统计分块亮度差 / 全局位差率的噪声分布,
3
+ * 推荐 blockThresh / changeGlobal。校准期间画面必须静止(max≫p99 会警告重跑)。
4
+ */
5
+ import { type Command } from '../protocol.js';
6
+ export declare const calibrateCommand: Command;
7
+ export declare const CALIBRATE_COMMANDS: Command[];
@@ -0,0 +1,9 @@
1
+ /**
2
+ * 探色命令:ROI 实测主色/均值(RGB/HSV/灰度)——模型只选色不报色值。
3
+ *
4
+ * 为什么不靠模型读像素:色值必须来自实测(降采样小图按该帧捕获尺寸换算后的 ROI),
5
+ * 模型选完色后用 reco ColorMatch 出框(走已修好的参数透传链),出框与否是事实不是判断。
6
+ */
7
+ import { type Command } from '../protocol.js';
8
+ export declare const colorCommand: Command;
9
+ export declare const COLOR_COMMANDS: Command[];
@@ -0,0 +1,3 @@
1
+ import { type Command } from '../protocol.js';
2
+ export declare const cropCommand: Command;
3
+ export declare const CROP_COMMANDS: Command[];
@@ -0,0 +1,2 @@
1
+ import { type Command } from '../protocol.js';
2
+ export declare const envCommand: Command;
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 命令注册表。
3
+ *
4
+ * 只注册**已经实现且能跑通**的命令。未实现的能力不在这里挂空壳,也不进 `--help`——
5
+ * 挂空壳会让 `maafw <cmd>` 的失败原因从「没这个命令」变成「没实现」,技能无法区分;
6
+ * help 描述未来就会过期撒谎,只描述现状。
7
+ */
8
+ import type { Command } from '../protocol.js';
9
+ /** 展示顺序:探针 → 运行时/设备 → 输入 → 识别 → 探色 → 裁剪 → SoM → 校准 → 关键帧 → timing → 会话 → skill 自检。 */
10
+ export declare const COMMANDS: Command[];
11
+ export declare function findCommand(name: string): Command | undefined;
12
+ /** 未知命令时给出「最接近的名字」建议(编辑距离),避免用户猜 */
13
+ export declare function suggestCommand(name: string, maxDistance?: number): string | undefined;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * 输入注入命令:click / swipe / key / text。
3
+ *
4
+ * 全部经 maafw 控制器本体注入(不直接调 adb),坐标是控制器分辨率空间——默认短边 720,
5
+ * 与 pipeline 里 roi / 模板图同一坐标系。要设备就必须给 --project(推荐)或 --kind。
6
+ */
7
+ import { type Command } from '../protocol.js';
8
+ export declare const clickCommand: Command;
9
+ export declare const swipeCommand: Command;
10
+ export declare const keyCommand: Command;
11
+ export declare const keysCommand: Command;
12
+ export declare const pressCommand: Command;
13
+ export declare const dbclickCommand: Command;
14
+ export declare const scrollCommand: Command;
15
+ export declare const moveCommand: Command;
16
+ export declare const textCommand: Command;
17
+ export declare const INPUT_COMMANDS: Command[];
@@ -0,0 +1,10 @@
1
+ /**
2
+ * 关键帧命令:kf status / kf promote / kf list / kf resolve。
3
+ *
4
+ * 升格(promote)是 daemon 内存操作——从 L0 缓存取原图落盘并登记,必须在捕获它的那个
5
+ * daemon 会话里做( REPL 里 stream/输入/run 之后立刻升格,"看到即升格,不攒到最后")。
6
+ * list / resolve 是纯离线文件操作,不依赖 daemon 存活(契约 §4.1)。
7
+ */
8
+ import { type Command } from '../protocol.js';
9
+ export declare const kfCommand: Command;
10
+ export declare const KF_COMMANDS: Command[];
@@ -0,0 +1,23 @@
1
+ /**
2
+ * 识别单测:maafw-live reco。
3
+ *
4
+ * 走 daemon 的 reco_test —— 它把识别放进一次性子进程执行(beta 绑定在无效模板上会原生崩溃,
5
+ * 子进程炸掉只损失一次测试,不带走调用方)。支持阈值扫描:一次调用给出阈值-命中曲线。
6
+ * 项目模式下资源目录从 interface.json 解析,避免手写路径与项目声明不一致。
7
+ */
8
+ import { type Command } from '../protocol.js';
9
+ /** threshold 起点建议(maafw-pipeline 技能口径):实测最高置信度 − 0.1 留余量,换场景会掉。
10
+ * 得分在识别详情内层(detail.detail.best/all——miss 时 best 为 null,all 仍带各候选得分);
11
+ * 无数值得分的类型(OCR 等)返回 null,不编造。低于 0.5 视为模板与画面不匹配:
12
+ * 未命中不是调低阈值的理由,建议不适用。 */
13
+ export interface ThresholdSuggestion {
14
+ bestScore: number;
15
+ suggest: number | null;
16
+ lowMatch: boolean;
17
+ }
18
+ export declare function suggestThreshold(results: Array<{
19
+ ok: boolean;
20
+ detail?: unknown;
21
+ }>): ThresholdSuggestion | null;
22
+ export declare const recoCommand: Command;
23
+ export declare const RECO_COMMANDS: Command[];