scream-code 0.15.3 → 0.15.5

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.md CHANGED
@@ -50,6 +50,7 @@ When Scream wants to modify files or run commands, an approval panel pops up —
50
50
 
51
51
  - **Goal Loop** — autonomous, goal-driven execution with an independent judge agent and token/time budget control.
52
52
  - **Wolfpack** — unlimited parallel sub-agents (coder / explore / plan / verify / reviewer / oracle / writer / worker).
53
+ - **Subagent Collaboration** — steer running sub-agents with directed parent→child messages, request structured JSON replies via `output_schema`, and sandbox each sub-agent with runtime capability modes (read-only / read-write / execute / full).
53
54
  - **Persistent Memory** — structured pain-point memory with FTS5 full-text + tag + vector retrieval, shared across sessions.
54
55
  - **Local Knowledge Graph** — SAG-based visual knowledge base for multi-hop reasoning; import your own docs anytime.
55
56
  - **RLM Mode** — persistent Python workspace for long-running tasks, with unlimited recursive sub-agents.
@@ -139,7 +140,7 @@ Website: [scream.chat](https://scream.chat)
139
140
 
140
141
  ### Contributing
141
142
 
142
- Free and open — forks, feedback and pull requests are welcome. Scream is a lightweight agent foundation: maximize the model's own capability, don't over-constrain it with framework. Inspired by pi, pi-tui, gork, kimicli, Gemini, ohmypi, zero and others.
143
+ Free and open — forks, feedback and pull requests are welcome. Scream is a lightweight agent foundation: maximize the model's own capability, don't over-constrain it with framework. Inspired by the wider agent-tooling community.
143
144
 
144
145
  ---
145
146
 
@@ -4,8 +4,8 @@ import { dirname as __cjsShimDirname } from 'node:path';
4
4
  const __filename = __cjsShimFileURLToPath(import.meta.url);
5
5
  const __dirname = __cjsShimDirname(__filename);
6
6
  import "./suppress-sqlite-warning-C2VB0doZ.mjs";
7
- import { $t as isTodoItemShape, A as renderDiffLinesClustered, An as getInputHistoryFile, At as ENABLE_TERMINAL_FOCUS_REPORTING, B as BackgroundAgentStatusComponent, Bn as ScreamHarness, Bt as TERMINAL_THEME_LIGHT, Cn as PULSE_WAVE_FRAMES, Ct as createThemeStyles, D as toggleEmptySessionHint, Dn as saveTuiConfig, Dt as parseOsc11BackgroundTheme, E as isTurnElapsedEnabled, En as loadTuiConfig, Et as detectTerminalTheme, F as estimateTokens, Fn as CLI_USER_AGENT_PRODUCT, Ft as OSC11_RESPONSE_PREFIX_NO_ESC, G as getBreathingFrame, Gn as log, H as AgentGroupComponent, Hn as resolveScreamHome, Ht as isStreaming, I as getSharedSpeedTracker, In as PRODUCT_NAME, It as QUERY_TERMINAL_THEME, J as refineGoal, Jn as isOrphanedToolCallError, Jt as printableChar, K as resetBreathingClock, Kn as resolveGlobalLogPath, L as SkillActivationComponent, Ln as DEFAULT_CATALOG_URL, Lt as TERMINAL_FOCUS_IN, M as langFromPath, Mn as detectInstallSource, Mt as OSC11_QUERY, N as CachedContainer, Nn as CLI_COMMAND_NAME, Nt as OSC11_RESPONSE, O as ToolCallComponent, On as detectShellEnvironment, Ot as DISABLE_TERMINAL_FOCUS_REPORTING, P as ThinkingComponent, Pn as CLI_UI_MODE, Pt as OSC11_RESPONSE_PREFIX, Qt as formatErrorMessage, R as ReadGroupComponent, Rn as fetchCatalog, Rt as TERMINAL_FOCUS_OUT, S as getDaemonInstructions, Sn as PIXEL_PULSE_FRAMES, St as createMarkdownTheme, T as isEmptySessionHintDismissed, Tn as TuiLikePreferencesSchema, Tt as getColorPalette, U as WelcomeComponent, Un as MemoryMemoStore, Ut as FooterComponent, V as AssistantMessageComponent, Vt as isBusy, W as BREATHE_CYCLE_MS, Wn as flushDiagnosticLogs, Xn as SCREAM_ERROR_INFO, Xt as appendStreamingArgsPreview, Yn as ErrorCodes, Yt as STATUS_BULLET, Zt as argsRecord, _ as refreshUpdateCache, _n as isExperimentalFlagEnabled, _t as clearInfoPanelState, an as EMPTY_SESSION_HINT_URL, b as readJsonlFile, bn as isEmbeddingModelCached, bt as resolveThemeSync, c as hasDispose, cn as SESSION_TIPS, ct as handlePlanCommand, d as formatMemoryMemoForInjection, dn as getCtrlDHint, en as parseStreamingArgs, et as toTerminalHyperlink, fn as getLlmNotSetMessage, g as selectUpdateTarget, gn as sortSlashCommands, gt as supportsBalance, hn as BUILTIN_SLASH_COMMANDS, ht as refreshProviderBalance, i as buildRoleAdditionalText, in as CHARS_PER_TOKEN, j as highlightLines, jn as getLogDir, jt as ENABLE_TERMINAL_THEME_REPORTING, k as renderDiffLines, kn as getDataDir, kt as DISABLE_TERMINAL_THEME_REPORTING, l as isPlanExpandable, ln as TIP_ROTATION_INTERVAL_MS, mn as buildSkillSlashCommands, n as clearEvalPanelState, nn as stringValue, nt as getModelCycleLevel, on as EXIT_CONFIRM_WINDOW_MS, ot as handleFusionPlanCommand, pn as getNoActiveSessionMessage, q as clearGoalState, qn as isScreamError, r as openUrl, rn as truncateErrorMessage, s as disposeChildren, sn as MAIN_AGENT_ID, t as dispatchInput, tn as serializeToolResultOutput, tt as changeThinkingLevel, u as MoonLoader, un as getCtrlCHint, v as readUpdateCache, vn as setExperimentalFlags, w as UserMessageComponent, wn as TuiConfigParseError, wt as contrastTextHex, xn as startManualEmbeddingDownload, xt as createEditorTheme, y as appendJsonlLine, yn as getKnowledgeStore, z as parseReadGroupOutput, zn as saveCatalogCache, zt as TERMINAL_THEME_DARK } from "./dispatch-DGeogib-.mjs";
8
- import { a as setLocale, o as t } from "./text-input-dialog-BUXAKycx.mjs";
7
+ import { $t as isTodoItemShape, A as renderDiffLinesClustered, An as getInputHistoryFile, At as ENABLE_TERMINAL_FOCUS_REPORTING, B as BackgroundAgentStatusComponent, Bn as ScreamHarness, Bt as TERMINAL_THEME_LIGHT, Cn as PULSE_WAVE_FRAMES, Ct as createThemeStyles, D as toggleEmptySessionHint, Dn as saveTuiConfig, Dt as parseOsc11BackgroundTheme, E as isTurnElapsedEnabled, En as loadTuiConfig, Et as detectTerminalTheme, F as estimateTokens, Fn as CLI_USER_AGENT_PRODUCT, Ft as OSC11_RESPONSE_PREFIX_NO_ESC, G as getBreathingFrame, Gn as log, H as AgentGroupComponent, Hn as resolveScreamHome, Ht as isStreaming, I as getSharedSpeedTracker, In as PRODUCT_NAME, It as QUERY_TERMINAL_THEME, J as refineGoal, Jn as isOrphanedToolCallError, Jt as printableChar, K as resetBreathingClock, Kn as resolveGlobalLogPath, L as SkillActivationComponent, Ln as DEFAULT_CATALOG_URL, Lt as TERMINAL_FOCUS_IN, M as langFromPath, Mn as detectInstallSource, Mt as OSC11_QUERY, N as CachedContainer, Nn as CLI_COMMAND_NAME, Nt as OSC11_RESPONSE, O as ToolCallComponent, On as detectShellEnvironment, Ot as DISABLE_TERMINAL_FOCUS_REPORTING, P as ThinkingComponent, Pn as CLI_UI_MODE, Pt as OSC11_RESPONSE_PREFIX, Qt as formatErrorMessage, R as ReadGroupComponent, Rn as fetchCatalog, Rt as TERMINAL_FOCUS_OUT, S as getDaemonInstructions, Sn as PIXEL_PULSE_FRAMES, St as createMarkdownTheme, T as isEmptySessionHintDismissed, Tn as TuiLikePreferencesSchema, Tt as getColorPalette, U as WelcomeComponent, Un as MemoryMemoStore, Ut as FooterComponent, V as AssistantMessageComponent, Vt as isBusy, W as BREATHE_CYCLE_MS, Wn as flushDiagnosticLogs, Xn as SCREAM_ERROR_INFO, Xt as appendStreamingArgsPreview, Yn as ErrorCodes, Yt as STATUS_BULLET, Zt as argsRecord, _ as refreshUpdateCache, _n as isExperimentalFlagEnabled, _t as clearInfoPanelState, an as EMPTY_SESSION_HINT_URL, b as readJsonlFile, bn as isEmbeddingModelCached, bt as resolveThemeSync, c as hasDispose, cn as SESSION_TIPS, ct as handlePlanCommand, d as formatMemoryMemoForInjection, dn as getCtrlDHint, en as parseStreamingArgs, et as toTerminalHyperlink, fn as getLlmNotSetMessage, g as selectUpdateTarget, gn as sortSlashCommands, gt as supportsBalance, hn as BUILTIN_SLASH_COMMANDS, ht as refreshProviderBalance, i as buildRoleAdditionalText, in as CHARS_PER_TOKEN, j as highlightLines, jn as getLogDir, jt as ENABLE_TERMINAL_THEME_REPORTING, k as renderDiffLines, kn as getDataDir, kt as DISABLE_TERMINAL_THEME_REPORTING, l as isPlanExpandable, ln as TIP_ROTATION_INTERVAL_MS, mn as buildSkillSlashCommands, n as clearEvalPanelState, nn as stringValue, nt as getModelCycleLevel, on as EXIT_CONFIRM_WINDOW_MS, ot as handleFusionPlanCommand, pn as getNoActiveSessionMessage, q as clearGoalState, qn as isScreamError, r as openUrl, rn as truncateErrorMessage, s as disposeChildren, sn as MAIN_AGENT_ID, t as dispatchInput, tn as serializeToolResultOutput, tt as changeThinkingLevel, u as MoonLoader, un as getCtrlCHint, v as readUpdateCache, vn as setExperimentalFlags, w as UserMessageComponent, wn as TuiConfigParseError, wt as contrastTextHex, xn as startManualEmbeddingDownload, xt as createEditorTheme, y as appendJsonlLine, yn as getKnowledgeStore, z as parseReadGroupOutput, zn as saveCatalogCache, zt as TERMINAL_THEME_DARK } from "./dispatch-aNzh78xW.mjs";
8
+ import { a as setLocale, o as t } from "./text-input-dialog-DbYfSAjy.mjs";
9
9
  import { createRequire } from "node:module";
10
10
  import { randomBytes, randomUUID, scryptSync, timingSafeEqual } from "node:crypto";
11
11
  import { access, chmod, mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, unlink, writeFile } from "node:fs/promises";
@@ -32,7 +32,7 @@ function optionalBuildString(value) {
32
32
  return typeof value === "string" && value.length > 0 ? value : void 0;
33
33
  }
34
34
  const SCREAM_BUILD_INFO = {
35
- version: optionalBuildString("0.15.3"),
35
+ version: optionalBuildString("0.15.5"),
36
36
  channel: optionalBuildString(""),
37
37
  commit: optionalBuildString(""),
38
38
  buildTarget: optionalBuildString("darwin-arm64")
@@ -2338,6 +2338,10 @@ var SessionEventHandler = class {
2338
2338
  */
2339
2339
  lastCompactionTrigger;
2340
2340
  backgroundTaskTranscriptedTerminal = /* @__PURE__ */ new Set();
2341
+ /** Active foreground (non-background) subagents. Footer badge counts them
2342
+ * separately from background agents: foreground subagents are transient
2343
+ * (spawned by the current turn's Agent tool), background agents persist. */
2344
+ foregroundSubagentCount = 0;
2341
2345
  subagentInfo = /* @__PURE__ */ new Map();
2342
2346
  renderedSkillActivationIds = /* @__PURE__ */ new Set();
2343
2347
  renderedMcpServerStatusKeys = /* @__PURE__ */ new Map();
@@ -3096,6 +3100,8 @@ var SessionEventHandler = class {
3096
3100
  this.syncBackgroundAgentBadge();
3097
3101
  return;
3098
3102
  }
3103
+ this.foregroundSubagentCount += 1;
3104
+ this.syncBackgroundAgentBadge();
3099
3105
  let tc = streamingUI.getToolComponent(event.parentToolCallId);
3100
3106
  if (tc === void 0) {
3101
3107
  const toolCall = streamingUI.getActiveToolCall(event.parentToolCallId);
@@ -3137,13 +3143,18 @@ var SessionEventHandler = class {
3137
3143
  this.appendBackgroundAgentEntry("completed", backgroundMeta, extras);
3138
3144
  return;
3139
3145
  }
3146
+ this.foregroundSubagentCount = Math.max(0, this.foregroundSubagentCount - 1);
3147
+ this.syncBackgroundAgentBadge();
3140
3148
  const routingId = this.subagentInfo.get(event.subagentId)?.parentToolCallId ?? event.parentToolCallId;
3141
3149
  const tc = streamingUI.getToolComponent(routingId);
3142
3150
  if (tc === void 0) return;
3143
3151
  tc.onSubagentCompleted({
3144
3152
  contextTokens: event.contextTokens,
3145
3153
  usage: event.usage,
3146
- resultSummary: event.resultSummary
3154
+ resultSummary: event.resultSummary,
3155
+ turns: event.turns,
3156
+ durationMs: event.durationMs,
3157
+ toolCallCount: event.toolCallCount
3147
3158
  });
3148
3159
  streamingUI.removeToolComponentIfInactive(event.parentToolCallId);
3149
3160
  }
@@ -3166,6 +3177,8 @@ var SessionEventHandler = class {
3166
3177
  this.appendBackgroundAgentEntry("failed", backgroundMeta, { error: event.error });
3167
3178
  return;
3168
3179
  }
3180
+ this.foregroundSubagentCount = Math.max(0, this.foregroundSubagentCount - 1);
3181
+ this.syncBackgroundAgentBadge();
3169
3182
  const tc = streamingUI.getToolComponent(this.subagentInfo.get(event.subagentId)?.parentToolCallId ?? event.parentToolCallId);
3170
3183
  if (tc === void 0) return;
3171
3184
  tc.onSubagentFailed({ error: event.error });
@@ -3295,11 +3308,12 @@ var SessionEventHandler = class {
3295
3308
  if (info.taskId.startsWith("agent-")) agentTasks += 1;
3296
3309
  else bashTasks += 1;
3297
3310
  }
3298
- state.footer.setBackgroundCounts({
3311
+ state.footer?.setBackgroundCounts({
3299
3312
  bashTasks,
3300
- agentTasks
3313
+ agentTasks,
3314
+ foregroundSubagents: this.foregroundSubagentCount
3301
3315
  });
3302
- state.ui.requestRender();
3316
+ state.ui?.requestRender();
3303
3317
  }
3304
3318
  };
3305
3319
  //#endregion
@@ -3605,7 +3619,10 @@ var SessionReplayRenderer = class {
3605
3619
  sessionEventHandler.backgroundTasks = new Map(agent.background.map((info) => [info.taskId, info]));
3606
3620
  sessionEventHandler.backgroundTaskTranscriptedTerminal.clear();
3607
3621
  for (const info of agent.background) if (isTerminalBackgroundTask(info)) sessionEventHandler.backgroundTaskTranscriptedTerminal.add(info.taskId);
3608
- state.footer.setBackgroundCounts(countActiveBackgroundTasks(sessionEventHandler.backgroundTasks));
3622
+ state.footer.setBackgroundCounts({
3623
+ ...countActiveBackgroundTasks(sessionEventHandler.backgroundTasks),
3624
+ foregroundSubagents: 0
3625
+ });
3609
3626
  state.ui.requestRender();
3610
3627
  }
3611
3628
  renderRecords(agent) {
@@ -9741,7 +9758,8 @@ var SessionManager$1 = class {
9741
9758
  this.host.tasksBrowserController.close();
9742
9759
  this.host.state.footer.setBackgroundCounts({
9743
9760
  bashTasks: 0,
9744
- agentTasks: 0
9761
+ agentTasks: 0,
9762
+ foregroundSubagents: 0
9745
9763
  });
9746
9764
  this.host.streamingUI.setTodoList([]);
9747
9765
  this.host.streamingUI.setTurnId(void 0);
@@ -12425,7 +12443,7 @@ var ScreamTUI = class {
12425
12443
  const card = new OnboardingCardComponent({
12426
12444
  colors: this.state.theme.colors,
12427
12445
  onConfigure: () => {
12428
- import("./dispatch-CweYoXh3.mjs").then(({ handleConnectCommand }) => handleConnectCommand(this, "")).finally(() => {
12446
+ import("./dispatch-B23MoYWm.mjs").then(({ handleConnectCommand }) => handleConnectCommand(this, "")).finally(() => {
12429
12447
  this.restoreEditor();
12430
12448
  onDone?.();
12431
12449
  });
@@ -3,5 +3,5 @@ import { fileURLToPath as __cjsShimFileURLToPath } from 'node:url';
3
3
  import { dirname as __cjsShimDirname } from 'node:path';
4
4
  const __filename = __cjsShimFileURLToPath(import.meta.url);
5
5
  const __dirname = __cjsShimDirname(__filename);
6
- import { Kt as handleConnectCommand } from "./dispatch-DGeogib-.mjs";
6
+ import { Kt as handleConnectCommand } from "./dispatch-aNzh78xW.mjs";
7
7
  export { handleConnectCommand };