@bastani/atomic 0.8.31-alpha.1 → 0.8.31-alpha.3

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 (148) hide show
  1. package/CHANGELOG.md +17 -5
  2. package/README.md +12 -10
  3. package/dist/builtin/cursor/CHANGELOG.md +1 -1
  4. package/dist/builtin/cursor/package.json +2 -2
  5. package/dist/builtin/intercom/CHANGELOG.md +1 -1
  6. package/dist/builtin/intercom/package.json +2 -2
  7. package/dist/builtin/mcp/CHANGELOG.md +1 -1
  8. package/dist/builtin/mcp/package.json +3 -3
  9. package/dist/builtin/subagents/CHANGELOG.md +10 -1
  10. package/dist/builtin/subagents/agents/codebase-online-researcher.md +8 -8
  11. package/dist/builtin/subagents/agents/debugger.md +6 -6
  12. package/dist/builtin/subagents/package.json +4 -4
  13. package/dist/builtin/subagents/skills/effective-liteparse/SKILL.md +118 -0
  14. package/dist/builtin/subagents/skills/effective-liteparse/scripts/search.py +128 -0
  15. package/dist/builtin/subagents/skills/playwright-cli/SKILL.md +404 -0
  16. package/dist/builtin/subagents/skills/playwright-cli/references/element-attributes.md +23 -0
  17. package/dist/builtin/subagents/skills/playwright-cli/references/playwright-tests.md +39 -0
  18. package/dist/builtin/subagents/skills/playwright-cli/references/request-mocking.md +87 -0
  19. package/dist/builtin/subagents/skills/playwright-cli/references/running-code.md +241 -0
  20. package/dist/builtin/subagents/skills/playwright-cli/references/session-management.md +225 -0
  21. package/dist/builtin/subagents/skills/playwright-cli/references/spec-driven-testing.md +305 -0
  22. package/dist/builtin/subagents/skills/playwright-cli/references/storage-state.md +275 -0
  23. package/dist/builtin/subagents/skills/playwright-cli/references/test-generation.md +134 -0
  24. package/dist/builtin/subagents/skills/playwright-cli/references/tracing.md +139 -0
  25. package/dist/builtin/subagents/skills/playwright-cli/references/video-recording.md +143 -0
  26. package/dist/builtin/web-access/CHANGELOG.md +1 -1
  27. package/dist/builtin/web-access/package.json +2 -2
  28. package/dist/builtin/workflows/CHANGELOG.md +7 -1
  29. package/dist/builtin/workflows/README.md +4 -4
  30. package/dist/builtin/workflows/builtin/open-claude-design.ts +59 -56
  31. package/dist/builtin/workflows/builtin/ralph.ts +56 -3
  32. package/dist/builtin/workflows/builtin/shared-prompts.ts +1 -1
  33. package/dist/builtin/workflows/package.json +2 -2
  34. package/dist/builtin/workflows/skills/research-codebase/SKILL.md +1 -1
  35. package/dist/cli/args.d.ts.map +1 -1
  36. package/dist/cli/args.js +1 -1
  37. package/dist/cli/args.js.map +1 -1
  38. package/dist/core/agent-session.d.ts +1 -0
  39. package/dist/core/agent-session.d.ts.map +1 -1
  40. package/dist/core/agent-session.js +49 -21
  41. package/dist/core/agent-session.js.map +1 -1
  42. package/dist/core/context-window.d.ts +26 -1
  43. package/dist/core/context-window.d.ts.map +1 -1
  44. package/dist/core/context-window.js +30 -6
  45. package/dist/core/context-window.js.map +1 -1
  46. package/dist/core/copilot-model-catalog.d.ts +39 -21
  47. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  48. package/dist/core/copilot-model-catalog.js +44 -16
  49. package/dist/core/copilot-model-catalog.js.map +1 -1
  50. package/dist/core/model-registry.d.ts.map +1 -1
  51. package/dist/core/model-registry.js +6 -4
  52. package/dist/core/model-registry.js.map +1 -1
  53. package/dist/core/project-trust.d.ts.map +1 -1
  54. package/dist/core/project-trust.js +2 -1
  55. package/dist/core/project-trust.js.map +1 -1
  56. package/dist/core/sdk.d.ts.map +1 -1
  57. package/dist/core/sdk.js +18 -7
  58. package/dist/core/sdk.js.map +1 -1
  59. package/dist/core/settings-manager.d.ts +11 -2
  60. package/dist/core/settings-manager.d.ts.map +1 -1
  61. package/dist/core/settings-manager.js +62 -8
  62. package/dist/core/settings-manager.js.map +1 -1
  63. package/dist/core/system-prompt.d.ts.map +1 -1
  64. package/dist/core/system-prompt.js +1 -0
  65. package/dist/core/system-prompt.js.map +1 -1
  66. package/dist/core/tools/edit-diff.d.ts +1 -2
  67. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  68. package/dist/core/tools/edit-diff.js +1 -2
  69. package/dist/core/tools/edit-diff.js.map +1 -1
  70. package/dist/index.d.ts +2 -1
  71. package/dist/index.d.ts.map +1 -1
  72. package/dist/index.js +2 -1
  73. package/dist/index.js.map +1 -1
  74. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  75. package/dist/modes/interactive/components/config-selector.js +5 -7
  76. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  77. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  78. package/dist/modes/interactive/components/model-selector.js +2 -1
  79. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  80. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  81. package/dist/modes/interactive/components/scoped-models-selector.js +4 -1
  82. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  83. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  84. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  85. package/dist/modes/interactive/components/settings-selector.js +165 -15
  86. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  87. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  88. package/dist/modes/interactive/components/tree-selector.js +44 -4
  89. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  90. package/dist/modes/interactive/interactive-mode.d.ts +1 -1
  91. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  92. package/dist/modes/interactive/interactive-mode.js +24 -54
  93. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  94. package/dist/modes/interactive/model-search.d.ts +7 -0
  95. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  96. package/dist/modes/interactive/model-search.js +6 -0
  97. package/dist/modes/interactive/model-search.js.map +1 -0
  98. package/dist/modes/interactive/theme/theme-controller.d.ts +30 -0
  99. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  100. package/dist/modes/interactive/theme/theme-controller.js +108 -0
  101. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  102. package/dist/modes/interactive/theme/theme-schema.json +2 -1
  103. package/dist/modes/interactive/theme/theme.d.ts +5 -0
  104. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  105. package/dist/modes/interactive/theme/theme.js +70 -29
  106. package/dist/modes/interactive/theme/theme.js.map +1 -1
  107. package/dist/modes/rpc/rpc-client.d.ts +1 -1
  108. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  109. package/dist/modes/rpc/rpc-client.js +1 -1
  110. package/dist/modes/rpc/rpc-client.js.map +1 -1
  111. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  112. package/dist/modes/rpc/rpc-mode.js +1 -1
  113. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  114. package/dist/package-manager-cli.d.ts.map +1 -1
  115. package/dist/package-manager-cli.js +39 -9
  116. package/dist/package-manager-cli.js.map +1 -1
  117. package/docs/extensions.md +21 -0
  118. package/docs/models.md +3 -3
  119. package/docs/packages.md +13 -9
  120. package/docs/providers.md +3 -3
  121. package/docs/quickstart.md +14 -0
  122. package/docs/rpc.md +3 -3
  123. package/docs/sdk.md +15 -11
  124. package/docs/session-format.md +1 -1
  125. package/docs/settings.md +8 -3
  126. package/docs/themes.md +3 -1
  127. package/docs/tui.md +1 -1
  128. package/docs/usage.md +12 -9
  129. package/docs/workflows.md +9 -7
  130. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  131. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  132. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  133. package/examples/extensions/gondolin/package-lock.json +2 -2
  134. package/examples/extensions/gondolin/package.json +1 -1
  135. package/examples/extensions/preset.ts +10 -4
  136. package/examples/extensions/provider-payload.ts +5 -5
  137. package/examples/extensions/sandbox/index.ts +2 -2
  138. package/examples/extensions/sandbox/package-lock.json +3 -3
  139. package/examples/extensions/sandbox/package.json +2 -2
  140. package/examples/extensions/subagent/agents.ts +2 -2
  141. package/examples/extensions/subagent/index.ts +4 -2
  142. package/examples/extensions/with-deps/package-lock.json +2 -2
  143. package/examples/extensions/with-deps/package.json +1 -1
  144. package/package.json +5 -5
  145. package/dist/builtin/subagents/skills/browser/EXAMPLES.md +0 -151
  146. package/dist/builtin/subagents/skills/browser/LICENSE.txt +0 -21
  147. package/dist/builtin/subagents/skills/browser/REFERENCE.md +0 -451
  148. package/dist/builtin/subagents/skills/browser/SKILL.md +0 -170
@@ -71,7 +71,9 @@ import { TrustSelectorComponent } from "./components/trust-selector.js";
71
71
  import { hasProjectConfigDir, ProjectTrustStore } from "../../core/trust-manager.js";
72
72
  import { UserMessageComponent } from "./components/user-message.js";
73
73
  import { UserMessageSelectorComponent } from "./components/user-message-selector.js";
74
- import { detectTerminalBackgroundTheme, getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, initTheme, onThemeChange, setRegisteredThemes, setTheme, setThemeInstance, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
74
+ import { getModelSearchText } from "./model-search.js";
75
+ import { getAvailableThemes, getAvailableThemesWithPaths, getEditorTheme, getMarkdownTheme, getThemeByName, onThemeChange, setRegisteredThemes, stopThemeWatcher, Theme, theme, } from "./theme/theme.js";
76
+ import { InteractiveThemeController } from "./theme/theme-controller.js";
75
77
  function isExpandable(obj) {
76
78
  return (typeof obj === "object" &&
77
79
  obj !== null &&
@@ -270,23 +272,7 @@ export class InteractiveMode {
270
272
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
271
273
  // Register themes from resource loader and initialize
272
274
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
273
- initTheme(this.settingsManager.getTheme(), true);
274
- }
275
- async detectThemeIfUnset() {
276
- if (this.settingsManager.getTheme()) {
277
- return;
278
- }
279
- const detection = await detectTerminalBackgroundTheme({ ui: this.ui, timeoutMs: 100 });
280
- const result = setTheme(detection.theme, true);
281
- if (!result.success) {
282
- return;
283
- }
284
- if (detection.confidence === "high") {
285
- this.settingsManager.setTheme(detection.theme);
286
- await this.settingsManager.flush();
287
- }
288
- this.updateEditorBorderColor();
289
- this.ui.requestRender();
275
+ this.themeController = new InteractiveThemeController(this.ui, this.settingsManager, (message) => this.showError(message), () => this.updateEditorBorderColor());
290
276
  }
291
277
  getAutocompleteSourceTag(sourceInfo) {
292
278
  if (!sourceInfo) {
@@ -361,10 +347,11 @@ export class InteractiveMode {
361
347
  const items = models.map((m) => ({
362
348
  id: m.id,
363
349
  provider: m.provider,
350
+ name: m.name,
364
351
  label: `${m.provider}/${m.id}`,
365
352
  }));
366
- // Fuzzy filter by model ID + provider (allows "opus anthropic" to match)
367
- const filtered = fuzzyFilter(items, prefix, (item) => `${item.id} ${item.provider}`);
353
+ // Fuzzy filter by model ID + provider in either order.
354
+ const filtered = fuzzyFilter(items, prefix, getModelSearchText);
368
355
  if (filtered.length === 0)
369
356
  return null;
370
357
  return filtered.map((item) => ({
@@ -455,7 +442,7 @@ export class InteractiveMode {
455
442
  this.registerSignalHandlers();
456
443
  // Load changelog (only show new entries, skip for resumed sessions)
457
444
  this.changelogMarkdown = this.getChangelogForDisplay();
458
- // Add header container as first child. Populate it after detectThemeIfUnset.
445
+ // Add header container as first child. Populate it after theme initialization.
459
446
  this.ui.addChild(this.headerContainer);
460
447
  this.ui.addChild(this.chatContainer);
461
448
  this.ui.addChild(this.pendingMessagesContainer);
@@ -483,7 +470,7 @@ export class InteractiveMode {
483
470
  this.ui.start();
484
471
  recordTimeSinceReset("time-to-first-frame");
485
472
  this.isInitialized = true;
486
- await this.detectThemeIfUnset();
473
+ await this.themeController.applyFromSettings();
487
474
  // Add the quiet startup identity (unless silenced). Resource details are
488
475
  // disclosed separately in the chat canvas via the tools/resources toggle.
489
476
  if (this.options.verbose || !this.settingsManager.getQuietStartup()) {
@@ -1861,16 +1848,11 @@ export class InteractiveMode {
1861
1848
  getTheme: (name) => getThemeByName(name),
1862
1849
  setTheme: (themeOrName) => {
1863
1850
  if (themeOrName instanceof Theme) {
1864
- setThemeInstance(themeOrName);
1865
- this.ui.requestRender();
1866
- return { success: true };
1851
+ return this.themeController.setThemeInstance(themeOrName);
1867
1852
  }
1868
- const result = setTheme(themeOrName, true);
1869
- if (result.success) {
1870
- if (this.settingsManager.getTheme() !== themeOrName) {
1871
- this.settingsManager.setTheme(themeOrName);
1872
- }
1873
- this.ui.requestRender();
1853
+ const result = this.themeController.setThemeName(themeOrName);
1854
+ if (result.success && this.settingsManager.getThemeSetting() !== themeOrName) {
1855
+ this.settingsManager.setTheme(themeOrName);
1874
1856
  }
1875
1857
  return result;
1876
1858
  },
@@ -3131,6 +3113,7 @@ export class InteractiveMode {
3131
3113
  // dispatch and re-sends the signal if only its own listeners remain.
3132
3114
  if (options?.fromSignal) {
3133
3115
  await this.runtimeHost.dispose();
3116
+ this.themeController.disableAutoSync();
3134
3117
  // Drain any in-flight Kitty key release events before stopping.
3135
3118
  // This prevents escape sequences from leaking to the parent shell over slow SSH.
3136
3119
  await this.ui.terminal.drainInput(1000);
@@ -3139,6 +3122,7 @@ export class InteractiveMode {
3139
3122
  }
3140
3123
  // Drain any in-flight Kitty key release events before stopping.
3141
3124
  // This prevents escape sequences from leaking to the parent shell over slow SSH.
3125
+ this.themeController.disableAutoSync();
3142
3126
  await this.ui.terminal.drainInput(1000);
3143
3127
  this.stop();
3144
3128
  await this.runtimeHost.dispose();
@@ -3426,7 +3410,7 @@ export class InteractiveMode {
3426
3410
  this.ui.requestRender();
3427
3411
  }
3428
3412
  showPackageUpdateNotification(packages) {
3429
- const action = theme.fg("accent", `${APP_NAME} update`);
3413
+ const action = theme.fg("accent", `${APP_NAME} update --extensions`);
3430
3414
  const updateInstruction = theme.fg("muted", "Package updates are available. Run ") + action;
3431
3415
  const packageLines = packages.map((pkg) => `- ${pkg}`).join("\n");
3432
3416
  this.chatContainer.addChild(new Spacer(1));
@@ -3668,7 +3652,8 @@ export class InteractiveMode {
3668
3652
  httpIdleTimeoutMs: this.settingsManager.getHttpIdleTimeoutMs(),
3669
3653
  thinkingLevel: this.session.thinkingLevel,
3670
3654
  availableThinkingLevels: this.session.getAvailableThinkingLevels(),
3671
- currentTheme: this.settingsManager.getTheme() || "dark",
3655
+ currentTheme: this.settingsManager.getThemeSetting() || "dark",
3656
+ terminalTheme: this.themeController.getTerminalTheme(),
3672
3657
  availableThemes: getAvailableThemes(),
3673
3658
  hideThinkingBlock: this.hideThinkingBlock,
3674
3659
  collapseChangelog: this.settingsManager.getCollapseChangelog(),
@@ -3733,21 +3718,11 @@ export class InteractiveMode {
3733
3718
  this.footer.invalidate();
3734
3719
  this.updateEditorBorderColor();
3735
3720
  },
3736
- onThemeChange: (themeName) => {
3737
- const result = setTheme(themeName, true);
3738
- this.settingsManager.setTheme(themeName);
3739
- this.ui.invalidate();
3740
- if (!result.success) {
3741
- this.showError(`Failed to load theme "${themeName}": ${result.error}\nFell back to dark theme.`);
3742
- }
3743
- },
3744
- onThemePreview: (themeName) => {
3745
- const result = setTheme(themeName, true);
3746
- if (result.success) {
3747
- this.ui.invalidate();
3748
- this.ui.requestRender();
3749
- }
3721
+ onThemeChange: (themeSetting) => {
3722
+ this.settingsManager.setTheme(themeSetting);
3723
+ void this.themeController.applyFromSettings();
3750
3724
  },
3725
+ onThemePreview: (themeName) => this.themeController.preview(themeName),
3751
3726
  onHideThinkingBlockChange: (hidden) => {
3752
3727
  this.hideThinkingBlock = hidden;
3753
3728
  this.settingsManager.setHideThinkingBlock(hidden);
@@ -4692,13 +4667,7 @@ export class InteractiveMode {
4692
4667
  }
4693
4668
  setRegisteredThemes(this.session.resourceLoader.getThemes().themes);
4694
4669
  this.hideThinkingBlock = this.settingsManager.getHideThinkingBlock();
4695
- const themeName = this.settingsManager.getTheme();
4696
- const themeResult = themeName
4697
- ? setTheme(themeName, true)
4698
- : { success: true };
4699
- if (!themeResult.success) {
4700
- this.showError(`Failed to load theme "${themeName}": ${themeResult.error}\nFell back to dark theme.`);
4701
- }
4670
+ await this.themeController.applyFromSettings();
4702
4671
  const editorPaddingX = this.settingsManager.getEditorPaddingX();
4703
4672
  const autocompleteMaxVisible = this.settingsManager.getAutocompleteMaxVisible();
4704
4673
  this.defaultEditor.setPaddingX(editorPaddingX);
@@ -5279,6 +5248,7 @@ export class InteractiveMode {
5279
5248
  this.loadingAnimation.stop();
5280
5249
  this.loadingAnimation = undefined;
5281
5250
  }
5251
+ this.themeController.disableAutoSync();
5282
5252
  this.clearExtensionTerminalInputListeners();
5283
5253
  this.footer.dispose();
5284
5254
  this.footerDataProvider.dispose();