@bubblebrain-ai/bubble 0.0.1

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 (248) hide show
  1. package/README.md +70 -0
  2. package/dist/agent/evidence-tracker.d.ts +15 -0
  3. package/dist/agent/evidence-tracker.js +93 -0
  4. package/dist/agent/execution-governor.d.ts +30 -0
  5. package/dist/agent/execution-governor.js +169 -0
  6. package/dist/agent/subtask-policy.d.ts +14 -0
  7. package/dist/agent/subtask-policy.js +60 -0
  8. package/dist/agent/task-classifier.d.ts +3 -0
  9. package/dist/agent/task-classifier.js +36 -0
  10. package/dist/agent/tool-arbiter.d.ts +7 -0
  11. package/dist/agent/tool-arbiter.js +33 -0
  12. package/dist/agent/tool-intent.d.ts +20 -0
  13. package/dist/agent/tool-intent.js +176 -0
  14. package/dist/agent.d.ts +95 -0
  15. package/dist/agent.js +672 -0
  16. package/dist/approval/controller.d.ts +48 -0
  17. package/dist/approval/controller.js +78 -0
  18. package/dist/approval/danger.d.ts +13 -0
  19. package/dist/approval/danger.js +55 -0
  20. package/dist/approval/diff-hunks.d.ts +12 -0
  21. package/dist/approval/diff-hunks.js +32 -0
  22. package/dist/approval/session-cache.d.ts +35 -0
  23. package/dist/approval/session-cache.js +68 -0
  24. package/dist/approval/tool-helper.d.ts +14 -0
  25. package/dist/approval/tool-helper.js +32 -0
  26. package/dist/approval/types.d.ts +56 -0
  27. package/dist/approval/types.js +8 -0
  28. package/dist/bubble-home.d.ts +8 -0
  29. package/dist/bubble-home.js +19 -0
  30. package/dist/cli.d.ts +19 -0
  31. package/dist/cli.js +82 -0
  32. package/dist/config.d.ts +41 -0
  33. package/dist/config.js +144 -0
  34. package/dist/context/budget.d.ts +21 -0
  35. package/dist/context/budget.js +72 -0
  36. package/dist/context/compact-llm.d.ts +16 -0
  37. package/dist/context/compact-llm.js +132 -0
  38. package/dist/context/compact.d.ts +15 -0
  39. package/dist/context/compact.js +251 -0
  40. package/dist/context/overflow.d.ts +9 -0
  41. package/dist/context/overflow.js +46 -0
  42. package/dist/context/projector.d.ts +26 -0
  43. package/dist/context/projector.js +150 -0
  44. package/dist/context/prune.d.ts +9 -0
  45. package/dist/context/prune.js +111 -0
  46. package/dist/lsp/config.d.ts +18 -0
  47. package/dist/lsp/config.js +58 -0
  48. package/dist/lsp/diagnostics.d.ts +24 -0
  49. package/dist/lsp/diagnostics.js +103 -0
  50. package/dist/lsp/index.d.ts +3 -0
  51. package/dist/lsp/index.js +3 -0
  52. package/dist/lsp/service.d.ts +85 -0
  53. package/dist/lsp/service.js +695 -0
  54. package/dist/main.d.ts +5 -0
  55. package/dist/main.js +352 -0
  56. package/dist/mcp/client.d.ts +68 -0
  57. package/dist/mcp/client.js +163 -0
  58. package/dist/mcp/config.d.ts +26 -0
  59. package/dist/mcp/config.js +127 -0
  60. package/dist/mcp/manager.d.ts +55 -0
  61. package/dist/mcp/manager.js +296 -0
  62. package/dist/mcp/name.d.ts +26 -0
  63. package/dist/mcp/name.js +40 -0
  64. package/dist/mcp/transports.d.ts +53 -0
  65. package/dist/mcp/transports.js +248 -0
  66. package/dist/mcp/types.d.ts +111 -0
  67. package/dist/mcp/types.js +14 -0
  68. package/dist/memory/db.d.ts +62 -0
  69. package/dist/memory/db.js +313 -0
  70. package/dist/memory/index.d.ts +9 -0
  71. package/dist/memory/index.js +9 -0
  72. package/dist/memory/paths.d.ts +18 -0
  73. package/dist/memory/paths.js +38 -0
  74. package/dist/memory/phase1.d.ts +23 -0
  75. package/dist/memory/phase1.js +172 -0
  76. package/dist/memory/phase2.d.ts +19 -0
  77. package/dist/memory/phase2.js +100 -0
  78. package/dist/memory/prompts.d.ts +19 -0
  79. package/dist/memory/prompts.js +99 -0
  80. package/dist/memory/reset.d.ts +1 -0
  81. package/dist/memory/reset.js +13 -0
  82. package/dist/memory/start.d.ts +24 -0
  83. package/dist/memory/start.js +50 -0
  84. package/dist/memory/storage.d.ts +10 -0
  85. package/dist/memory/storage.js +82 -0
  86. package/dist/memory/store.d.ts +43 -0
  87. package/dist/memory/store.js +193 -0
  88. package/dist/memory/usage.d.ts +1 -0
  89. package/dist/memory/usage.js +38 -0
  90. package/dist/model-catalog.d.ts +20 -0
  91. package/dist/model-catalog.js +99 -0
  92. package/dist/model-config.d.ts +32 -0
  93. package/dist/model-config.js +59 -0
  94. package/dist/model-pricing.d.ts +23 -0
  95. package/dist/model-pricing.js +46 -0
  96. package/dist/oauth/index.d.ts +3 -0
  97. package/dist/oauth/index.js +2 -0
  98. package/dist/oauth/openai-codex.d.ts +9 -0
  99. package/dist/oauth/openai-codex.js +173 -0
  100. package/dist/oauth/storage.d.ts +18 -0
  101. package/dist/oauth/storage.js +60 -0
  102. package/dist/oauth/types.d.ts +15 -0
  103. package/dist/oauth/types.js +1 -0
  104. package/dist/orchestrator/default-hooks.d.ts +2 -0
  105. package/dist/orchestrator/default-hooks.js +96 -0
  106. package/dist/orchestrator/hooks.d.ts +78 -0
  107. package/dist/orchestrator/hooks.js +52 -0
  108. package/dist/orchestrator/workflow.d.ts +10 -0
  109. package/dist/orchestrator/workflow.js +22 -0
  110. package/dist/permission/mode.d.ts +23 -0
  111. package/dist/permission/mode.js +20 -0
  112. package/dist/permissions/rule.d.ts +39 -0
  113. package/dist/permissions/rule.js +234 -0
  114. package/dist/permissions/settings.d.ts +71 -0
  115. package/dist/permissions/settings.js +202 -0
  116. package/dist/permissions/types.d.ts +61 -0
  117. package/dist/permissions/types.js +14 -0
  118. package/dist/prompt/compose.d.ts +12 -0
  119. package/dist/prompt/compose.js +67 -0
  120. package/dist/prompt/environment.d.ts +12 -0
  121. package/dist/prompt/environment.js +38 -0
  122. package/dist/prompt/provider-prompts/anthropic.d.ts +1 -0
  123. package/dist/prompt/provider-prompts/anthropic.js +5 -0
  124. package/dist/prompt/provider-prompts/codex.d.ts +1 -0
  125. package/dist/prompt/provider-prompts/codex.js +5 -0
  126. package/dist/prompt/provider-prompts/default.d.ts +1 -0
  127. package/dist/prompt/provider-prompts/default.js +6 -0
  128. package/dist/prompt/provider-prompts/gemini.d.ts +1 -0
  129. package/dist/prompt/provider-prompts/gemini.js +5 -0
  130. package/dist/prompt/provider-prompts/gpt.d.ts +1 -0
  131. package/dist/prompt/provider-prompts/gpt.js +5 -0
  132. package/dist/prompt/reminders.d.ts +30 -0
  133. package/dist/prompt/reminders.js +164 -0
  134. package/dist/prompt/runtime.d.ts +12 -0
  135. package/dist/prompt/runtime.js +31 -0
  136. package/dist/prompt/skills.d.ts +2 -0
  137. package/dist/prompt/skills.js +4 -0
  138. package/dist/provider-openai-codex.d.ts +14 -0
  139. package/dist/provider-openai-codex.js +409 -0
  140. package/dist/provider-registry.d.ts +56 -0
  141. package/dist/provider-registry.js +244 -0
  142. package/dist/provider-transform.d.ts +10 -0
  143. package/dist/provider-transform.js +69 -0
  144. package/dist/provider.d.ts +31 -0
  145. package/dist/provider.js +269 -0
  146. package/dist/question/controller.d.ts +22 -0
  147. package/dist/question/controller.js +97 -0
  148. package/dist/question/index.d.ts +2 -0
  149. package/dist/question/index.js +2 -0
  150. package/dist/question/types.d.ts +42 -0
  151. package/dist/question/types.js +6 -0
  152. package/dist/session-log.d.ts +16 -0
  153. package/dist/session-log.js +267 -0
  154. package/dist/session-types.d.ts +55 -0
  155. package/dist/session-types.js +1 -0
  156. package/dist/session.d.ts +32 -0
  157. package/dist/session.js +135 -0
  158. package/dist/skills/discovery.d.ts +12 -0
  159. package/dist/skills/discovery.js +148 -0
  160. package/dist/skills/format.d.ts +2 -0
  161. package/dist/skills/format.js +47 -0
  162. package/dist/skills/frontmatter.d.ts +5 -0
  163. package/dist/skills/frontmatter.js +60 -0
  164. package/dist/skills/invocation.d.ts +8 -0
  165. package/dist/skills/invocation.js +51 -0
  166. package/dist/skills/registry.d.ts +17 -0
  167. package/dist/skills/registry.js +42 -0
  168. package/dist/skills/types.d.ts +32 -0
  169. package/dist/skills/types.js +1 -0
  170. package/dist/slash-commands/commands.d.ts +7 -0
  171. package/dist/slash-commands/commands.js +779 -0
  172. package/dist/slash-commands/index.d.ts +4 -0
  173. package/dist/slash-commands/index.js +8 -0
  174. package/dist/slash-commands/registry.d.ts +31 -0
  175. package/dist/slash-commands/registry.js +70 -0
  176. package/dist/slash-commands/types.d.ts +44 -0
  177. package/dist/slash-commands/types.js +1 -0
  178. package/dist/slash-commands/unified.d.ts +38 -0
  179. package/dist/slash-commands/unified.js +38 -0
  180. package/dist/system-prompt.d.ts +34 -0
  181. package/dist/system-prompt.js +7 -0
  182. package/dist/tools/bash.d.ts +6 -0
  183. package/dist/tools/bash.js +135 -0
  184. package/dist/tools/edit.d.ts +16 -0
  185. package/dist/tools/edit.js +95 -0
  186. package/dist/tools/exa-mcp.d.ts +3 -0
  187. package/dist/tools/exa-mcp.js +74 -0
  188. package/dist/tools/exit-plan-mode.d.ts +17 -0
  189. package/dist/tools/exit-plan-mode.js +68 -0
  190. package/dist/tools/glob.d.ts +5 -0
  191. package/dist/tools/glob.js +129 -0
  192. package/dist/tools/grep.d.ts +5 -0
  193. package/dist/tools/grep.js +111 -0
  194. package/dist/tools/index.d.ts +36 -0
  195. package/dist/tools/index.js +59 -0
  196. package/dist/tools/lsp.d.ts +4 -0
  197. package/dist/tools/lsp.js +92 -0
  198. package/dist/tools/memory.d.ts +3 -0
  199. package/dist/tools/memory.js +90 -0
  200. package/dist/tools/question.d.ts +3 -0
  201. package/dist/tools/question.js +174 -0
  202. package/dist/tools/read.d.ts +7 -0
  203. package/dist/tools/read.js +83 -0
  204. package/dist/tools/sensitive-paths.d.ts +3 -0
  205. package/dist/tools/sensitive-paths.js +24 -0
  206. package/dist/tools/skill.d.ts +5 -0
  207. package/dist/tools/skill.js +51 -0
  208. package/dist/tools/task.d.ts +2 -0
  209. package/dist/tools/task.js +57 -0
  210. package/dist/tools/todo.d.ts +12 -0
  211. package/dist/tools/todo.js +151 -0
  212. package/dist/tools/tool-search.d.ts +23 -0
  213. package/dist/tools/tool-search.js +124 -0
  214. package/dist/tools/web-fetch.d.ts +6 -0
  215. package/dist/tools/web-fetch.js +75 -0
  216. package/dist/tools/web-search.d.ts +5 -0
  217. package/dist/tools/web-search.js +49 -0
  218. package/dist/tools/write.d.ts +11 -0
  219. package/dist/tools/write.js +77 -0
  220. package/dist/tui/display-history.d.ts +35 -0
  221. package/dist/tui/display-history.js +243 -0
  222. package/dist/tui/file-mentions.d.ts +29 -0
  223. package/dist/tui/file-mentions.js +174 -0
  224. package/dist/tui/image-paste.d.ts +54 -0
  225. package/dist/tui/image-paste.js +288 -0
  226. package/dist/tui/markdown-theme-rules.d.ts +23 -0
  227. package/dist/tui/markdown-theme-rules.js +164 -0
  228. package/dist/tui/markdown-theme.d.ts +5 -0
  229. package/dist/tui/markdown-theme.js +27 -0
  230. package/dist/tui/opencode-spinner.d.ts +21 -0
  231. package/dist/tui/opencode-spinner.js +216 -0
  232. package/dist/tui/prompt-keybindings.d.ts +41 -0
  233. package/dist/tui/prompt-keybindings.js +28 -0
  234. package/dist/tui/recent-activity.d.ts +8 -0
  235. package/dist/tui/recent-activity.js +71 -0
  236. package/dist/tui/run.d.ts +39 -0
  237. package/dist/tui/run.js +5696 -0
  238. package/dist/tui/sidebar-mcp.d.ts +31 -0
  239. package/dist/tui/sidebar-mcp.js +62 -0
  240. package/dist/tui/sidebar-state.d.ts +12 -0
  241. package/dist/tui/sidebar-state.js +69 -0
  242. package/dist/types.d.ts +219 -0
  243. package/dist/types.js +4 -0
  244. package/dist/variant/thinking-level.d.ts +5 -0
  245. package/dist/variant/thinking-level.js +25 -0
  246. package/dist/variant/variant-resolver.d.ts +4 -0
  247. package/dist/variant/variant-resolver.js +12 -0
  248. package/package.json +47 -0
@@ -0,0 +1,176 @@
1
+ const SEARCH_TOKEN_CANONICAL = new Map([
2
+ ["api_key", "secret"],
3
+ ["apikey", "secret"],
4
+ ["api", "secret"],
5
+ ["key", "secret"],
6
+ ["keys", "secret"],
7
+ ["secret", "secret"],
8
+ ["secrets", "secret"],
9
+ ["token", "secret"],
10
+ ["tokens", "secret"],
11
+ ["credential", "secret"],
12
+ ["credentials", "secret"],
13
+ ["auth", "secret"],
14
+ ["password", "secret"],
15
+ ["passwd", "secret"],
16
+ ["bearer", "secret"],
17
+ ["env", "config"],
18
+ ["config", "config"],
19
+ ["dotenv", "config"],
20
+ ]);
21
+ export function analyzeToolIntent(toolCall) {
22
+ switch (toolCall.name) {
23
+ case "glob":
24
+ return {
25
+ family: "search",
26
+ search: buildSearchIntent(stringArg(toolCall.parsedArgs.pattern), stringArg(toolCall.parsedArgs.path)),
27
+ };
28
+ case "grep":
29
+ return {
30
+ family: "search",
31
+ search: buildSearchIntent(stringArg(toolCall.parsedArgs.pattern), stringArg(toolCall.parsedArgs.path), stringArg(toolCall.parsedArgs.glob)),
32
+ };
33
+ case "bash": {
34
+ const parsed = parseSearchBashCommand(stringArg(toolCall.parsedArgs.command));
35
+ if (parsed) {
36
+ return {
37
+ family: "search",
38
+ search: buildSearchIntent(parsed.pattern, parsed.path, parsed.include),
39
+ };
40
+ }
41
+ return { family: "shell" };
42
+ }
43
+ case "read":
44
+ return { family: "read" };
45
+ case "write":
46
+ return { family: "write" };
47
+ case "edit":
48
+ return { family: "edit" };
49
+ case "web_search":
50
+ case "web_fetch":
51
+ return { family: "web" };
52
+ default:
53
+ return { family: "other" };
54
+ }
55
+ }
56
+ export function parseSearchBashCommand(command) {
57
+ const trimmed = command.trim();
58
+ if (!trimmed) {
59
+ return undefined;
60
+ }
61
+ if (/[|;&><`]/.test(trimmed)) {
62
+ return undefined;
63
+ }
64
+ const tokens = shellSplit(trimmed);
65
+ if (tokens.length === 0) {
66
+ return undefined;
67
+ }
68
+ const binary = tokens[0];
69
+ if (!["grep", "rg", "ripgrep"].includes(binary)) {
70
+ return undefined;
71
+ }
72
+ const positional = [];
73
+ let include;
74
+ for (let index = 1; index < tokens.length; index++) {
75
+ const token = tokens[index];
76
+ if (!token)
77
+ continue;
78
+ if (token === "--glob" || token === "--iglob" || token === "--include") {
79
+ include = tokens[index + 1];
80
+ index += 1;
81
+ continue;
82
+ }
83
+ if (token.startsWith("--glob=") || token.startsWith("--iglob=") || token.startsWith("--include=")) {
84
+ include = token.slice(token.indexOf("=") + 1);
85
+ continue;
86
+ }
87
+ if (token.startsWith("-")) {
88
+ continue;
89
+ }
90
+ positional.push(token);
91
+ }
92
+ if (positional.length === 0) {
93
+ return undefined;
94
+ }
95
+ const [pattern, maybePath] = positional;
96
+ return {
97
+ pattern,
98
+ path: maybePath,
99
+ include,
100
+ };
101
+ }
102
+ function buildSearchIntent(pattern, path, include) {
103
+ const normalizedPath = normalizePath(path ?? ".");
104
+ const rawNormalizedPattern = normalizeRawPattern(pattern);
105
+ const normalizedTokens = canonicalizeSearchTokens(pattern);
106
+ const signature = `${normalizedPath}::${include ?? "*"}::${rawNormalizedPattern || normalizedTokens.join("|")}`;
107
+ const familyTokens = normalizedTokens.filter((token) => token === "secret" || token === "config");
108
+ const familyKey = `${normalizedPath}::${familyTokens.join("|") || normalizedTokens.slice(0, 3).join("|") || "generic-search"}`;
109
+ return {
110
+ pattern,
111
+ path,
112
+ include,
113
+ signature,
114
+ familyKey,
115
+ };
116
+ }
117
+ function canonicalizeSearchTokens(pattern) {
118
+ const normalized = normalizeRawPattern(pattern);
119
+ const tokens = normalized.split(/[^a-z0-9_]+/).filter(Boolean);
120
+ const canonical = new Set();
121
+ for (const token of tokens) {
122
+ canonical.add(SEARCH_TOKEN_CANONICAL.get(token) ?? token);
123
+ }
124
+ return [...canonical].sort();
125
+ }
126
+ function normalizeRawPattern(pattern) {
127
+ return pattern.trim().toLowerCase().replace(/\\s\+/g, " ").replace(/\s+/g, " ");
128
+ }
129
+ function normalizePath(pathValue) {
130
+ return pathValue.trim().replace(/\\/g, "/").replace(/\/+/g, "/");
131
+ }
132
+ function stringArg(value) {
133
+ return typeof value === "string" ? value : "";
134
+ }
135
+ function shellSplit(command) {
136
+ const tokens = [];
137
+ let current = "";
138
+ let quote = null;
139
+ let escaped = false;
140
+ for (const char of command) {
141
+ if (escaped) {
142
+ current += char;
143
+ escaped = false;
144
+ continue;
145
+ }
146
+ if (char === "\\") {
147
+ escaped = true;
148
+ continue;
149
+ }
150
+ if (quote) {
151
+ if (char === quote) {
152
+ quote = null;
153
+ }
154
+ else {
155
+ current += char;
156
+ }
157
+ continue;
158
+ }
159
+ if (char === "'" || char === '"') {
160
+ quote = char;
161
+ continue;
162
+ }
163
+ if (/\s/.test(char)) {
164
+ if (current) {
165
+ tokens.push(current);
166
+ current = "";
167
+ }
168
+ continue;
169
+ }
170
+ current += char;
171
+ }
172
+ if (current) {
173
+ tokens.push(current);
174
+ }
175
+ return tokens;
176
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Agent - The core decision loop.
3
+ * It maintains message state, calls the LLM, executes tools, and auto-continues.
4
+ */
5
+ import type { AgentEvent, ContentPart, PermissionMode, Message, Provider, ThinkingLevel, Todo, ToolResult, ToolRegistryEntry } from "./types.js";
6
+ import { type TurnHooks } from "./orchestrator/hooks.js";
7
+ export interface AgentOptions {
8
+ provider: Provider;
9
+ sessionID?: string;
10
+ providerId?: string;
11
+ model: string;
12
+ tools: ToolRegistryEntry[];
13
+ temperature?: number;
14
+ thinkingLevel?: ThinkingLevel;
15
+ mode?: PermissionMode;
16
+ steps?: number;
17
+ maxTurns?: number;
18
+ taskBudget?: {
19
+ total: number;
20
+ };
21
+ todos?: Todo[];
22
+ systemPrompt?: string;
23
+ onMessageAppend?: (message: Message) => void;
24
+ onToolResult?: (toolName: string, result: ToolResult) => void;
25
+ onTodosUpdate?: (todos: Todo[]) => void;
26
+ onModeUpdate?: (mode: PermissionMode) => void;
27
+ hooks?: TurnHooks[];
28
+ }
29
+ export declare class Agent {
30
+ messages: Message[];
31
+ private provider;
32
+ private sessionID?;
33
+ private _providerId;
34
+ private _model;
35
+ private tools;
36
+ private unlockedDeferred;
37
+ private temperature;
38
+ private thinkingLevel;
39
+ private _mode;
40
+ private _modeVersion;
41
+ private onModeUpdate?;
42
+ private _todos;
43
+ private _todosVersion;
44
+ private onTodosUpdate?;
45
+ private onMessageAppend?;
46
+ private onToolResult?;
47
+ private hookDefinitions;
48
+ private maxTurns?;
49
+ private taskBudget?;
50
+ private lastInputTokens;
51
+ private lastAnchorMessageCount;
52
+ constructor(options: AgentOptions);
53
+ /** Unlock a list of deferred tools so they're included in subsequent turns. */
54
+ unlockDeferredTools(names: string[]): void;
55
+ /** All deferred tools in this session (for tool_search to inspect). */
56
+ listDeferredTools(): ToolRegistryEntry[];
57
+ /** Whether a given tool is deferred and not yet unlocked. */
58
+ isDeferredAndLocked(name: string): boolean;
59
+ injectSystemReminder(content: string): void;
60
+ get model(): string;
61
+ set model(value: string);
62
+ get providerId(): string;
63
+ set providerId(value: string);
64
+ get apiModel(): string;
65
+ setProvider(provider: Provider): void;
66
+ complete(messages: Message[], options?: {
67
+ model?: string;
68
+ temperature?: number;
69
+ thinkingLevel?: ThinkingLevel;
70
+ }): Promise<string>;
71
+ get thinking(): ThinkingLevel;
72
+ set thinking(value: ThinkingLevel);
73
+ get reasoning(): ThinkingLevel;
74
+ set reasoning(value: ThinkingLevel);
75
+ get mode(): PermissionMode;
76
+ set mode(value: PermissionMode);
77
+ setMode(value: PermissionMode): void;
78
+ /** Internal: snapshot counter that bumps on every mode change. Used by run loop. */
79
+ get modeVersion(): number;
80
+ getTodos(): Todo[];
81
+ setTodos(next: Todo[]): void;
82
+ /** Internal: snapshot counter that bumps on every setTodos. Used by run loop to detect mutations. */
83
+ get todosVersion(): number;
84
+ setSystemPrompt(prompt: string): void;
85
+ run(userInput: string | ContentPart[], cwd: string): AsyncIterable<AgentEvent>;
86
+ private recoverFromOverflow;
87
+ compactResidentHistory(): void;
88
+ runSubtask(input: string | ContentPart[], cwd: string, options?: {
89
+ subtaskType?: string;
90
+ description?: string;
91
+ }): Promise<ToolResult>;
92
+ private maybeCompactResidentHistory;
93
+ private appendMessage;
94
+ private executeTool;
95
+ }