@akiojin/gwt 4.12.0 → 4.12.2

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 (65) hide show
  1. package/bin/gwt.js +35 -9
  2. package/dist/claude.d.ts.map +1 -1
  3. package/dist/claude.js +67 -14
  4. package/dist/claude.js.map +1 -1
  5. package/dist/cli/ui/App.solid.d.ts.map +1 -1
  6. package/dist/cli/ui/App.solid.js +40 -8
  7. package/dist/cli/ui/App.solid.js.map +1 -1
  8. package/dist/cli/ui/components/solid/WizardController.d.ts.map +1 -1
  9. package/dist/cli/ui/components/solid/WizardController.js +48 -2
  10. package/dist/cli/ui/components/solid/WizardController.js.map +1 -1
  11. package/dist/cli/ui/components/solid/WizardSteps.d.ts +5 -0
  12. package/dist/cli/ui/components/solid/WizardSteps.d.ts.map +1 -1
  13. package/dist/cli/ui/components/solid/WizardSteps.js +29 -6
  14. package/dist/cli/ui/components/solid/WizardSteps.js.map +1 -1
  15. package/dist/cli/ui/utils/installedVersionCache.d.ts +33 -0
  16. package/dist/cli/ui/utils/installedVersionCache.d.ts.map +1 -0
  17. package/dist/cli/ui/utils/installedVersionCache.js +59 -0
  18. package/dist/cli/ui/utils/installedVersionCache.js.map +1 -0
  19. package/dist/cli/ui/utils/modelOptions.d.ts.map +1 -1
  20. package/dist/cli/ui/utils/modelOptions.js +16 -0
  21. package/dist/cli/ui/utils/modelOptions.js.map +1 -1
  22. package/dist/codex.d.ts.map +1 -1
  23. package/dist/codex.js +63 -22
  24. package/dist/codex.js.map +1 -1
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +5 -0
  27. package/dist/index.js.map +1 -1
  28. package/dist/logging/reader.d.ts +2 -1
  29. package/dist/logging/reader.d.ts.map +1 -1
  30. package/dist/logging/reader.js +37 -1
  31. package/dist/logging/reader.js.map +1 -1
  32. package/dist/opentui/index.solid.js +298 -264
  33. package/dist/services/codingAgentResolver.d.ts.map +1 -1
  34. package/dist/services/codingAgentResolver.js +8 -6
  35. package/dist/services/codingAgentResolver.js.map +1 -1
  36. package/dist/shared/codingAgentConstants.d.ts +3 -0
  37. package/dist/shared/codingAgentConstants.d.ts.map +1 -1
  38. package/dist/shared/codingAgentConstants.js +66 -0
  39. package/dist/shared/codingAgentConstants.js.map +1 -1
  40. package/dist/utils/bun-runtime.d.ts +12 -0
  41. package/dist/utils/bun-runtime.d.ts.map +1 -0
  42. package/dist/utils/bun-runtime.js +13 -0
  43. package/dist/utils/bun-runtime.js.map +1 -0
  44. package/dist/utils/session/parsers/codex.d.ts.map +1 -1
  45. package/dist/utils/session/parsers/codex.js +0 -1
  46. package/dist/utils/session/parsers/codex.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/claude.ts +79 -15
  49. package/src/cli/ui/App.solid.tsx +55 -6
  50. package/src/cli/ui/__tests__/solid/AppSolid.cleanup.test.tsx +91 -0
  51. package/src/cli/ui/__tests__/solid/components/WizardController.test.tsx +63 -0
  52. package/src/cli/ui/__tests__/solid/components/WizardSteps.test.tsx +91 -1
  53. package/src/cli/ui/components/solid/WizardController.tsx +65 -1
  54. package/src/cli/ui/components/solid/WizardSteps.tsx +55 -10
  55. package/src/cli/ui/utils/__tests__/installedVersionCache.test.ts +46 -0
  56. package/src/cli/ui/utils/installedVersionCache.ts +84 -0
  57. package/src/cli/ui/utils/modelOptions.test.ts +6 -0
  58. package/src/cli/ui/utils/modelOptions.ts +16 -0
  59. package/src/codex.ts +78 -22
  60. package/src/index.ts +5 -0
  61. package/src/logging/reader.ts +48 -1
  62. package/src/services/codingAgentResolver.ts +12 -5
  63. package/src/shared/codingAgentConstants.ts +73 -0
  64. package/src/utils/bun-runtime.ts +29 -0
  65. package/src/utils/session/parsers/codex.ts +0 -1
@@ -42884,7 +42884,6 @@ var UNOWNED = {
42884
42884
  context: null,
42885
42885
  owner: null
42886
42886
  };
42887
- var NO_INIT = {};
42888
42887
  var Owner = null;
42889
42888
  var Transition = null;
42890
42889
  var Scheduler = null;
@@ -42928,13 +42927,6 @@ function createSignal(value, options) {
42928
42927
  };
42929
42928
  return [readSignal.bind(s), setter];
42930
42929
  }
42931
- function createComputed(fn, value, options) {
42932
- const c = createComputation(fn, value, true, STALE);
42933
- if (Scheduler && Transition && Transition.running)
42934
- Updates.push(c);
42935
- else
42936
- updateComputation(c);
42937
- }
42938
42930
  function createRenderEffect(fn, value, options) {
42939
42931
  const c = createComputation(fn, value, false, STALE);
42940
42932
  if (Scheduler && Transition && Transition.running)
@@ -42964,164 +42956,6 @@ function createMemo(fn, value, options) {
42964
42956
  updateComputation(c);
42965
42957
  return readSignal.bind(c);
42966
42958
  }
42967
- function isPromise(v) {
42968
- return v && typeof v === "object" && "then" in v;
42969
- }
42970
- function createResource(pSource, pFetcher, pOptions) {
42971
- let source;
42972
- let fetcher;
42973
- let options;
42974
- if (typeof pFetcher === "function") {
42975
- source = pSource;
42976
- fetcher = pFetcher;
42977
- options = pOptions || {};
42978
- } else {
42979
- source = true;
42980
- fetcher = pSource;
42981
- options = pFetcher || {};
42982
- }
42983
- let pr = null, initP = NO_INIT, id = null, loadedUnderTransition = false, scheduled = false, resolved = "initialValue" in options, dynamic = typeof source === "function" && createMemo(source);
42984
- const contexts = new Set, [value, setValue] = (options.storage || createSignal)(options.initialValue), [error, setError] = createSignal(undefined), [track, trigger] = createSignal(undefined, {
42985
- equals: false
42986
- }), [state, setState] = createSignal(resolved ? "ready" : "unresolved");
42987
- if (sharedConfig.context) {
42988
- id = sharedConfig.getNextContextId();
42989
- if (options.ssrLoadFrom === "initial")
42990
- initP = options.initialValue;
42991
- else if (sharedConfig.load && sharedConfig.has(id))
42992
- initP = sharedConfig.load(id);
42993
- }
42994
- function loadEnd(p, v, error2, key) {
42995
- if (pr === p) {
42996
- pr = null;
42997
- key !== undefined && (resolved = true);
42998
- if ((p === initP || v === initP) && options.onHydrated)
42999
- queueMicrotask(() => options.onHydrated(key, {
43000
- value: v
43001
- }));
43002
- initP = NO_INIT;
43003
- if (Transition && p && loadedUnderTransition) {
43004
- Transition.promises.delete(p);
43005
- loadedUnderTransition = false;
43006
- runUpdates(() => {
43007
- Transition.running = true;
43008
- completeLoad(v, error2);
43009
- }, false);
43010
- } else
43011
- completeLoad(v, error2);
43012
- }
43013
- return v;
43014
- }
43015
- function completeLoad(v, err) {
43016
- runUpdates(() => {
43017
- if (err === undefined)
43018
- setValue(() => v);
43019
- setState(err !== undefined ? "errored" : resolved ? "ready" : "unresolved");
43020
- setError(err);
43021
- for (const c of contexts.keys())
43022
- c.decrement();
43023
- contexts.clear();
43024
- }, false);
43025
- }
43026
- function read() {
43027
- const c = SuspenseContext && useContext(SuspenseContext), v = value(), err = error();
43028
- if (err !== undefined && !pr)
43029
- throw err;
43030
- if (Listener && !Listener.user && c) {
43031
- createComputed(() => {
43032
- track();
43033
- if (pr) {
43034
- if (c.resolved && Transition && loadedUnderTransition)
43035
- Transition.promises.add(pr);
43036
- else if (!contexts.has(c)) {
43037
- c.increment();
43038
- contexts.add(c);
43039
- }
43040
- }
43041
- });
43042
- }
43043
- return v;
43044
- }
43045
- function load(refetching = true) {
43046
- if (refetching !== false && scheduled)
43047
- return;
43048
- scheduled = false;
43049
- const lookup = dynamic ? dynamic() : source;
43050
- loadedUnderTransition = Transition && Transition.running;
43051
- if (lookup == null || lookup === false) {
43052
- loadEnd(pr, untrack(value));
43053
- return;
43054
- }
43055
- if (Transition && pr)
43056
- Transition.promises.delete(pr);
43057
- let error2;
43058
- const p = initP !== NO_INIT ? initP : untrack(() => {
43059
- try {
43060
- return fetcher(lookup, {
43061
- value: value(),
43062
- refetching
43063
- });
43064
- } catch (fetcherError) {
43065
- error2 = fetcherError;
43066
- }
43067
- });
43068
- if (error2 !== undefined) {
43069
- loadEnd(pr, undefined, castError(error2), lookup);
43070
- return;
43071
- } else if (!isPromise(p)) {
43072
- loadEnd(pr, p, undefined, lookup);
43073
- return p;
43074
- }
43075
- pr = p;
43076
- if ("v" in p) {
43077
- if (p.s === 1)
43078
- loadEnd(pr, p.v, undefined, lookup);
43079
- else
43080
- loadEnd(pr, undefined, castError(p.v), lookup);
43081
- return p;
43082
- }
43083
- scheduled = true;
43084
- queueMicrotask(() => scheduled = false);
43085
- runUpdates(() => {
43086
- setState(resolved ? "refreshing" : "pending");
43087
- trigger();
43088
- }, false);
43089
- return p.then((v) => loadEnd(p, v, undefined, lookup), (e) => loadEnd(p, undefined, castError(e), lookup));
43090
- }
43091
- Object.defineProperties(read, {
43092
- state: {
43093
- get: () => state()
43094
- },
43095
- error: {
43096
- get: () => error()
43097
- },
43098
- loading: {
43099
- get() {
43100
- const s = state();
43101
- return s === "pending" || s === "refreshing";
43102
- }
43103
- },
43104
- latest: {
43105
- get() {
43106
- if (!resolved)
43107
- return read();
43108
- const err = error();
43109
- if (err && !pr)
43110
- throw err;
43111
- return value();
43112
- }
43113
- }
43114
- });
43115
- let owner = Owner;
43116
- if (dynamic)
43117
- createComputed(() => (owner = Owner, load(false)));
43118
- else
43119
- load(false);
43120
- return [read, {
43121
- refetch: (info) => runWithOwner(owner, () => load(info)),
43122
- mutate: setValue
43123
- }];
43124
- }
43125
42959
  function batch(fn) {
43126
42960
  return runUpdates(fn, false);
43127
42961
  }
@@ -43171,20 +43005,6 @@ function onCleanup(fn) {
43171
43005
  Owner.cleanups.push(fn);
43172
43006
  return fn;
43173
43007
  }
43174
- function runWithOwner(o, fn) {
43175
- const prev = Owner;
43176
- const prevListener = Listener;
43177
- Owner = o;
43178
- Listener = null;
43179
- try {
43180
- return runUpdates(fn, true);
43181
- } catch (err) {
43182
- handleError(err);
43183
- } finally {
43184
- Owner = prev;
43185
- Listener = prevListener;
43186
- }
43187
- }
43188
43008
  function startTransition(fn) {
43189
43009
  if (Transition && Transition.running) {
43190
43010
  fn();
@@ -46891,6 +46711,19 @@ var MODEL_OPTIONS = {
46891
46711
  label: "Flash-Lite (gemini-2.5-flash-lite)",
46892
46712
  description: "Fastest for simple tasks"
46893
46713
  }
46714
+ ],
46715
+ opencode: [
46716
+ {
46717
+ id: "",
46718
+ label: "Default (Auto)",
46719
+ description: "Use OpenCode default model",
46720
+ isDefault: true
46721
+ },
46722
+ {
46723
+ id: "__custom__",
46724
+ label: "Custom (provider/model)",
46725
+ description: "Enter a provider/model identifier"
46726
+ }
46894
46727
  ]
46895
46728
  };
46896
46729
  function getModelOptions(tool) {
@@ -46920,6 +46753,9 @@ function normalizeModelId(tool, model) {
46920
46753
  const trimmed = model.trim();
46921
46754
  if (!trimmed)
46922
46755
  return null;
46756
+ if (tool === "opencode" && trimmed === "__custom__") {
46757
+ return null;
46758
+ }
46923
46759
  if (tool === "claude-code") {
46924
46760
  const lower = trimmed.toLowerCase();
46925
46761
  if (lower === "opuss")
@@ -46955,6 +46791,33 @@ async function prefetchAgentVersions(agentIds, fetchFn) {
46955
46791
 
46956
46792
  // src/cli/ui/components/solid/WizardSteps.tsx
46957
46793
  init_versionFetcher();
46794
+
46795
+ // src/cli/ui/utils/installedVersionCache.ts
46796
+ init_versionFetcher();
46797
+ var installedVersionCache = new Map;
46798
+ function getInstalledVersionCache(agentId) {
46799
+ const cached = installedVersionCache.get(agentId);
46800
+ return cached ?? null;
46801
+ }
46802
+ function setInstalledVersionCache(agentId, installed) {
46803
+ installedVersionCache.set(agentId, installed);
46804
+ }
46805
+ async function prefetchInstalledVersions(agentIds, fetchFn) {
46806
+ const fetcher = fetchFn ?? (async (agentId) => fetchInstalledVersionForAgent(agentId));
46807
+ const results = await Promise.allSettled(agentIds.map(async (agentId) => {
46808
+ try {
46809
+ const installed = await fetcher(agentId);
46810
+ setInstalledVersionCache(agentId, installed);
46811
+ } catch {
46812
+ setInstalledVersionCache(agentId, null);
46813
+ }
46814
+ }));
46815
+ for (const result of results) {
46816
+ if (result.status === "rejected") {}
46817
+ }
46818
+ }
46819
+
46820
+ // src/cli/ui/components/solid/WizardSteps.tsx
46958
46821
  var useEnsureSelectionVisible = (options) => {
46959
46822
  const scroll = useWizardScroll();
46960
46823
  const ensureIndexVisible = (index) => {
@@ -47376,6 +47239,61 @@ function ModelSelectStep(props) {
47376
47239
  return _el$43;
47377
47240
  })();
47378
47241
  }
47242
+ function ModelInputStep(props) {
47243
+ const [value, setValue] = createSignal("");
47244
+ const scroll = useWizardScroll();
47245
+ const placeholder = props.agentId === "opencode" ? "provider/model" : "model";
47246
+ createEffect(() => {
47247
+ if (props.focused === false) {
47248
+ return;
47249
+ }
47250
+ if (!scroll) {
47251
+ return;
47252
+ }
47253
+ scroll.ensureLineVisible(2);
47254
+ });
47255
+ const handleSubmit = (next) => {
47256
+ const trimmed = next.trim();
47257
+ if (!trimmed) {
47258
+ return;
47259
+ }
47260
+ props.onSubmit(trimmed);
47261
+ };
47262
+ return (() => {
47263
+ var _el$52 = createElement("box"), _el$53 = createElement("text"), _el$55 = createElement("text"), _el$57 = createElement("text"), _el$59 = createElement("text");
47264
+ insertNode(_el$52, _el$53);
47265
+ insertNode(_el$52, _el$55);
47266
+ insertNode(_el$52, _el$57);
47267
+ insertNode(_el$52, _el$59);
47268
+ setProp(_el$52, "flexDirection", "column");
47269
+ insertNode(_el$53, createTextNode(`Enter custom model:`));
47270
+ setProp(_el$53, "fg", "cyan");
47271
+ insertNode(_el$55, createTextNode(` `));
47272
+ insert(_el$52, createComponent2(TextInput, {
47273
+ get value() {
47274
+ return value();
47275
+ },
47276
+ onChange: setValue,
47277
+ onSubmit: handleSubmit,
47278
+ placeholder,
47279
+ get focused() {
47280
+ return props.focused ?? true;
47281
+ }
47282
+ }), _el$57);
47283
+ insertNode(_el$57, createTextNode(` `));
47284
+ insertNode(_el$59, createTextNode(`[Enter] Submit [Esc] Back`));
47285
+ effect((_p$) => {
47286
+ var _v$11 = TextAttributes.BOLD, _v$12 = TextAttributes.DIM;
47287
+ _v$11 !== _p$.e && (_p$.e = setProp(_el$53, "attributes", _v$11, _p$.e));
47288
+ _v$12 !== _p$.t && (_p$.t = setProp(_el$59, "attributes", _v$12, _p$.t));
47289
+ return _p$;
47290
+ }, {
47291
+ e: undefined,
47292
+ t: undefined
47293
+ });
47294
+ return _el$52;
47295
+ })();
47296
+ }
47379
47297
  var REASONING_LEVELS = [{
47380
47298
  label: "low",
47381
47299
  value: "low",
@@ -47413,16 +47331,16 @@ function ReasoningLevelStep(props) {
47413
47331
  }
47414
47332
  };
47415
47333
  return (() => {
47416
- var _el$52 = createElement("box"), _el$53 = createElement("text"), _el$55 = createElement("text"), _el$57 = createElement("text"), _el$59 = createElement("text");
47417
- insertNode(_el$52, _el$53);
47418
- insertNode(_el$52, _el$55);
47419
- insertNode(_el$52, _el$57);
47420
- insertNode(_el$52, _el$59);
47421
- setProp(_el$52, "flexDirection", "column");
47422
- insertNode(_el$53, createTextNode(`Select reasoning level:`));
47423
- setProp(_el$53, "fg", "cyan");
47424
- insertNode(_el$55, createTextNode(` `));
47425
- insert(_el$52, createComponent2(SelectInput, {
47334
+ var _el$61 = createElement("box"), _el$62 = createElement("text"), _el$64 = createElement("text"), _el$66 = createElement("text"), _el$68 = createElement("text");
47335
+ insertNode(_el$61, _el$62);
47336
+ insertNode(_el$61, _el$64);
47337
+ insertNode(_el$61, _el$66);
47338
+ insertNode(_el$61, _el$68);
47339
+ setProp(_el$61, "flexDirection", "column");
47340
+ insertNode(_el$62, createTextNode(`Select reasoning level:`));
47341
+ setProp(_el$62, "fg", "cyan");
47342
+ insertNode(_el$64, createTextNode(` `));
47343
+ insert(_el$61, createComponent2(SelectInput, {
47426
47344
  items: REASONING_LEVELS,
47427
47345
  onSelect: (item) => props.onSelect(item.value),
47428
47346
  onChange: handleChange,
@@ -47430,19 +47348,19 @@ function ReasoningLevelStep(props) {
47430
47348
  return props.focused ?? true;
47431
47349
  },
47432
47350
  selectRef: setSelectRef
47433
- }), _el$57);
47434
- insertNode(_el$57, createTextNode(` `));
47435
- insertNode(_el$59, createTextNode(`[Enter] Select [Esc] Back`));
47351
+ }), _el$66);
47352
+ insertNode(_el$66, createTextNode(` `));
47353
+ insertNode(_el$68, createTextNode(`[Enter] Select [Esc] Back`));
47436
47354
  effect((_p$) => {
47437
- var _v$11 = TextAttributes.BOLD, _v$12 = TextAttributes.DIM;
47438
- _v$11 !== _p$.e && (_p$.e = setProp(_el$53, "attributes", _v$11, _p$.e));
47439
- _v$12 !== _p$.t && (_p$.t = setProp(_el$59, "attributes", _v$12, _p$.t));
47355
+ var _v$13 = TextAttributes.BOLD, _v$14 = TextAttributes.DIM;
47356
+ _v$13 !== _p$.e && (_p$.e = setProp(_el$62, "attributes", _v$13, _p$.e));
47357
+ _v$14 !== _p$.t && (_p$.t = setProp(_el$68, "attributes", _v$14, _p$.t));
47440
47358
  return _p$;
47441
47359
  }, {
47442
47360
  e: undefined,
47443
47361
  t: undefined
47444
47362
  });
47445
- return _el$52;
47363
+ return _el$61;
47446
47364
  })();
47447
47365
  }
47448
47366
  var EXECUTION_MODES = [{
@@ -47478,16 +47396,16 @@ function ExecutionModeStep(props) {
47478
47396
  }
47479
47397
  };
47480
47398
  return (() => {
47481
- var _el$61 = createElement("box"), _el$62 = createElement("text"), _el$64 = createElement("text"), _el$66 = createElement("text"), _el$68 = createElement("text");
47482
- insertNode(_el$61, _el$62);
47483
- insertNode(_el$61, _el$64);
47484
- insertNode(_el$61, _el$66);
47485
- insertNode(_el$61, _el$68);
47486
- setProp(_el$61, "flexDirection", "column");
47487
- insertNode(_el$62, createTextNode(`Select execution mode:`));
47488
- setProp(_el$62, "fg", "cyan");
47489
- insertNode(_el$64, createTextNode(` `));
47490
- insert(_el$61, createComponent2(SelectInput, {
47399
+ var _el$70 = createElement("box"), _el$71 = createElement("text"), _el$73 = createElement("text"), _el$75 = createElement("text"), _el$77 = createElement("text");
47400
+ insertNode(_el$70, _el$71);
47401
+ insertNode(_el$70, _el$73);
47402
+ insertNode(_el$70, _el$75);
47403
+ insertNode(_el$70, _el$77);
47404
+ setProp(_el$70, "flexDirection", "column");
47405
+ insertNode(_el$71, createTextNode(`Select execution mode:`));
47406
+ setProp(_el$71, "fg", "cyan");
47407
+ insertNode(_el$73, createTextNode(` `));
47408
+ insert(_el$70, createComponent2(SelectInput, {
47491
47409
  items: EXECUTION_MODES,
47492
47410
  onSelect: (item) => props.onSelect(item.value),
47493
47411
  onChange: handleChange,
@@ -47495,19 +47413,19 @@ function ExecutionModeStep(props) {
47495
47413
  return props.focused ?? true;
47496
47414
  },
47497
47415
  selectRef: setSelectRef
47498
- }), _el$66);
47499
- insertNode(_el$66, createTextNode(` `));
47500
- insertNode(_el$68, createTextNode(`[Enter] Select [Esc] Back`));
47416
+ }), _el$75);
47417
+ insertNode(_el$75, createTextNode(` `));
47418
+ insertNode(_el$77, createTextNode(`[Enter] Select [Esc] Back`));
47501
47419
  effect((_p$) => {
47502
- var _v$13 = TextAttributes.BOLD, _v$14 = TextAttributes.DIM;
47503
- _v$13 !== _p$.e && (_p$.e = setProp(_el$62, "attributes", _v$13, _p$.e));
47504
- _v$14 !== _p$.t && (_p$.t = setProp(_el$68, "attributes", _v$14, _p$.t));
47420
+ var _v$15 = TextAttributes.BOLD, _v$16 = TextAttributes.DIM;
47421
+ _v$15 !== _p$.e && (_p$.e = setProp(_el$71, "attributes", _v$15, _p$.e));
47422
+ _v$16 !== _p$.t && (_p$.t = setProp(_el$77, "attributes", _v$16, _p$.t));
47505
47423
  return _p$;
47506
47424
  }, {
47507
47425
  e: undefined,
47508
47426
  t: undefined
47509
47427
  });
47510
- return _el$61;
47428
+ return _el$70;
47511
47429
  })();
47512
47430
  }
47513
47431
  var SKIP_OPTIONS = [{
@@ -47539,16 +47457,16 @@ function SkipPermissionsStep(props) {
47539
47457
  }
47540
47458
  };
47541
47459
  return (() => {
47542
- var _el$70 = createElement("box"), _el$71 = createElement("text"), _el$73 = createElement("text"), _el$75 = createElement("text"), _el$77 = createElement("text");
47543
- insertNode(_el$70, _el$71);
47544
- insertNode(_el$70, _el$73);
47545
- insertNode(_el$70, _el$75);
47546
- insertNode(_el$70, _el$77);
47547
- setProp(_el$70, "flexDirection", "column");
47548
- insertNode(_el$71, createTextNode(`Skip permission prompts?`));
47549
- setProp(_el$71, "fg", "cyan");
47550
- insertNode(_el$73, createTextNode(` `));
47551
- insert(_el$70, createComponent2(SelectInput, {
47460
+ var _el$79 = createElement("box"), _el$80 = createElement("text"), _el$82 = createElement("text"), _el$84 = createElement("text"), _el$86 = createElement("text");
47461
+ insertNode(_el$79, _el$80);
47462
+ insertNode(_el$79, _el$82);
47463
+ insertNode(_el$79, _el$84);
47464
+ insertNode(_el$79, _el$86);
47465
+ setProp(_el$79, "flexDirection", "column");
47466
+ insertNode(_el$80, createTextNode(`Skip permission prompts?`));
47467
+ setProp(_el$80, "fg", "cyan");
47468
+ insertNode(_el$82, createTextNode(` `));
47469
+ insert(_el$79, createComponent2(SelectInput, {
47552
47470
  items: SKIP_OPTIONS,
47553
47471
  onSelect: (item) => props.onSelect(item.value === "true"),
47554
47472
  onChange: handleChange,
@@ -47556,19 +47474,19 @@ function SkipPermissionsStep(props) {
47556
47474
  return props.focused ?? true;
47557
47475
  },
47558
47476
  selectRef: setSelectRef
47559
- }), _el$75);
47560
- insertNode(_el$75, createTextNode(` `));
47561
- insertNode(_el$77, createTextNode(`[Enter] Select [Esc] Back`));
47477
+ }), _el$84);
47478
+ insertNode(_el$84, createTextNode(` `));
47479
+ insertNode(_el$86, createTextNode(`[Enter] Select [Esc] Back`));
47562
47480
  effect((_p$) => {
47563
- var _v$15 = TextAttributes.BOLD, _v$16 = TextAttributes.DIM;
47564
- _v$15 !== _p$.e && (_p$.e = setProp(_el$71, "attributes", _v$15, _p$.e));
47565
- _v$16 !== _p$.t && (_p$.t = setProp(_el$77, "attributes", _v$16, _p$.t));
47481
+ var _v$17 = TextAttributes.BOLD, _v$18 = TextAttributes.DIM;
47482
+ _v$17 !== _p$.e && (_p$.e = setProp(_el$80, "attributes", _v$17, _p$.e));
47483
+ _v$18 !== _p$.t && (_p$.t = setProp(_el$86, "attributes", _v$18, _p$.t));
47566
47484
  return _p$;
47567
47485
  }, {
47568
47486
  e: undefined,
47569
47487
  t: undefined
47570
47488
  });
47571
- return _el$70;
47489
+ return _el$79;
47572
47490
  })();
47573
47491
  }
47574
47492
  var LATEST_OPTION = {
@@ -47586,10 +47504,10 @@ function VersionSelectStep(props) {
47586
47504
  }
47587
47505
  return cached.map(versionInfoToSelectItem);
47588
47506
  };
47589
- const [installedOption] = createResource(() => props.agentId, async (agentId) => {
47590
- const installed = await fetchInstalledVersionForAgent(agentId);
47507
+ const installedOption = () => {
47508
+ const installed = getInstalledVersionCache(props.agentId);
47591
47509
  return installed ? createInstalledOption(installed) : null;
47592
- });
47510
+ };
47593
47511
  const allOptions = () => {
47594
47512
  const options = [];
47595
47513
  const installed = installedOption();
@@ -47636,25 +47554,25 @@ function VersionSelectStep(props) {
47636
47554
  return null;
47637
47555
  };
47638
47556
  return (() => {
47639
- var _el$79 = createElement("box"), _el$80 = createElement("text"), _el$82 = createElement("text"), _el$84 = createElement("text"), _el$86 = createElement("text");
47640
- insertNode(_el$79, _el$80);
47641
- insertNode(_el$79, _el$82);
47642
- insertNode(_el$79, _el$84);
47643
- insertNode(_el$79, _el$86);
47644
- setProp(_el$79, "flexDirection", "column");
47645
- insertNode(_el$80, createTextNode(`Select version:`));
47646
- setProp(_el$80, "fg", "cyan");
47647
- insert(_el$79, (() => {
47557
+ var _el$88 = createElement("box"), _el$89 = createElement("text"), _el$91 = createElement("text"), _el$93 = createElement("text"), _el$95 = createElement("text");
47558
+ insertNode(_el$88, _el$89);
47559
+ insertNode(_el$88, _el$91);
47560
+ insertNode(_el$88, _el$93);
47561
+ insertNode(_el$88, _el$95);
47562
+ setProp(_el$88, "flexDirection", "column");
47563
+ insertNode(_el$89, createTextNode(`Select version:`));
47564
+ setProp(_el$89, "fg", "cyan");
47565
+ insert(_el$88, (() => {
47648
47566
  var _c$ = memo2(() => !!statusText());
47649
47567
  return () => _c$() && (() => {
47650
- var _el$88 = createElement("text");
47651
- insert(_el$88, statusText);
47652
- effect((_$p) => setProp(_el$88, "attributes", TextAttributes.DIM, _$p));
47653
- return _el$88;
47568
+ var _el$97 = createElement("text");
47569
+ insert(_el$97, statusText);
47570
+ effect((_$p) => setProp(_el$97, "attributes", TextAttributes.DIM, _$p));
47571
+ return _el$97;
47654
47572
  })();
47655
- })(), _el$82);
47656
- insertNode(_el$82, createTextNode(` `));
47657
- insert(_el$79, createComponent2(SelectInput, {
47573
+ })(), _el$91);
47574
+ insertNode(_el$91, createTextNode(` `));
47575
+ insert(_el$88, createComponent2(SelectInput, {
47658
47576
  get items() {
47659
47577
  return allOptions();
47660
47578
  },
@@ -47664,19 +47582,19 @@ function VersionSelectStep(props) {
47664
47582
  return props.focused ?? true;
47665
47583
  },
47666
47584
  selectRef: setSelectRef
47667
- }), _el$84);
47668
- insertNode(_el$84, createTextNode(` `));
47669
- insertNode(_el$86, createTextNode(`[Enter] Select [Esc] Back`));
47585
+ }), _el$93);
47586
+ insertNode(_el$93, createTextNode(` `));
47587
+ insertNode(_el$95, createTextNode(`[Enter] Select [Esc] Back`));
47670
47588
  effect((_p$) => {
47671
- var _v$17 = TextAttributes.BOLD, _v$18 = TextAttributes.DIM;
47672
- _v$17 !== _p$.e && (_p$.e = setProp(_el$80, "attributes", _v$17, _p$.e));
47673
- _v$18 !== _p$.t && (_p$.t = setProp(_el$86, "attributes", _v$18, _p$.t));
47589
+ var _v$19 = TextAttributes.BOLD, _v$20 = TextAttributes.DIM;
47590
+ _v$19 !== _p$.e && (_p$.e = setProp(_el$89, "attributes", _v$19, _p$.e));
47591
+ _v$20 !== _p$.t && (_p$.t = setProp(_el$95, "attributes", _v$20, _p$.t));
47674
47592
  return _p$;
47675
47593
  }, {
47676
47594
  e: undefined,
47677
47595
  t: undefined
47678
47596
  });
47679
- return _el$79;
47597
+ return _el$88;
47680
47598
  })();
47681
47599
  }
47682
47600
 
@@ -47692,7 +47610,9 @@ function WizardController(props) {
47692
47610
  const [selectedModel, setSelectedModel] = createSignal("");
47693
47611
  const [reasoningLevel, setReasoningLevel] = createSignal(undefined);
47694
47612
  const [executionMode, setExecutionMode] = createSignal("normal");
47613
+ const [versionSelectionReady, setVersionSelectionReady] = createSignal(false);
47695
47614
  const [isTransitioning, setIsTransitioning] = createSignal(true);
47615
+ let versionSelectionTimer = null;
47696
47616
  function getInitialStep() {
47697
47617
  if (props.history.length > 0) {
47698
47618
  return "quick-start";
@@ -47750,6 +47670,26 @@ function WizardController(props) {
47750
47670
  setStep(previousStep);
47751
47671
  startTransition2();
47752
47672
  };
47673
+ createEffect(() => {
47674
+ const currentStep = step();
47675
+ if (versionSelectionTimer) {
47676
+ clearTimeout(versionSelectionTimer);
47677
+ versionSelectionTimer = null;
47678
+ }
47679
+ if (currentStep === "version-select") {
47680
+ setVersionSelectionReady(false);
47681
+ versionSelectionTimer = setTimeout(() => {
47682
+ setVersionSelectionReady(true);
47683
+ }, 50);
47684
+ return;
47685
+ }
47686
+ setVersionSelectionReady(false);
47687
+ });
47688
+ onCleanup(() => {
47689
+ if (versionSelectionTimer) {
47690
+ clearTimeout(versionSelectionTimer);
47691
+ }
47692
+ });
47753
47693
  const needsReasoningLevel = createMemo(() => {
47754
47694
  return selectedAgent() === "codex-cli";
47755
47695
  });
@@ -47784,10 +47724,18 @@ function WizardController(props) {
47784
47724
  goToStep("version-select");
47785
47725
  };
47786
47726
  const handleVersionSelect = (version) => {
47727
+ if (!versionSelectionReady() || step() !== "version-select") {
47728
+ return;
47729
+ }
47787
47730
  setSelectedVersion(version);
47788
47731
  goToStep("model-select");
47789
47732
  };
47790
47733
  const handleModelSelect = (model) => {
47734
+ const agent = selectedAgent();
47735
+ if (agent === "opencode" && model === "__custom__") {
47736
+ goToStep("model-input");
47737
+ return;
47738
+ }
47791
47739
  setSelectedModel(model);
47792
47740
  if (needsReasoningLevel()) {
47793
47741
  goToStep("reasoning-level");
@@ -47795,6 +47743,18 @@ function WizardController(props) {
47795
47743
  goToStep("execution-mode");
47796
47744
  }
47797
47745
  };
47746
+ const handleModelInputSubmit = (value) => {
47747
+ const trimmed = value.trim();
47748
+ if (!trimmed) {
47749
+ return;
47750
+ }
47751
+ setSelectedModel(trimmed);
47752
+ if (needsReasoningLevel()) {
47753
+ goToStep("reasoning-level");
47754
+ } else {
47755
+ goToStep("execution-mode");
47756
+ }
47757
+ };
47798
47758
  const handleReasoningLevelSelect = (level) => {
47799
47759
  setReasoningLevel(level);
47800
47760
  goToStep("execution-mode");
@@ -47898,6 +47858,16 @@ function WizardController(props) {
47898
47858
  focused
47899
47859
  });
47900
47860
  }
47861
+ if (currentStep === "model-input") {
47862
+ return createComponent2(ModelInputStep, {
47863
+ get agentId() {
47864
+ return selectedAgent() ?? "claude-code";
47865
+ },
47866
+ onSubmit: handleModelInputSubmit,
47867
+ onBack: goBack,
47868
+ focused
47869
+ });
47870
+ }
47901
47871
  if (currentStep === "reasoning-level") {
47902
47872
  return createComponent2(ReasoningLevelStep, {
47903
47873
  onSelect: handleReasoningLevelSelect,
@@ -51825,7 +51795,7 @@ async function listLogFiles(logDir) {
51825
51795
  files.push({ date, path: fullPath, mtimeMs: stat3.mtimeMs });
51826
51796
  } catch {}
51827
51797
  }
51828
- return files.sort((a2, b) => b.date.localeCompare(a2.date));
51798
+ return files.sort((a2, b) => b.mtimeMs - a2.mtimeMs);
51829
51799
  } catch (error) {
51830
51800
  const err = error;
51831
51801
  if (err.code === "ENOENT") {
@@ -51834,6 +51804,41 @@ async function listLogFiles(logDir) {
51834
51804
  throw error;
51835
51805
  }
51836
51806
  }
51807
+ var getLatestLogMtimeWithContent = async (logDir) => {
51808
+ const files = await listLogFiles(logDir);
51809
+ for (const file of files) {
51810
+ const lines = await readLogFileLines(file.path);
51811
+ if (lines.length > 0) {
51812
+ return file.mtimeMs;
51813
+ }
51814
+ }
51815
+ return null;
51816
+ };
51817
+ async function selectLogTargetByRecency(primary, fallback) {
51818
+ if (!primary.logDir || !primary.sourcePath) {
51819
+ return primary;
51820
+ }
51821
+ if (!fallback.logDir || !fallback.sourcePath) {
51822
+ return primary;
51823
+ }
51824
+ if (primary.logDir === fallback.logDir) {
51825
+ return primary;
51826
+ }
51827
+ if (primary.reason !== "worktree") {
51828
+ return primary;
51829
+ }
51830
+ const [primaryMtime, fallbackMtime] = await Promise.all([
51831
+ getLatestLogMtimeWithContent(primary.logDir),
51832
+ getLatestLogMtimeWithContent(fallback.logDir)
51833
+ ]);
51834
+ if (fallbackMtime !== null && (primaryMtime === null || fallbackMtime > primaryMtime)) {
51835
+ return {
51836
+ ...fallback,
51837
+ reason: "working-directory-fallback"
51838
+ };
51839
+ }
51840
+ return primary;
51841
+ }
51837
51842
  async function clearLogFiles(logDir) {
51838
51843
  const files = await listLogFiles(logDir);
51839
51844
  let cleared = 0;
@@ -52020,6 +52025,7 @@ var logger4 = createLogger({
52020
52025
  category: "app"
52021
52026
  });
52022
52027
  var UNSAFE_SELECTION_MESSAGE = "Unsafe branch selected. Select anyway?";
52028
+ var SAFETY_PENDING_MESSAGE = "Safety check in progress. Select anyway?";
52023
52029
  var DEFAULT_SCREEN = "branch-list";
52024
52030
  var buildStats = (branches) => calculateStatistics(branches);
52025
52031
  var applyCleanupStatus = (items, statusByBranch) => items.map((branch) => {
@@ -52119,6 +52125,7 @@ function AppSolid(props) {
52119
52125
  const [unsafeSelectionConfirmVisible, setUnsafeSelectionConfirmVisible] = createSignal(false);
52120
52126
  const [unsafeConfirmInputLocked, setUnsafeConfirmInputLocked] = createSignal(false);
52121
52127
  const [unsafeSelectionTarget, setUnsafeSelectionTarget] = createSignal(null);
52128
+ const [unsafeSelectionMessage, setUnsafeSelectionMessage] = createSignal(UNSAFE_SELECTION_MESSAGE);
52122
52129
  const [branchFooterMessage, setBranchFooterMessage] = createSignal(null);
52123
52130
  const [branchInputLocked, setBranchInputLocked] = createSignal(false);
52124
52131
  const [cleanupIndicators, setCleanupIndicators] = createSignal({});
@@ -52200,21 +52207,31 @@ function AppSolid(props) {
52200
52207
  const [profileInputSuppressKey, setProfileInputSuppressKey] = createSignal(null);
52201
52208
  const [profileEnvKey, setProfileEnvKey] = createSignal(null);
52202
52209
  const [profileConfirmMode, setProfileConfirmMode] = createSignal("delete-profile");
52203
- const logTarget = createMemo(() => resolveLogTarget(logTargetBranch(), workingDirectory()));
52210
+ const [logEffectiveTarget, setLogEffectiveTarget] = createSignal(null);
52211
+ const logPrimaryTarget = createMemo(() => resolveLogTarget(logTargetBranch(), workingDirectory()));
52212
+ const logFallbackTarget = createMemo(() => resolveLogTarget(null, workingDirectory()));
52213
+ const logActiveTarget = createMemo(() => logEffectiveTarget() ?? logPrimaryTarget());
52204
52214
  const logBranchLabel = createMemo(() => logTargetBranch()?.label ?? null);
52205
52215
  const logSourceLabel = createMemo(() => {
52206
- const target = logTarget();
52216
+ const target = logActiveTarget();
52207
52217
  if (!target.sourcePath) {
52208
52218
  return "(none)";
52209
52219
  }
52210
52220
  if (target.reason === "current-working-directory" || target.reason === "working-directory") {
52211
52221
  return `${target.sourcePath} (cwd)`;
52212
52222
  }
52223
+ if (target.reason === "working-directory-fallback") {
52224
+ return `${target.sourcePath} (cwd fallback)`;
52225
+ }
52213
52226
  if (target.reason === "worktree-inaccessible") {
52214
52227
  return `${target.sourcePath} (inaccessible)`;
52215
52228
  }
52216
52229
  return target.sourcePath;
52217
52230
  });
52231
+ createEffect(() => {
52232
+ logPrimaryTarget();
52233
+ setLogEffectiveTarget(null);
52234
+ });
52218
52235
  const selectedProfileConfig = createMemo(() => {
52219
52236
  const name = selectedProfileName();
52220
52237
  const config = profilesConfig();
@@ -52366,7 +52383,10 @@ function AppSolid(props) {
52366
52383
  setLogLoading(true);
52367
52384
  setLogError(null);
52368
52385
  try {
52369
- const target = logTarget();
52386
+ const primaryTarget = logPrimaryTarget();
52387
+ const fallbackTarget = logFallbackTarget();
52388
+ const target = await selectLogTargetByRecency(primaryTarget, fallbackTarget);
52389
+ setLogEffectiveTarget(target);
52370
52390
  if (!target.logDir) {
52371
52391
  setLogEntries([]);
52372
52392
  setLogSelectedDate(targetDate);
@@ -52400,7 +52420,7 @@ function AppSolid(props) {
52400
52420
  setLogTailEnabled((prev) => !prev);
52401
52421
  };
52402
52422
  const resetLogFiles = async () => {
52403
- const target = logTarget();
52423
+ const target = logActiveTarget();
52404
52424
  if (!target.logDir) {
52405
52425
  showLogNotification("No logs available.", "error");
52406
52426
  return;
@@ -52443,6 +52463,9 @@ function AppSolid(props) {
52443
52463
  setStats(buildStats(initialItems));
52444
52464
  refreshCleanupSafety();
52445
52465
  (async () => {
52466
+ await withTimeout(fetchAllRemotes({
52467
+ cwd: repoRoot
52468
+ }), BRANCH_FULL_LOAD_TIMEOUT_MS).catch(() => {});
52446
52469
  const [branches, latestWorktrees] = await Promise.all([withTimeout(getAllBranches(repoRoot), BRANCH_FULL_LOAD_TIMEOUT_MS).catch(() => localBranches), withTimeout(listAdditionalWorktrees(), BRANCH_FULL_LOAD_TIMEOUT_MS).catch(() => worktrees)]);
52447
52470
  const full = buildBranchList(branches, latestWorktrees, lastToolUsageMap);
52448
52471
  const fullItems = applyCleanupStatus(full.items, cleanupStatusByBranch());
@@ -52526,10 +52549,11 @@ function AppSolid(props) {
52526
52549
  onMount(() => {
52527
52550
  const bunxAgentIds = getBunxAgentIds();
52528
52551
  prefetchAgentVersions(bunxAgentIds).catch(() => {});
52552
+ prefetchInstalledVersions(bunxAgentIds).catch(() => {});
52529
52553
  });
52530
52554
  createEffect(() => {
52531
52555
  if (currentScreen() === "log-list") {
52532
- logTarget();
52556
+ logPrimaryTarget();
52533
52557
  loadLogEntries(logSelectedDate());
52534
52558
  }
52535
52559
  });
@@ -53078,8 +53102,15 @@ function AppSolid(props) {
53078
53102
  const safeToCleanup = branch?.safeToCleanup === true;
53079
53103
  const isRemoteBranch = branch?.type === "remote";
53080
53104
  const isUnsafe = Boolean(branch) && !isRemoteBranch && !hasSafetyPending && (hasUncommitted || hasUnpushed || isUnmerged || !safeToCleanup);
53105
+ if (branch && hasSafetyPending) {
53106
+ setUnsafeSelectionTarget(branch.name);
53107
+ setUnsafeSelectionMessage(SAFETY_PENDING_MESSAGE);
53108
+ setUnsafeSelectionConfirmVisible(true);
53109
+ return;
53110
+ }
53081
53111
  if (branch && isUnsafe) {
53082
53112
  setUnsafeSelectionTarget(branch.name);
53113
+ setUnsafeSelectionMessage(UNSAFE_SELECTION_MESSAGE);
53083
53114
  setUnsafeSelectionConfirmVisible(true);
53084
53115
  return;
53085
53116
  }
@@ -53091,6 +53122,7 @@ function AppSolid(props) {
53091
53122
  const target = unsafeSelectionTarget();
53092
53123
  setUnsafeSelectionConfirmVisible(false);
53093
53124
  setUnsafeSelectionTarget(null);
53125
+ setUnsafeSelectionMessage(UNSAFE_SELECTION_MESSAGE);
53094
53126
  if (!confirmed || !target) {
53095
53127
  return;
53096
53128
  }
@@ -53571,7 +53603,9 @@ function AppSolid(props) {
53571
53603
  setProp(_el$, "backgroundColor", "black");
53572
53604
  setProp(_el$, "padding", 1);
53573
53605
  insert(_el$, createComponent2(ConfirmScreen, {
53574
- message: UNSAFE_SELECTION_MESSAGE,
53606
+ get message() {
53607
+ return unsafeSelectionMessage();
53608
+ },
53575
53609
  onConfirm: confirmUnsafeSelection,
53576
53610
  yesLabel: "OK",
53577
53611
  noLabel: "Cancel",