superun-ai-cli 0.1.28 → 0.1.30

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,83 @@
1
+ /** 从宿主身份和会话归属恢复根会话,不用工作目录代替会话。@author xiuyu.yi */
2
+ import { open, readdir, realpath } from 'node:fs/promises';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ const validId = (value) => !!value && /^[a-zA-Z0-9_-]{1,200}$/.test(value);
6
+ /** 只解析首条消息的身份,不使用对话正文,也不在所有项目里搜索最近记录。 */
7
+ async function transcriptSession(path) {
8
+ let file;
9
+ try {
10
+ file = await open(path, 'r');
11
+ const buffer = Buffer.alloc(1024 * 1024);
12
+ const { bytesRead } = await file.read(buffer, 0, buffer.length, 0);
13
+ const value = buffer.toString('utf8', 0, bytesRead);
14
+ const end = value.indexOf('\n');
15
+ if (end < 0 && bytesRead === buffer.length)
16
+ return undefined;
17
+ const record = JSON.parse(end < 0 ? value : value.slice(0, end));
18
+ return validId(record.sessionId) ? record.sessionId : undefined;
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ finally {
24
+ await file?.close();
25
+ }
26
+ }
27
+ async function directories(path) {
28
+ try {
29
+ return (await readdir(path, { withFileTypes: true }))
30
+ .filter((entry) => entry.isDirectory() && validId(entry.name))
31
+ .map((entry) => entry.name);
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ export async function detectHostContext(env = process.env) {
38
+ if (env.CODEBUDDY_SESSION_ID) {
39
+ const id = env.CODEBUDDY_SESSION_ID;
40
+ const project = env.CODEBUDDY_PROJECT_DIR;
41
+ if (!validId(id) || !project)
42
+ return undefined;
43
+ // 与宿主 PathUtils 一致;路径仅用于定位元数据,必须再匹配实际会话 ID。
44
+ const canonical = await realpath(project).catch(() => project);
45
+ const compressed = canonical
46
+ .replace(/[/\\:]/g, '-')
47
+ .replace(/^-+|-+$/g, '')
48
+ .replace(/-+/g, '-');
49
+ const roots = env.CODEBUDDY_CONFIG_DIR
50
+ ? [env.CODEBUDDY_CONFIG_DIR]
51
+ : [join(homedir(), '.workbuddy'), join(homedir(), '.codebuddy')];
52
+ const matches = new Set();
53
+ for (const root of roots) {
54
+ const directory = join(root, 'projects', compressed);
55
+ if ((await transcriptSession(join(directory, `${id}.jsonl`))) === id)
56
+ matches.add(id);
57
+ // WorkBuddy 为子专家注入子会话 ID,子专家记录位于主会话的 subagents 目录。
58
+ for (const parent of await directories(directory)) {
59
+ const children = join(directory, parent, 'subagents');
60
+ let files;
61
+ try {
62
+ files = await readdir(children);
63
+ }
64
+ catch {
65
+ continue;
66
+ }
67
+ for (const file of files.filter((name) => /^agent-[a-zA-Z0-9_-]+\.jsonl$/.test(name))) {
68
+ if ((await transcriptSession(join(children, file))) !== id)
69
+ continue;
70
+ if ((await transcriptSession(join(directory, `${parent}.jsonl`))) === parent)
71
+ matches.add(parent);
72
+ }
73
+ }
74
+ }
75
+ if (matches.size === 1)
76
+ return { host: 'codebuddy', conversationId: [...matches][0] };
77
+ return undefined;
78
+ }
79
+ if (validId(env.CODEX_THREAD_ID))
80
+ return { host: 'codex', conversationId: env.CODEX_THREAD_ID };
81
+ return undefined;
82
+ }
83
+ //# sourceMappingURL=host-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host-context.js","sourceRoot":"","sources":["../../src/session/host-context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "superun-ai-cli",
3
- "version": "0.1.28",
3
+ "version": "0.1.30",
4
4
  "description": "通过需求梳理、架构设计与开发协作,将网站和应用的想法转化为可持续迭代、可部署运维的生产级系统。",
5
5
  "author": "xiuyu.yi",
6
6
  "license": "UNLICENSED",
@@ -34,6 +34,8 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "commander": "14.0.0",
37
+ "image-dimensions": "2.5.0",
38
+ "mediainfo.js": "0.3.5",
37
39
  "semver": "7.7.2",
38
40
  "zod": "3.25.76"
39
41
  },