@co0ontty/wand 4.55.2 → 4.55.3-beta.g2c47e41

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.
@@ -1,6 +1,6 @@
1
1
  {
2
- "commit": "f4b403a97f3c2fe092b2f249841aa10ec1c82b80",
3
- "builtAt": "2026-09-07T13:38:48.657Z",
4
- "version": "4.55.2",
5
- "channel": "stable"
2
+ "commit": "2c47e41268f4636a7b0e0360effe84bf6d795631",
3
+ "builtAt": "2026-09-08T06:00:48.199Z",
4
+ "version": "4.55.3-beta.g2c47e41",
5
+ "channel": "beta"
6
6
  }
@@ -228,7 +228,7 @@ export function sanitizeTaskLayout(value) {
228
228
  * - 布局树由前端 allotment 构造,PUT 时经 sanitizeLayout 校验/规整后落库。
229
229
  */
230
230
  export function registerWorkspaceRoutes(app, storage, sessions) {
231
- // 列出所有项目(按最近打开排序)
231
+ // 列出所有项目(按创建时间升序,保证项目层级稳定)
232
232
  app.get("/api/workspaces", (_req, res) => {
233
233
  backfillSessionWorkspaces(storage);
234
234
  const sessionCounts = storage.countSessionsByWorkspace();
package/dist/server.js CHANGED
@@ -489,16 +489,35 @@ export async function startServer(config, configPath, options = {}) {
489
489
  const storage = new WandStorage(resolveDatabasePath(configPath));
490
490
  const runtimeConfig = new RuntimeConfigState(config);
491
491
  const authService = new AuthService(storage);
492
+ // Helper to get current default models from storage (not from startup-captured config)
493
+ // This allows model preferences to update in real-time when user changes config via UI
494
+ const getCurrentDefaultModels = () => {
495
+ // Try to read from storage first (most up-to-date via UI settings)
496
+ // Falls back to config values for deployment settings
497
+ const prefStorage = storage;
498
+ if (prefStorage) {
499
+ return {
500
+ claude: prefStorage.getPreference("pref:defaultModel", config.defaultModel ?? ""),
501
+ codex: prefStorage.getPreference("pref:defaultCodexModel", config.defaultCodexModel ?? ""),
502
+ opencode: prefStorage.getPreference("pref:defaultOpenCodeModel", config.defaultOpenCodeModel ?? ""),
503
+ grok: prefStorage.getPreference("pref:defaultGrokModel", config.defaultGrokModel ?? ""),
504
+ qoder: prefStorage.getPreference("pref:defaultQoderModel", config.defaultQoderModel ?? ""),
505
+ pi: prefStorage.getPreference("pref:defaultPiModel", config.defaultPiModel ?? ""),
506
+ };
507
+ }
508
+ return getProviderDefaultModels(config);
509
+ };
492
510
  const getModelRefreshOptions = () => {
493
511
  const injected = options.modelRefreshOptions?.() ?? {};
512
+ const currentDefaults = getCurrentDefaultModels();
494
513
  return {
495
514
  storage,
496
515
  inheritEnv: config.inheritEnv !== false,
497
516
  apiKey: process.env.ANTHROPIC_API_KEY,
498
517
  ...injected,
499
518
  configuredClaudeModels: [
500
- getProviderDefaultModels(config).claude,
501
- config.commitCli === "claude" ? config.commitModel : undefined,
519
+ currentDefaults.claude,
520
+ config.commitCli === "claude" ? (storage.getPreference("pref:commitModel", config.commitModel) ?? "") : undefined,
502
521
  ...(injected.configuredClaudeModels ?? []),
503
522
  ],
504
523
  };
package/dist/storage.js CHANGED
@@ -814,7 +814,7 @@ export class WandStorage {
814
814
  // ============ Workspaces(多标签 / 分屏项目)============
815
815
  listWorkspaces() {
816
816
  const rows = this.db
817
- .prepare("SELECT id, name, cwd, kind, default_provider, layout_json, created_at, last_opened_at FROM workspaces ORDER BY COALESCE(last_opened_at, created_at) DESC")
817
+ .prepare("SELECT id, name, cwd, kind, default_provider, layout_json, created_at, last_opened_at FROM workspaces ORDER BY created_at ASC, id ASC")
818
818
  .all();
819
819
  return rows.map(mapWorkspaceRow);
820
820
  }
@@ -1,6 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  import { startStructuredCli } from "./structured-exec-pump.js";
3
3
  import { CodexProtocolReducer } from "./structured-codex-protocol.js";
4
+ import { whichSync } from "./path-repair.js";
4
5
  import { thinkingEffortToCodexReasoningEffort } from "./structured-provider-common.js";
5
6
  /** Build the stable CLI contract for a structured Codex turn. */
6
7
  export function buildCodexArgs(session) {
@@ -40,10 +41,11 @@ export class CodexRunner {
40
41
  }
41
42
  start(context, observer) {
42
43
  const args = buildCodexArgs(context.session);
44
+ const file = whichSync("codex", { env: context.env }) ?? "codex";
43
45
  const reducer = new CodexProtocolReducer(context.session);
44
46
  return startStructuredCli({
45
47
  sessionId: context.session.id,
46
- file: "codex",
48
+ file,
47
49
  args,
48
50
  cwd: context.session.cwd,
49
51
  env: context.env,