superun-ai-cli 0.1.29 → 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.
package/README.en.md CHANGED
@@ -78,9 +78,12 @@ superun-ai
78
78
  │ ├── login # Sign in and save a PAT
79
79
  │ ├── status # Check local PAT configuration
80
80
  │ └── logout # Remove the locally saved PAT
81
- ├── session # Query projects
81
+ ├── session # Query projects and conversation binding
82
82
  │ ├── list # List projects
83
- │ └── get <sessionId> # Get project details
83
+ │ ├── get <sessionId> # Get project details
84
+ │ ├── current # Read the saved project for this host conversation
85
+ │ ├── use <sessionId> # Select a project for this conversation
86
+ │ └── clear # Clear the local binding and keep the remote project
84
87
  ├── chat # Conversational creation
85
88
  │ ├── create # Create a project and send a request
86
89
  │ ├── send <sessionId> # Continue the conversation
@@ -116,6 +119,22 @@ superun-ai
116
119
 
117
120
  Run `npm run docs:sync` after changing command registration to update both command trees. `npm run docs:check` validates their completeness; `prepack` also checks them before packaging.
118
121
 
122
+ ## Restore the project for this conversation
123
+
124
+ In Codex and WorkBuddy / CodeBuddy environments with a verifiable conversation identity, the CLI remembers one project per conversation. Creating a project or explicitly operating on another project replaces the binding. Listing projects, reading details, and waiting for tasks do not change it.
125
+
126
+ ```bash
127
+ superun-ai session current
128
+ superun-ai session use <sessionId>
129
+ superun-ai session clear
130
+ ```
131
+
132
+ `current` returns the saved `sessionId`. Use existing commands to read project details or continue with `chat send <sessionId>`. Use `use` when switching projects without starting work; `clear` removes only the local binding and keeps the remote project. You do not need to run `use` before every command.
133
+
134
+ Bindings survive reopening the same host conversation and are isolated by conversation, superun account, and endpoint. WorkBuddy subagents share the main task binding when their ownership can be verified. Bindings are local to this device.
135
+
136
+ `UNBOUND` means no project is selected. `UNAVAILABLE` means the host conversation cannot be identified; continue passing an explicit `sessionId`. For `CREATING` or `CREATE_UNKNOWN`, check the original creation request before creating again. Once you have confirmed the project ID, restore the binding with `use`.
137
+
119
138
  ## PAT login
120
139
 
121
140
  ```bash
package/README.md CHANGED
@@ -80,9 +80,12 @@ superun-ai
80
80
  │ ├── login # 登录 superun 并保存 PAT
81
81
  │ ├── status # 查看本地 PAT 配置状态
82
82
  │ └── logout # 清除本地 PAT
83
- ├── session # 查询项目
83
+ ├── session # 查询项目与当前会话绑定
84
84
  │ ├── list # 查询项目列表
85
- │ └── get <sessionId> # 查询项目详情
85
+ │ ├── get <sessionId> # 查询项目详情
86
+ │ ├── current # 读取当前宿主会话保存的项目绑定
87
+ │ ├── use <sessionId> # 选择当前会话继续使用的项目
88
+ │ └── clear # 清除当前会话的项目绑定,保留远端项目
86
89
  ├── chat # 对话创作
87
90
  │ ├── create # 新建项目并发送需求
88
91
  │ ├── send <sessionId> # 继续项目创作
@@ -118,6 +121,22 @@ superun-ai
118
121
 
119
122
  命令树以源码注册为准。新增或调整命令后执行 `npm run docs:sync` 同步中英文命令树;`npm run docs:check` 校验完整性。发包前的 `prepack` 同样执行校验,发现遗漏或过期参数时停止发包准备。
120
123
 
124
+ ## 恢复当前会话的项目
125
+
126
+ 在可识别会话归属的 Codex、WorkBuddy / CodeBuddy 环境中,CLI 会自动记住当前会话正在创作的一个项目。新建项目会替换原绑定;显式操作另一个项目也会切换。列出项目、查询详情或等待任务不会改变绑定。
127
+
128
+ ```bash
129
+ superun-ai session current
130
+ superun-ai session use <sessionId>
131
+ superun-ai session clear
132
+ ```
133
+
134
+ `current` 返回已保存的 `sessionId`。需要项目详情时,用该 ID 调用已有查询命令;继续创作仍使用 `chat send <sessionId>`。`use` 适用于只切换项目、暂不创作的情况;`clear` 只解除本地绑定,保留远端项目。平时无需在每次命令前执行 `use`。
135
+
136
+ 同一宿主会话重开后可恢复绑定,不同会话、superun 账号和连接环境分别保存。WorkBuddy 子专家在能核对主任务归属时共用主任务绑定。该记录保存在本机,不跨设备同步。
137
+
138
+ `UNBOUND` 表示尚未绑定;`UNAVAILABLE` 表示无法识别宿主会话,此时继续显式传入 `sessionId`。若返回 `CREATING` 或 `CREATE_UNKNOWN`,先核对原创建请求,不要重复创建;确认已有项目后可用 `use` 恢复绑定。
139
+
121
140
  ## PAT 登录
122
141
 
123
142
  ```bash
@@ -1,8 +1,43 @@
1
1
  import { registerList } from './list.js';
2
2
  import { registerGet } from './get.js';
3
+ import { runtime, sessionBinding } from '../shared.js';
4
+ import { CliError } from '../../output/exit-codes.js';
3
5
  export function registerSession(program, context) {
4
- const session = program.command('session').description('查询项目');
6
+ const session = program.command('session').description('查询项目与当前会话绑定');
5
7
  registerList(session, context);
6
8
  registerGet(session, context);
9
+ session
10
+ .command('current')
11
+ .description('读取当前宿主会话保存的项目绑定')
12
+ .action(async (_options, command) => {
13
+ const binding = await sessionBinding(context, await runtime(context, command));
14
+ context.output.write(binding
15
+ ? await binding.current()
16
+ : {
17
+ state: 'UNAVAILABLE',
18
+ reason: '宿主未提供可确认归属的会话身份,请继续显式传入 sessionId。',
19
+ });
20
+ });
21
+ session
22
+ .command('use <sessionId>')
23
+ .description('选择当前会话继续使用的项目')
24
+ .action(async (sessionId, _options, command) => {
25
+ const service = await runtime(context, command);
26
+ const binding = await sessionBinding(context, service);
27
+ if (!binding)
28
+ throw new CliError('INVALID_ARGUMENT', '宿主未提供可确认归属的会话身份,无法保存项目绑定');
29
+ await binding.select(service, sessionId);
30
+ context.output.write(await binding.current());
31
+ });
32
+ session
33
+ .command('clear')
34
+ .description('清除当前会话的项目绑定,保留远端项目')
35
+ .action(async (_options, command) => {
36
+ const binding = await sessionBinding(context, await runtime(context, command));
37
+ if (!binding)
38
+ throw new CliError('INVALID_ARGUMENT', '宿主未提供可确认归属的会话身份,无法清除项目绑定');
39
+ await binding.clear();
40
+ context.output.write(await binding.current());
41
+ });
7
42
  }
8
43
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/session/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,OAAuB;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/D,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/session/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAEtD,MAAM,UAAU,eAAe,CAAC,OAAgB,EAAE,OAAuB;IACvE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;IACtE,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC9B,OAAO;SACJ,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,iBAAiB,CAAC;SAC9B,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,OAAO;YACL,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE;YACzB,CAAC,CAAC;gBACE,KAAK,EAAE,aAAa;gBACpB,MAAM,EAAE,oCAAoC;aAC7C,CACN,CAAC;IACJ,CAAC,CAAC,CAAC;IACL,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,eAAe,CAAC;SAC5B,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QACrD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,OAAO;YACV,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC;QACrE,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACL,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,oBAAoB,CAAC;SACjC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/E,IAAI,CAAC,OAAO;YACV,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,0BAA0B,CAAC,CAAC;QACrE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -4,12 +4,15 @@ import { runtimeConfig } from '../config/runtime-config.js';
4
4
  import { CreationRuntime } from '../runtime.js';
5
5
  import type { OutputWriter } from '../output/writer.js';
6
6
  import type { JsonObject } from '../contracts/value.js';
7
+ import { SessionBinding } from '../session/binding.js';
7
8
  export type CommandContext = {
8
9
  output: OutputWriter;
9
10
  patStore: PatStore;
10
11
  signal: AbortSignal;
11
12
  makeRuntime?: (config: ReturnType<typeof runtimeConfig>, pat: string) => CreationRuntime;
12
13
  connection?: Promise<CredentialContext>;
14
+ sessionBinding?: Promise<SessionBinding | undefined>;
15
+ selectedSessionId?: string;
13
16
  };
14
17
  export type CredentialContext = {
15
18
  service: CreationRuntime;
@@ -18,6 +21,8 @@ export type CredentialContext = {
18
21
  /** 已有 PAT 直接复用;允许浏览器登录时自动补齐缺失的凭据。 */
19
22
  export declare function requireCredentials(context: CommandContext, command: Command, allowBrowser?: boolean): Promise<CredentialContext>;
20
23
  export declare function runtime(context: CommandContext, command: Command): Promise<CreationRuntime>;
24
+ /** 绑定归属仅在公共层识别一次;宿主未提供可靠身份时保留显式调用能力。 */
25
+ export declare function sessionBinding(context: CommandContext, service: CreationRuntime): Promise<SessionBinding | undefined>;
21
26
  export declare function positive(value: string): number;
22
27
  export declare function waitOptions(command: Command): {
23
28
  timeout?: number;
@@ -11,6 +11,8 @@ import { CreationRuntime } from '../runtime.js';
11
11
  import { CliError } from '../output/exit-codes.js';
12
12
  import { object, text } from '../contracts/value.js';
13
13
  import { creditCode } from '../conversation/insufficient-credits.js';
14
+ import { SessionBinding } from '../session/binding.js';
15
+ import { detectHostContext } from '../session/host-context.js';
14
16
  async function loadCredentialContext(context, command, allowBrowser) {
15
17
  const options = object(command.optsWithGlobals());
16
18
  const config = runtimeConfig({
@@ -34,8 +36,51 @@ export async function requireCredentials(context, command, allowBrowser = false)
34
36
  context.connection ??= loadCredentialContext(context, command, allowBrowser);
35
37
  return context.connection;
36
38
  }
39
+ // 统一声明会改变当前项目选择的操作;查询和等待默认不改变绑定。
40
+ const projectOperations = new Set([
41
+ 'send',
42
+ 'test',
43
+ 'review',
44
+ 'stop',
45
+ 'retry',
46
+ 'demo',
47
+ 'develop',
48
+ 'style generate',
49
+ 'style append',
50
+ 'style retry',
51
+ 'style select',
52
+ 'interaction reply',
53
+ 'interaction skip',
54
+ 'plugin enable',
55
+ 'plugin disable',
56
+ 'publish start',
57
+ 'publish visibility',
58
+ ]);
37
59
  export async function runtime(context, command) {
38
- return (await requireCredentials(context, command)).service;
60
+ const service = (await requireCredentials(context, command)).service;
61
+ const path = [];
62
+ let parent = command;
63
+ while (parent?.parent && parent.name() !== 'chat') {
64
+ path.unshift(parent.name());
65
+ parent = parent.parent;
66
+ }
67
+ const sessionId = command.processedArgs[0];
68
+ if (parent?.name() === 'chat' && projectOperations.has(path.join(' ')) && typeof sessionId === 'string')
69
+ await selectSession(context, service, sessionId);
70
+ return service;
71
+ }
72
+ async function selectSession(context, service, sessionId) {
73
+ if (context.selectedSessionId === sessionId)
74
+ return;
75
+ const binding = await sessionBinding(context, service);
76
+ if (binding)
77
+ await binding.select(service, sessionId);
78
+ context.selectedSessionId = sessionId;
79
+ }
80
+ /** 绑定归属仅在公共层识别一次;宿主未提供可靠身份时保留显式调用能力。 */
81
+ export async function sessionBinding(context, service) {
82
+ context.sessionBinding ??= detectHostContext().then((host) => host ? SessionBinding.connect(service, host) : undefined);
83
+ return context.sessionBinding;
39
84
  }
40
85
  export function positive(value) {
41
86
  const number = Number(value);
@@ -86,10 +131,22 @@ export async function readInput(path) {
86
131
  }
87
132
  }
88
133
  export async function businessWrite(context, service, sessionId, action) {
134
+ const binding = await sessionBinding(context, service);
135
+ if (!binding)
136
+ context.output.log('宿主未提供可确认归属的会话身份,本次不会自动保存当前项目;仍可显式传入 sessionId。');
137
+ if (binding && sessionId)
138
+ await selectSession(context, service, sessionId);
139
+ const revision = !sessionId ? await binding?.beginCreation() : undefined;
140
+ let response;
89
141
  try {
90
- return await action();
142
+ response = await action();
91
143
  }
92
144
  catch (error) {
145
+ if (binding && revision) {
146
+ const rejected = error instanceof CliError &&
147
+ ['BUSINESS_ERROR', 'AUTH_REQUIRED', 'INVALID_ARGUMENT'].includes(error.code);
148
+ await binding.finishCreation(revision, { state: rejected ? 'CREATE_FAILED' : 'CREATE_UNKNOWN' });
149
+ }
93
150
  if (error instanceof CliError && creditCode(error.details.businessCode))
94
151
  throw new CliError(error.code, error.message, {
95
152
  ...error.details,
@@ -116,6 +173,26 @@ export async function businessWrite(context, service, sessionId, action) {
116
173
  throw new CliError('INTERRUPTED', '命令已中断,远端任务不受影响', { sessionId });
117
174
  throw error;
118
175
  }
176
+ if (binding && revision) {
177
+ const createdSessionId = text(object(response).sessionId);
178
+ if (!createdSessionId) {
179
+ await binding.finishCreation(revision, { state: 'CREATE_UNKNOWN' });
180
+ throw new CliError('OUTCOME_UNKNOWN', '创建回执未包含 sessionId,请先核对结果,不要重复创建', {
181
+ retryable: false,
182
+ });
183
+ }
184
+ try {
185
+ await binding.finishCreation(revision, { state: 'BOUND', sessionId: createdSessionId });
186
+ }
187
+ catch {
188
+ throw new CliError('PROTOCOL_ERROR', '项目已创建,但本地绑定保存失败;请保留 sessionId 继续查询,不要重复创建', {
189
+ sessionId: createdSessionId,
190
+ remoteAccepted: true,
191
+ retryable: false,
192
+ });
193
+ }
194
+ }
195
+ return response;
119
196
  }
120
197
  export async function pollOperation(read, isTerminal, options) {
121
198
  const deadline = options.timeout === undefined ? Number.POSITIVE_INFINITY : Date.now() + options.timeout * 1000;
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/commands/shared.ts"],"names":[],"mappings":"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"}
@@ -46,6 +46,7 @@ export declare const wizardDraftSchema: z.ZodObject<{
46
46
  confirmed: z.ZodDefault<z.ZodBoolean>;
47
47
  quick: z.ZodDefault<z.ZodBoolean>;
48
48
  }, "strip", z.ZodTypeAny, {
49
+ revision: number;
49
50
  skills: {
50
51
  type: "custom" | "builtin";
51
52
  id: string;
@@ -53,7 +54,6 @@ export declare const wizardDraftSchema: z.ZodObject<{
53
54
  description?: string | undefined;
54
55
  }[];
55
56
  description: string;
56
- revision: number;
57
57
  stage: "skills" | "description" | "rewrite" | "memory" | "memory_name" | "memory_existing" | "confirm" | "terminate";
58
58
  builtinFileSelected: boolean;
59
59
  builtinWebSelected: boolean;
@@ -71,8 +71,8 @@ export declare const wizardDraftSchema: z.ZodObject<{
71
71
  agentId?: string | undefined;
72
72
  memoryStoreId?: string | undefined;
73
73
  }, {
74
- description: string;
75
74
  revision: number;
75
+ description: string;
76
76
  stage: "skills" | "description" | "rewrite" | "memory" | "memory_name" | "memory_existing" | "confirm" | "terminate";
77
77
  skills?: {
78
78
  type: "custom" | "builtin";
package/dist/program.js CHANGED
@@ -18,6 +18,8 @@ export function createProgram(context, hooks) {
18
18
  .configureOutput({ writeErr: () => undefined });
19
19
  program.hook('preAction', async (_root, action) => {
20
20
  context.connection = undefined;
21
+ context.sessionBinding = undefined;
22
+ context.selectedSessionId = undefined;
21
23
  const rootCommand = action.parent === program;
22
24
  const authCommand = action.parent?.name() === 'auth' && action.parent.parent === program;
23
25
  const offline = (rootCommand && (action.name() === 'version' || action.name() === 'update')) ||
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,UAAU,aAAa,CAC3B,OAAuB,EACvB,KAGC;IAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CACV,iDAAiD,CAClD;SACA,OAAO,CAAC,eAAe,CAAC;SACxB,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC;SACpC,MAAM,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC;SAC9C,YAAY,EAAE;SACd,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QACzF,MAAM,OAAO,GACX,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC5E,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO;QAC1C,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC;YAC7C,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D,MAAM,UAAU,aAAa,CAC3B,OAAuB,EACvB,KAGC;IAED,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE;SAC1B,IAAI,CAAC,YAAY,CAAC;SAClB,WAAW,CACV,iDAAiD,CAClD;SACA,OAAO,CAAC,eAAe,CAAC;SACxB,MAAM,CAAC,kBAAkB,EAAE,QAAQ,CAAC;SACpC,MAAM,CAAC,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC;SAC9C,YAAY,EAAE;SACd,eAAe,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QAChD,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;QAC/B,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;QACnC,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QAC9C,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,OAAO,CAAC;QACzF,MAAM,OAAO,GACX,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;YAC5E,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC9C,IAAI,OAAO,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO;QAC1C,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,CAAC;YAAE,MAAM,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,WAAW,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACtD,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import type { CreationRuntime } from '../runtime.js';
3
+ import type { HostContext } from './host-context.js';
4
+ declare const recordSchema: z.ZodEffects<z.ZodObject<{
5
+ version: z.ZodLiteral<1>;
6
+ revision: z.ZodString;
7
+ updatedAt: z.ZodString;
8
+ state: z.ZodEnum<["UNBOUND", "BOUND", "CREATING", "CREATE_FAILED", "CREATE_UNKNOWN"]>;
9
+ sessionId: z.ZodOptional<z.ZodString>;
10
+ }, "strict", z.ZodTypeAny, {
11
+ version: 1;
12
+ revision: string;
13
+ updatedAt: string;
14
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
15
+ sessionId?: string | undefined;
16
+ }, {
17
+ version: 1;
18
+ revision: string;
19
+ updatedAt: string;
20
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
21
+ sessionId?: string | undefined;
22
+ }>, {
23
+ version: 1;
24
+ revision: string;
25
+ updatedAt: string;
26
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
27
+ sessionId?: string | undefined;
28
+ }, {
29
+ version: 1;
30
+ revision: string;
31
+ updatedAt: string;
32
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
33
+ sessionId?: string | undefined;
34
+ }>;
35
+ type BindingRecord = z.infer<typeof recordSchema>;
36
+ type BindingValue = Pick<BindingRecord, 'state' | 'sessionId'>;
37
+ export declare class SessionBinding {
38
+ readonly host: HostContext;
39
+ private readonly store;
40
+ private readonly key;
41
+ constructor(host: HostContext, endpoint: string, userCode: string, root?: string);
42
+ static connect(service: CreationRuntime, host: HostContext): Promise<SessionBinding>;
43
+ private storage;
44
+ read(): Promise<BindingRecord | undefined>;
45
+ current(): Promise<{
46
+ version: 1;
47
+ revision: string;
48
+ updatedAt: string;
49
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
50
+ sessionId?: string | undefined;
51
+ host: HostContext;
52
+ } | {
53
+ state: "UNBOUND";
54
+ host: HostContext;
55
+ }>;
56
+ private save;
57
+ select(service: CreationRuntime, sessionId: string): Promise<{
58
+ version: 1;
59
+ revision: string;
60
+ updatedAt: string;
61
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
62
+ sessionId?: string | undefined;
63
+ }>;
64
+ clear(): Promise<{
65
+ version: 1;
66
+ revision: string;
67
+ updatedAt: string;
68
+ state: "UNBOUND" | "BOUND" | "CREATING" | "CREATE_FAILED" | "CREATE_UNKNOWN";
69
+ sessionId?: string | undefined;
70
+ }>;
71
+ beginCreation(): Promise<string>;
72
+ finishCreation(revision: string, value: BindingValue): Promise<void>;
73
+ }
74
+ export {};
@@ -0,0 +1,97 @@
1
+ /** 当前宿主会话唯一的项目绑定;创建回执按修订号提交。@author xiuyu.yi */
2
+ import { randomUUID } from 'node:crypto';
3
+ import { homedir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { z } from 'zod';
6
+ import { InteractionDraftStore, fingerprint } from '../interactions/draft-store.js';
7
+ import { CliError } from '../output/exit-codes.js';
8
+ import { object, text } from '../contracts/value.js';
9
+ const recordSchema = z
10
+ .object({
11
+ version: z.literal(1),
12
+ revision: z.string().uuid(),
13
+ updatedAt: z.string().datetime(),
14
+ state: z.enum(['UNBOUND', 'BOUND', 'CREATING', 'CREATE_FAILED', 'CREATE_UNKNOWN']),
15
+ sessionId: z.string().trim().min(1).optional(),
16
+ })
17
+ .strict()
18
+ .refine((record) => (record.state === 'BOUND') === !!record.sessionId);
19
+ export class SessionBinding {
20
+ host;
21
+ store;
22
+ key;
23
+ constructor(host, endpoint, userCode, root = join(homedir(), '.config/superun-ai-cli/sessions')) {
24
+ this.host = host;
25
+ this.store = new InteractionDraftStore(fingerprint([endpoint, userCode]), root);
26
+ this.key = `${host.host}:${host.conversationId}`;
27
+ }
28
+ static async connect(service, host) {
29
+ // 使用登录用户的稳定身份;不保存 PAT,同账号更换 PAT 后仍可恢复。
30
+ const account = object(await service.client.call('/api/uxa-center/support/UserAccount/queryAccount', { product: 13 }));
31
+ const userCode = text(account.userCode);
32
+ if (!userCode)
33
+ throw new CliError('PROTOCOL_ERROR', '无法确认当前登录身份,未读取或修改项目绑定');
34
+ return new SessionBinding(host, service.client.config.endpoint, userCode);
35
+ }
36
+ async storage(run) {
37
+ try {
38
+ return await run();
39
+ }
40
+ catch (error) {
41
+ if (error instanceof CliError && ['OUTCOME_UNKNOWN', 'STALE_INTERACTION'].includes(error.code))
42
+ throw error;
43
+ throw new CliError(error instanceof CliError ? error.code : 'PROTOCOL_ERROR', '当前会话的项目绑定无法读写或正被更新,请稍后查询;不要重复提交创作请求');
44
+ }
45
+ }
46
+ async read() {
47
+ return this.storage(async () => {
48
+ const raw = await this.store.read(this.key);
49
+ if (raw === undefined)
50
+ return undefined;
51
+ return recordSchema.parse(raw);
52
+ });
53
+ }
54
+ async current() {
55
+ return { host: this.host, ...((await this.read()) ?? { state: 'UNBOUND' }) };
56
+ }
57
+ async save(value) {
58
+ const record = recordSchema.parse({
59
+ version: 1,
60
+ revision: randomUUID(),
61
+ updatedAt: new Date().toISOString(),
62
+ ...value,
63
+ });
64
+ await this.store.write(this.key, record);
65
+ return record;
66
+ }
67
+ async select(service, sessionId) {
68
+ const revision = (await this.read())?.revision;
69
+ const result = await service.conversation.recently(sessionId);
70
+ if (result.session.sessionId !== sessionId)
71
+ throw new CliError('PROTOCOL_ERROR', '项目校验返回了不同的 sessionId,未切换绑定');
72
+ return this.storage(() => this.store.locked(this.key, async () => {
73
+ if ((await this.read())?.revision !== revision)
74
+ throw new CliError('STALE_INTERACTION', '校验项目期间当前绑定已变化,请重新读取绑定后再操作');
75
+ return this.save({ state: 'BOUND', sessionId });
76
+ }));
77
+ }
78
+ async clear() {
79
+ return this.storage(() => this.store.locked(this.key, () => this.save({ state: 'UNBOUND' })));
80
+ }
81
+ async beginCreation() {
82
+ return this.storage(() => this.store.locked(this.key, async () => {
83
+ const current = await this.read();
84
+ if (current?.state === 'CREATING' || current?.state === 'CREATE_UNKNOWN')
85
+ throw new CliError('OUTCOME_UNKNOWN', '上次创建尚未确认结果,请先查询原请求;不要重复创建');
86
+ return (await this.save({ state: 'CREATING' })).revision;
87
+ }));
88
+ }
89
+ async finishCreation(revision, value) {
90
+ await this.storage(() => this.store.locked(this.key, async () => {
91
+ // clear、显式切换以及更新的创建均使旧回执失效。
92
+ if ((await this.read())?.revision === revision)
93
+ await this.save(value);
94
+ }));
95
+ }
96
+ }
97
+ //# sourceMappingURL=binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/session/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type HostContext = {
2
+ host: 'codebuddy' | 'codex';
3
+ conversationId: string;
4
+ };
5
+ export declare function detectHostContext(env?: NodeJS.ProcessEnv): Promise<HostContext | undefined>;
@@ -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.29",
3
+ "version": "0.1.30",
4
4
  "description": "通过需求梳理、架构设计与开发协作,将网站和应用的想法转化为可持续迭代、可部署运维的生产级系统。",
5
5
  "author": "xiuyu.yi",
6
6
  "license": "UNLICENSED",