@bubblebrain-ai/bubble 0.0.4 → 0.0.6

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 (91) hide show
  1. package/dist/agent/budget-ledger.d.ts +20 -0
  2. package/dist/agent/budget-ledger.js +51 -0
  3. package/dist/agent/execution-governor.js +1 -1
  4. package/dist/agent/profiles.d.ts +59 -0
  5. package/dist/agent/profiles.js +460 -0
  6. package/dist/agent/subagent-control.d.ts +52 -0
  7. package/dist/agent/subagent-control.js +38 -0
  8. package/dist/agent/task-size.d.ts +9 -0
  9. package/dist/agent/task-size.js +33 -0
  10. package/dist/agent/tool-intent.d.ts +1 -0
  11. package/dist/agent/tool-intent.js +1 -1
  12. package/dist/agent.d.ts +60 -1
  13. package/dist/agent.js +648 -55
  14. package/dist/context/budget.js +1 -0
  15. package/dist/context/compact-llm.js +7 -6
  16. package/dist/context/compact.js +6 -6
  17. package/dist/context/projector.d.ts +3 -3
  18. package/dist/context/projector.js +32 -18
  19. package/dist/context/prune.d.ts +2 -2
  20. package/dist/context/prune.js +1 -4
  21. package/dist/main.js +12 -5
  22. package/dist/mcp/manager.js +1 -0
  23. package/dist/orchestrator/default-hooks.js +85 -35
  24. package/dist/orchestrator/hooks.d.ts +5 -3
  25. package/dist/prompt/compose.d.ts +1 -0
  26. package/dist/prompt/compose.js +11 -1
  27. package/dist/prompt/environment.js +23 -2
  28. package/dist/prompt/provider-prompts/deepseek.js +1 -2
  29. package/dist/prompt/provider-prompts/kimi.js +1 -2
  30. package/dist/prompt/reminders.d.ts +21 -2
  31. package/dist/prompt/reminders.js +53 -8
  32. package/dist/prompt/runtime.d.ts +1 -1
  33. package/dist/prompt/runtime.js +17 -23
  34. package/dist/provider-artifacts.d.ts +7 -0
  35. package/dist/provider-artifacts.js +60 -0
  36. package/dist/provider.d.ts +16 -8
  37. package/dist/provider.js +149 -34
  38. package/dist/session-log.js +3 -1
  39. package/dist/system-prompt.d.ts +2 -0
  40. package/dist/tools/agent-lifecycle.d.ts +6 -0
  41. package/dist/tools/agent-lifecycle.js +355 -0
  42. package/dist/tools/bash.d.ts +2 -1
  43. package/dist/tools/bash.js +3 -1
  44. package/dist/tools/edit-apply.d.ts +25 -0
  45. package/dist/tools/edit-apply.js +228 -0
  46. package/dist/tools/edit.d.ts +2 -1
  47. package/dist/tools/edit.js +75 -56
  48. package/dist/tools/exit-plan-mode.js +3 -1
  49. package/dist/tools/file-mutation-queue.d.ts +1 -0
  50. package/dist/tools/file-mutation-queue.js +32 -0
  51. package/dist/tools/file-state.d.ts +25 -0
  52. package/dist/tools/file-state.js +52 -0
  53. package/dist/tools/glob.js +1 -0
  54. package/dist/tools/grep.js +1 -0
  55. package/dist/tools/index.d.ts +3 -1
  56. package/dist/tools/index.js +9 -7
  57. package/dist/tools/lsp.js +2 -0
  58. package/dist/tools/memory.js +2 -0
  59. package/dist/tools/question.js +2 -0
  60. package/dist/tools/read.d.ts +2 -1
  61. package/dist/tools/read.js +6 -1
  62. package/dist/tools/skill.js +1 -0
  63. package/dist/tools/task.js +1 -0
  64. package/dist/tools/todo.js +1 -0
  65. package/dist/tools/tool-search.js +2 -1
  66. package/dist/tools/web-fetch.js +1 -0
  67. package/dist/tools/web-search.js +1 -0
  68. package/dist/tools/write.d.ts +4 -3
  69. package/dist/tools/write.js +135 -54
  70. package/dist/tui/display-history.d.ts +10 -1
  71. package/dist/tui/markdown-inline.d.ts +22 -0
  72. package/dist/tui/markdown-inline.js +68 -0
  73. package/dist/tui/render-signature.d.ts +1 -0
  74. package/dist/tui/render-signature.js +7 -0
  75. package/dist/tui/run.js +811 -274
  76. package/dist/tui/streaming-tool-args.d.ts +15 -0
  77. package/dist/tui/streaming-tool-args.js +30 -0
  78. package/dist/tui/tool-renderers/fallback.d.ts +2 -0
  79. package/dist/tui/tool-renderers/fallback.js +75 -0
  80. package/dist/tui/tool-renderers/registry.d.ts +3 -0
  81. package/dist/tui/tool-renderers/registry.js +11 -0
  82. package/dist/tui/tool-renderers/subagent.d.ts +2 -0
  83. package/dist/tui/tool-renderers/subagent.js +114 -0
  84. package/dist/tui/tool-renderers/types.d.ts +36 -0
  85. package/dist/tui/tool-renderers/types.js +1 -0
  86. package/dist/tui/tool-renderers/write-preview.d.ts +12 -0
  87. package/dist/tui/tool-renderers/write-preview.js +30 -0
  88. package/dist/tui/tool-renderers/write.d.ts +6 -0
  89. package/dist/tui/tool-renderers/write.js +88 -0
  90. package/dist/types.d.ts +105 -10
  91. package/package.json +1 -1
@@ -0,0 +1,9 @@
1
+ import type { ContentPart } from "../types.js";
2
+ /**
3
+ * Coarse "is this a small / focused task" classifier. Used to inject a hint
4
+ * that suppresses the default exploration-first protocol when the user's
5
+ * request is clearly a one-shot create or single-file tweak. Counterpart to
6
+ * `task-classifier.ts` which categorizes by *kind*, not *size*.
7
+ */
8
+ export type TaskSize = "small" | "normal";
9
+ export declare function classifyTaskSize(input: string | ContentPart[]): TaskSize;
@@ -0,0 +1,33 @@
1
+ // Two-part match: a "create" verb AND a "deliverable" noun in the same
2
+ // sentence is a strong signal of a focused, one-shot task.
3
+ const SMALL_TASK_VERBS = [
4
+ /\b(write|create|generate|make|draft|build|add)\b/i,
5
+ /帮我写|帮我创建|帮我生成|写(个|一个|一份)|新建一个|做(个|一个|一份)|生成(个|一个|一份)|搞(个|一个|一份)/i,
6
+ ];
7
+ const SMALL_TASK_NOUNS = [
8
+ /\b(file|page|component|script|snippet|function|class|test|html|css|js|ts|tsx|jsx|md|markdown|hello world)\b/i,
9
+ /(文件|页面|组件|脚本|片段|函数|类|测试|html|css|介绍|文章|页|说明|示例|demo)/i,
10
+ ];
11
+ function matchesSmallTaskPattern(text) {
12
+ return SMALL_TASK_VERBS.some((re) => re.test(text))
13
+ && SMALL_TASK_NOUNS.some((re) => re.test(text));
14
+ }
15
+ const LARGE_TASK_NEGATIONS = [
16
+ /\b(refactor|rewrite|migrate|overhaul|integrate|architect|review the codebase|whole project|across the codebase)\b/i,
17
+ /多个|批量|全部|所有|整个项目|整个仓库|架构|重构|端到端|跨模块/i,
18
+ ];
19
+ export function classifyTaskSize(input) {
20
+ const text = (typeof input === "string"
21
+ ? input
22
+ : input
23
+ .filter((part) => part.type === "text")
24
+ .map((part) => part.text)
25
+ .join("\n")).trim();
26
+ if (!text)
27
+ return "normal";
28
+ // Up to ~120 chars with a small-task verb+noun match and no negation: small.
29
+ if (text.length <= 120 && matchesSmallTaskPattern(text)) {
30
+ return LARGE_TASK_NEGATIONS.some((re) => re.test(text)) ? "normal" : "small";
31
+ }
32
+ return "normal";
33
+ }
@@ -32,3 +32,4 @@ export interface ParsedReadCommand {
32
32
  }
33
33
  export declare function parseSearchBashCommand(command: string): ParsedSearchCommand | undefined;
34
34
  export declare function parseReadBashCommand(command: string): ParsedReadCommand | undefined;
35
+ export declare function shellSplit(command: string): string[];
@@ -256,7 +256,7 @@ function parseLineCount(value) {
256
256
  const parsed = Number(value.replace(/^\+/, ""));
257
257
  return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;
258
258
  }
259
- function shellSplit(command) {
259
+ export function shellSplit(command) {
260
260
  const tokens = [];
261
261
  let current = "";
262
262
  let quote = null;
package/dist/agent.d.ts CHANGED
@@ -2,8 +2,12 @@
2
2
  * Agent - The core decision loop.
3
3
  * It maintains message state, calls the LLM, executes tools, and auto-continues.
4
4
  */
5
- import type { AgentEvent, ContentPart, PermissionMode, Message, Provider, ThinkingLevel, Todo, ToolResult, ToolRegistryEntry } from "./types.js";
5
+ import type { AgentEvent, ContentPart, PermissionMode, Message, Provider, ThinkingLevel, Todo, ToolResult, ToolRegistryEntry, ToolUpdate } from "./types.js";
6
6
  import { type TurnHooks } from "./orchestrator/hooks.js";
7
+ import { BudgetLedger } from "./agent/budget-ledger.js";
8
+ import { type AgentProfile, type SubagentRunResult } from "./agent/profiles.js";
9
+ import { type SubagentThreadSnapshot } from "./agent/subagent-control.js";
10
+ import type { SkillSummary } from "./skills/types.js";
7
11
  export declare class AgentAbortError extends Error {
8
12
  constructor(message?: string);
9
13
  }
@@ -28,6 +32,13 @@ export interface AgentOptions {
28
32
  onTodosUpdate?: (todos: Todo[]) => void;
29
33
  onModeUpdate?: (mode: PermissionMode) => void;
30
34
  hooks?: TurnHooks[];
35
+ budgetLedger?: BudgetLedger;
36
+ budgetSource?: {
37
+ runId: string;
38
+ subAgentId?: string;
39
+ };
40
+ skills?: SkillSummary[];
41
+ memoryPrompt?: string;
31
42
  }
32
43
  export declare class Agent {
33
44
  messages: Message[];
@@ -50,6 +61,12 @@ export declare class Agent {
50
61
  private hookDefinitions;
51
62
  private maxTurns?;
52
63
  private taskBudget?;
64
+ private budgetLedger?;
65
+ private budgetSource;
66
+ private skillSummaries;
67
+ private memoryPrompt?;
68
+ private subagentThreads;
69
+ private pendingSubagentUpdates;
53
70
  private lastInputTokens;
54
71
  private lastAnchorMessageCount;
55
72
  constructor(options: AgentOptions);
@@ -96,6 +113,48 @@ export declare class Agent {
96
113
  subtaskType?: string;
97
114
  description?: string;
98
115
  }): Promise<ToolResult>;
116
+ runSubAgent(input: string | ContentPart[], cwd: string, options: {
117
+ profile: AgentProfile;
118
+ runId: string;
119
+ subAgentId: string;
120
+ parentToolCallId: string;
121
+ approval?: "fail" | "disabled";
122
+ emitUpdate?: (update: ToolUpdate) => void;
123
+ description?: string;
124
+ abortSignal?: AbortSignal;
125
+ nickname?: string;
126
+ forkContext?: boolean;
127
+ }): Promise<SubagentRunResult>;
128
+ spawnSubAgent(input: string | ContentPart[], cwd: string, options: {
129
+ profile: AgentProfile;
130
+ parentToolCallId: string;
131
+ approval?: "fail" | "disabled";
132
+ description?: string;
133
+ abortSignal?: AbortSignal;
134
+ forkContext?: boolean;
135
+ }): Promise<SubagentThreadSnapshot>;
136
+ waitSubAgents(options?: {
137
+ agentIds?: string[];
138
+ timeoutMs?: number;
139
+ }): Promise<SubagentThreadSnapshot[]>;
140
+ sendSubAgentInput(agentId: string, input: string | ContentPart[], cwd: string, options?: {
141
+ interrupt?: boolean;
142
+ parentToolCallId?: string;
143
+ abortSignal?: AbortSignal;
144
+ }): Promise<SubagentThreadSnapshot>;
145
+ closeSubAgent(agentId: string): Promise<SubagentThreadSnapshot>;
146
+ listSubAgents(): SubagentThreadSnapshot[];
147
+ private createSubagentThreadRecord;
148
+ private runSubagentThread;
149
+ private runSubagentFinalSummaryTurn;
150
+ private createSubAgentInstance;
151
+ private forkMessagesForSubagent;
152
+ private buildSubagentUpdate;
153
+ private queueSubagentUpdate;
154
+ private drainSubagentToolUpdates;
155
+ private activeSubagentNicknames;
156
+ private resolveSubagentTargets;
157
+ private notifySubagentWaiters;
99
158
  private maybeCompactResidentHistory;
100
159
  private appendMessage;
101
160
  private executeTool;