@bahulam/code 0.1.6 → 0.1.8

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 (204) hide show
  1. package/LICENSE +1 -1
  2. package/NOTICE +6 -6
  3. package/README.md +11 -18
  4. package/package.json +11 -11
  5. package/src/agents/loader.mjs +1 -1
  6. package/src/agents/workflow_loader.mjs +2 -2
  7. package/src/auth/{tarang-auth.mjs → bahulam-auth.mjs} +4 -3
  8. package/src/commands/agent.mjs +3 -3
  9. package/src/commands/device.mjs +2 -2
  10. package/src/commands/pair.mjs +2 -2
  11. package/src/commands/remote.mjs +3 -3
  12. package/src/commands/workflow.mjs +5 -5
  13. package/src/config/env.mjs +9 -2
  14. package/src/config/memory-loader.mjs +1 -1
  15. package/src/config/model-catalog-default.json +4 -3
  16. package/src/config/model-catalog.mjs +2 -0
  17. package/src/config/settings.mjs +2 -2
  18. package/src/context/prose-chunker.mjs +162 -5
  19. package/src/core/agent-loop.mjs +17 -0
  20. package/src/core/attachments.mjs +66 -4
  21. package/src/core/backend-url.mjs +11 -12
  22. package/src/core/bundled-runtime.mjs +1 -1
  23. package/src/core/callback-client.mjs +1 -1
  24. package/src/core/headless.mjs +18 -4
  25. package/src/core/jsonl-writer.mjs +18 -18
  26. package/src/core/lint-resolver.mjs +472 -0
  27. package/src/core/local-agent.mjs +40 -8
  28. package/src/core/local-store.mjs +5 -1
  29. package/src/core/mode-selector.mjs +1 -1
  30. package/src/core/output-filter.mjs +22 -26
  31. package/src/core/pricing.mjs +10 -3
  32. package/src/core/project-artifacts.mjs +3 -3
  33. package/src/core/project-context-loader.mjs +9 -9
  34. package/src/core/settings-sync.mjs +1 -1
  35. package/src/core/stagnation.mjs +61 -1
  36. package/src/core/stream-client.mjs +13 -8
  37. package/src/core/system-prompt.mjs +2 -2
  38. package/src/core/tool-executor.mjs +178 -84
  39. package/src/daemon/http-dashboard.mjs +400 -0
  40. package/src/daemon/session-core.mjs +1 -0
  41. package/src/local-service/agent-relay.mjs +868 -0
  42. package/src/local-service/approval-bridge.mjs +222 -0
  43. package/src/local-service/browser.mjs +24 -0
  44. package/src/local-service/command.mjs +155 -0
  45. package/src/local-service/file-access.mjs +393 -0
  46. package/src/local-service/machine.mjs +86 -0
  47. package/src/local-service/paths.mjs +29 -0
  48. package/src/local-service/preview-converters.mjs +260 -0
  49. package/src/local-service/server.mjs +2644 -0
  50. package/src/local-service/session-store.mjs +221 -0
  51. package/src/mcp/client.mjs +4 -4
  52. package/src/onboarding/preflight.mjs +2 -2
  53. package/src/terminal/agents.mjs +2 -2
  54. package/src/terminal/analytics.mjs +2 -6
  55. package/src/terminal/ansi.mjs +11 -3
  56. package/src/terminal/main.mjs +43 -17
  57. package/src/terminal/model-catalog-display.mjs +111 -0
  58. package/src/terminal/repl-format.mjs +4 -1
  59. package/src/terminal/repl-model-form.mjs +81 -14
  60. package/src/terminal/repl-render.mjs +37 -7
  61. package/src/terminal/repl-resume.mjs +2 -2
  62. package/src/terminal/repl-state.mjs +12 -0
  63. package/src/terminal/repl.mjs +248 -70
  64. package/src/terminal/tool-display.mjs +32 -0
  65. package/src/terminal/watch-state.mjs +118 -0
  66. package/src/tools/agent.mjs +2 -2
  67. package/src/tools/analyze-image.mjs +158 -0
  68. package/src/tools/bash.mjs +11 -9
  69. package/src/tools/generate-image.mjs +411 -0
  70. package/src/tools/lint.mjs +24 -43
  71. package/src/tools/project-overview.mjs +12 -12
  72. package/src/tools/registry.mjs +4 -0
  73. package/src/ui/formatter.mjs +2 -2
  74. package/src/ui/icons.mjs +2 -0
  75. package/src/ui/input-dock.mjs +7 -7
  76. package/src/ui/palette.mjs +1 -1
  77. package/src/ui/slash-commands.mjs +4 -6
  78. package/src/ui/spinner.mjs +1 -1
  79. package/src/ui/term.mjs +2 -6
  80. package/src/ui/tool-card.mjs +81 -6
  81. package/pulse/app/activity/page.tsx +0 -190
  82. package/pulse/app/api/activity/route.ts +0 -138
  83. package/pulse/app/api/benchmark/route.ts +0 -113
  84. package/pulse/app/api/benchmarks/route.ts +0 -195
  85. package/pulse/app/api/costs/route.ts +0 -88
  86. package/pulse/app/api/export/route.ts +0 -77
  87. package/pulse/app/api/history/route.ts +0 -11
  88. package/pulse/app/api/import/route.ts +0 -31
  89. package/pulse/app/api/memory/route.ts +0 -50
  90. package/pulse/app/api/plans/route.ts +0 -9
  91. package/pulse/app/api/projects/[slug]/route.ts +0 -96
  92. package/pulse/app/api/projects/route.ts +0 -121
  93. package/pulse/app/api/sessions/[id]/replay/route.ts +0 -20
  94. package/pulse/app/api/sessions/[id]/route.ts +0 -31
  95. package/pulse/app/api/sessions/route.ts +0 -112
  96. package/pulse/app/api/settings/route.ts +0 -14
  97. package/pulse/app/api/stats/route.ts +0 -143
  98. package/pulse/app/api/todos/route.ts +0 -9
  99. package/pulse/app/api/tools/route.ts +0 -160
  100. package/pulse/app/benchmarks/page.tsx +0 -224
  101. package/pulse/app/costs/page.tsx +0 -179
  102. package/pulse/app/export/page.tsx +0 -465
  103. package/pulse/app/favicon.ico +0 -0
  104. package/pulse/app/globals.css +0 -263
  105. package/pulse/app/help/page.tsx +0 -143
  106. package/pulse/app/history/page.tsx +0 -157
  107. package/pulse/app/layout.tsx +0 -46
  108. package/pulse/app/memory/page.tsx +0 -365
  109. package/pulse/app/overview-client.tsx +0 -393
  110. package/pulse/app/page.tsx +0 -14
  111. package/pulse/app/plans/page.tsx +0 -308
  112. package/pulse/app/projects/[slug]/page.tsx +0 -390
  113. package/pulse/app/projects/page.tsx +0 -110
  114. package/pulse/app/sessions/[id]/page.tsx +0 -243
  115. package/pulse/app/sessions/page.tsx +0 -39
  116. package/pulse/app/settings/page.tsx +0 -188
  117. package/pulse/app/todos/page.tsx +0 -211
  118. package/pulse/app/tools/page.tsx +0 -249
  119. package/pulse/cli.js +0 -164
  120. package/pulse/components/activity/day-of-week-chart.tsx +0 -35
  121. package/pulse/components/activity/streak-card.tsx +0 -36
  122. package/pulse/components/costs/cache-efficiency-panel.tsx +0 -76
  123. package/pulse/components/costs/cost-by-project-chart.tsx +0 -48
  124. package/pulse/components/costs/cost-over-time-chart.tsx +0 -95
  125. package/pulse/components/costs/model-token-table.tsx +0 -60
  126. package/pulse/components/global-search.tsx +0 -193
  127. package/pulse/components/keyboard-nav-provider.tsx +0 -23
  128. package/pulse/components/layout/bottom-nav.tsx +0 -53
  129. package/pulse/components/layout/client-layout.tsx +0 -31
  130. package/pulse/components/layout/sidebar-context.tsx +0 -50
  131. package/pulse/components/layout/sidebar.tsx +0 -183
  132. package/pulse/components/layout/top-bar.tsx +0 -121
  133. package/pulse/components/overview/activity-heatmap.tsx +0 -107
  134. package/pulse/components/overview/conversation-table.tsx +0 -148
  135. package/pulse/components/overview/model-breakdown-donut.tsx +0 -95
  136. package/pulse/components/overview/peak-hours-chart.tsx +0 -87
  137. package/pulse/components/overview/project-activity-donut.tsx +0 -96
  138. package/pulse/components/overview/stat-card.tsx +0 -102
  139. package/pulse/components/overview/usage-over-time-chart.tsx +0 -166
  140. package/pulse/components/projects/project-card.tsx +0 -175
  141. package/pulse/components/sessions/replay/assistant-markdown.tsx +0 -94
  142. package/pulse/components/sessions/replay/compaction-card.tsx +0 -25
  143. package/pulse/components/sessions/replay/session-sidebar.tsx +0 -231
  144. package/pulse/components/sessions/replay/token-accumulation-chart.tsx +0 -98
  145. package/pulse/components/sessions/replay/tool-call-badge.tsx +0 -127
  146. package/pulse/components/sessions/replay/turn-cards.tsx +0 -220
  147. package/pulse/components/sessions/replay/user-tool-result.tsx +0 -158
  148. package/pulse/components/sessions/session-badges.tsx +0 -49
  149. package/pulse/components/sessions/session-table.tsx +0 -299
  150. package/pulse/components/theme-provider.tsx +0 -44
  151. package/pulse/components/tools/feature-adoption-table.tsx +0 -58
  152. package/pulse/components/tools/mcp-server-panel.tsx +0 -45
  153. package/pulse/components/tools/tool-ranking-chart.tsx +0 -57
  154. package/pulse/components/tools/version-history-table.tsx +0 -32
  155. package/pulse/components/ui/alert.tsx +0 -66
  156. package/pulse/components/ui/badge.tsx +0 -48
  157. package/pulse/components/ui/breadcrumb.tsx +0 -109
  158. package/pulse/components/ui/button.tsx +0 -64
  159. package/pulse/components/ui/calendar.tsx +0 -220
  160. package/pulse/components/ui/card.tsx +0 -92
  161. package/pulse/components/ui/command.tsx +0 -158
  162. package/pulse/components/ui/dialog.tsx +0 -158
  163. package/pulse/components/ui/input.tsx +0 -21
  164. package/pulse/components/ui/popover.tsx +0 -89
  165. package/pulse/components/ui/progress.tsx +0 -31
  166. package/pulse/components/ui/select.tsx +0 -190
  167. package/pulse/components/ui/separator.tsx +0 -28
  168. package/pulse/components/ui/sheet.tsx +0 -143
  169. package/pulse/components/ui/skeleton.tsx +0 -13
  170. package/pulse/components/ui/table.tsx +0 -116
  171. package/pulse/components/ui/tabs.tsx +0 -91
  172. package/pulse/components/ui/tooltip.tsx +0 -57
  173. package/pulse/components/use-global-keyboard-nav.ts +0 -79
  174. package/pulse/components.json +0 -23
  175. package/pulse/eslint.config.mjs +0 -18
  176. package/pulse/lib/bahulam-paths.ts +0 -23
  177. package/pulse/lib/claude-reader.ts +0 -592
  178. package/pulse/lib/decode.ts +0 -129
  179. package/pulse/lib/pricing.ts +0 -102
  180. package/pulse/lib/replay-parser.ts +0 -165
  181. package/pulse/lib/tool-categories.ts +0 -140
  182. package/pulse/lib/utils.ts +0 -6
  183. package/pulse/next-env.d.ts +0 -6
  184. package/pulse/next.config.ts +0 -16
  185. package/pulse/package.json +0 -45
  186. package/pulse/postcss.config.mjs +0 -7
  187. package/pulse/public/activity.png +0 -0
  188. package/pulse/public/cc-lens.png +0 -0
  189. package/pulse/public/command-k.png +0 -0
  190. package/pulse/public/costs.png +0 -0
  191. package/pulse/public/dashboard-dark.png +0 -0
  192. package/pulse/public/dashboard-white.png +0 -0
  193. package/pulse/public/export.png +0 -0
  194. package/pulse/public/file.svg +0 -1
  195. package/pulse/public/globe.svg +0 -1
  196. package/pulse/public/next.svg +0 -1
  197. package/pulse/public/projects.png +0 -0
  198. package/pulse/public/session-chat.png +0 -0
  199. package/pulse/public/todos.png +0 -0
  200. package/pulse/public/tools.png +0 -0
  201. package/pulse/public/vercel.svg +0 -1
  202. package/pulse/public/window.svg +0 -1
  203. package/pulse/tsconfig.json +0 -34
  204. package/pulse/types/claude.ts +0 -294
package/LICENSE CHANGED
@@ -186,7 +186,7 @@
186
186
  same "printed page" as the copyright notice for easier
187
187
  identification within third-party archives.
188
188
 
189
- Copyright 2026 axplusb.tech
189
+ Copyright 2026 Bahulam
190
190
 
191
191
  Licensed under the Apache License, Version 2.0 (the "License");
192
192
  you may not use this file except in compliance with the License.
package/NOTICE CHANGED
@@ -1,8 +1,8 @@
1
1
  Bahulam Code
2
- Copyright 2026 axplusb.tech
2
+ Copyright 2026 Bahulam
3
3
 
4
- This product includes software developed by axplusb.tech
5
- (https://axplusb.tech).
4
+ This product includes software developed by Bahulam
5
+ (https://bahulam.ai).
6
6
 
7
7
  ------------------------------------------------------------------------
8
8
  Upstream and third-party attribution
@@ -11,12 +11,12 @@ Upstream and third-party attribution
11
11
  The CLI runtime derives, in part, from the open-source open-claude-code
12
12
  project. Original work bears its own copyright and license terms; those
13
13
  files remain governed by their upstream licenses, and any modifications
14
- to them by axplusb.tech are additionally licensed under Apache License,
14
+ to them by Bahulam are additionally licensed under Apache License,
15
15
  Version 2.0 as declared in the LICENSE file at the root of this project.
16
16
 
17
17
  The Bahulam runtime bundle (@bahulam/runtime-<platform>-<arch>) ships
18
18
  with a PyArmor-obfuscated Python payload that is proprietary to
19
- axplusb.tech and is NOT covered by the Apache License. It is distributed
19
+ Bahulam and is NOT covered by the Apache License. It is distributed
20
20
  under a separate end-user license embedded in the runtime as a signed
21
21
  license JWT. Use of the runtime requires accepting that license.
22
22
 
@@ -30,7 +30,7 @@ Trademarks
30
30
  ------------------------------------------------------------------------
31
31
 
32
32
  "Bahulam", the Bahulam wordmark, the ∞ mark, and "Orca" are trademarks
33
- of axplusb.tech. The Apache License, Section 6, does not grant permission
33
+ of Bahulam. The Apache License, Section 6, does not grant permission
34
34
  to use these names, marks, or logos, except as required to describe the
35
35
  origin of the software or to reproduce the content of this NOTICE file.
36
36
 
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @bahulamai/code
1
+ # @bahulam/code
2
2
 
3
3
  **Bahulam Code** is Bahulam's AI coding agent for terminal-first software work.
4
4
  It inspects a repo, plans changes, runs tools, asks for human approval, resumes
@@ -19,13 +19,13 @@ ship with are design decisions — ones we chose not to make.
19
19
  ## Install
20
20
 
21
21
  ```bash
22
- npm install -g @bahulamai/code@latest
22
+ npm install -g @bahulam/code@latest
23
23
  ```
24
24
 
25
25
  Run without global install:
26
26
 
27
27
  ```bash
28
- npx @bahulamai/code@latest
28
+ npx @bahulam/code@latest
29
29
  ```
30
30
 
31
31
  ## Start the CLI
@@ -59,19 +59,13 @@ bahulam-code --help Full command reference
59
59
  Inside the REPL, type `/help` for slash commands (models, cache, approvals,
60
60
  skills, workflows, session tools).
61
61
 
62
- ## 2.6.1 Highlights
62
+ ## 0.1.7 Highlights
63
63
 
64
- - Published under both `@bahulam/code` and `@bahulamai/code` scopes.
65
- - Full removal of legacy `b0` references from CLI help, error messages,
66
- analytics headers, internal comments, and Pulse dashboard.
67
-
68
- ## 2.6.0 Highlights
69
-
70
- - Rebrand: `@bahulamai/b0` → `@bahulamai/code`; binary `b0` → `bahulam-code`.
71
- - Redesigned fixed input dock — labeled "Bahulam Code" identity, colored
72
- border, horizontal and vertical margins, meta row showing project, git
73
- branch, turn count, and token usage.
74
- - Extended session-context meta line under the input dock.
64
+ - Published as `@bahulam/code`.
65
+ - Local browser workspaces through `bahulam workspace open`.
66
+ - Image analysis and image generation tools for agent workflows.
67
+ - Shared project-aware lint resolver for TS/TSX, JS/JSX, MDX, Python, Go, and Rust.
68
+ - Full shell output is preserved for the agent while terminal cards stay compact.
75
69
 
76
70
  ## Development
77
71
 
@@ -85,9 +79,8 @@ See [RELEASE.md](./RELEASE.md) for the merge, PR, and npm publish checklist.
85
79
  ## Links
86
80
 
87
81
  - Website: https://bahulam.ai
88
- - Company: https://axplusb.tech
89
- - Repository: https://github.com/raviakasapu/codekepler-npm
82
+ - Repository: https://github.com/BahulamAI/BahulamCode-CLI
90
83
 
91
84
  ## License
92
85
 
93
- MIT
86
+ Apache-2.0
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bahulam/code",
3
- "version": "0.1.6",
4
- "description": "Bahulam Code \u2014 abundance, in your terminal. CLI-first, reliability-first, sub-agents, 65.6% SWE-bench Verified.",
3
+ "version": "0.1.8",
4
+ "description": "Bahulam Code abundance, in your terminal. CLI-first, reliability-first, sub-agents, 65.6% SWE-bench Verified.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "bahulam": "src/terminal/main.mjs",
@@ -10,14 +10,13 @@
10
10
  },
11
11
  "files": [
12
12
  "src/",
13
- "pulse/",
14
13
  "README.md",
15
14
  "LICENSE",
16
15
  "NOTICE"
17
16
  ],
18
17
  "scripts": {
19
18
  "start": "node src/terminal/main.mjs",
20
- "test": "BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-backend-url.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-agent-history.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-sse-client.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-tool-executor.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-project-artifacts.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-work-scope.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-skills.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-callback.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-rate-limit-display.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-preflight.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-formatter.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-terminal-rendering.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-render-queue.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-input-dock.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-live-steering-client.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-slash-commands.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-approval.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-approval-log.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-kepler-contract.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-session-manager.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-safety.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-jsonl-writer.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-analytics.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-stagnation.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-attachments.mjs",
19
+ "test": "BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-backend-url.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-agent-history.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-sse-client.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-tool-executor.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-generate-image.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-analyze-image.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-project-artifacts.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-work-scope.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-lint-resolver.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-local-service.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-skills.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-callback.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-rate-limit-display.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-preflight.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-formatter.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-terminal-rendering.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-render-queue.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-input-dock.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-live-steering-client.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-slash-commands.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-approval.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-approval-log.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-kepler-contract.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-session-manager.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-safety.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-jsonl-writer.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-analytics.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-stagnation.mjs && BAHULAM_HOME=/tmp/bahulam-code-test-home node test/test-attachments.mjs",
21
20
  "sync-catalog": "node scripts/sync-catalog.mjs",
22
21
  "prepublishOnly": "node scripts/sync-catalog.mjs"
23
22
  },
@@ -38,20 +37,21 @@
38
37
  "deepseek",
39
38
  "claude",
40
39
  "gpt",
41
- "gemini",
42
- "axplusb"
40
+ "gemini"
43
41
  ],
44
42
  "license": "Apache-2.0",
45
- "author": "axplusb.tech <hello@axplusb.tech>",
43
+ "author": "Bahulam <hello@bahulam.ai>",
46
44
  "homepage": "https://bahulam.ai/code",
47
45
  "repository": {
48
46
  "type": "git",
49
- "url": "git+https://github.com/raviakasapu/codekepler-npm.git"
47
+ "url": "git+https://github.com/BahulamAI/BahulamCode-CLI.git"
50
48
  },
51
49
  "dependencies": {
50
+ "mermaid": "^11.17.2",
51
+ "monaco-editor": "^0.56.0",
52
52
  "pdf-parse": "^1.1.1",
53
53
  "tree-sitter-wasms": "^0.1.13",
54
- "web-tree-sitter": "^0.26.9"
55
- },
56
- "optionalDependencies": {}
54
+ "web-tree-sitter": "^0.26.9",
55
+ "xlsx": "^0.18.5"
56
+ }
57
57
  }
@@ -2,7 +2,7 @@
2
2
  * Agent Loader — loads custom agent definitions from .bahulam/agents/
3
3
  *
4
4
  * Supports two formats:
5
- * - YAML: .bahulam/agents/*.yaml / *.yml (native Kepler SubAgent config)
5
+ * - YAML: .bahulam/agents/*.yaml / *.yml (native Bahulam SubAgent config)
6
6
  * - JSON: .bahulam/agents/*.json
7
7
  * - Markdown with YAML frontmatter: .bahulam/agents/*.md
8
8
  *
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Workflow Loader — loads single-agent workflow YAML files from .bahulam/workflows/
3
3
  *
4
- * Workflow YAML files follow the same structure as Kepler SubAgent YAML:
4
+ * Workflow YAML files follow the same structure as Bahulam SubAgent YAML:
5
5
  * metadata: { id, name, description, icon, tags }
6
6
  * agent: { system_prompt, model, max_iterations }
7
7
  * tools: { include: [...], exclude: [...] }
@@ -119,4 +119,4 @@ export function workflowToTemplatePayload(agent, sourcePath) {
119
119
  params,
120
120
  channel: raw.channel || 'server',
121
121
  };
122
- }
122
+ }
@@ -38,7 +38,7 @@ function readTokenFromEnv() {
38
38
  return null;
39
39
  }
40
40
 
41
- export class TarangAuth {
41
+ export class BahulamAuth {
42
42
  constructor() {
43
43
  this._config = null;
44
44
  }
@@ -206,9 +206,10 @@ export class TarangAuth {
206
206
  process.stderr.write(` Gateway: ${DIM}${creds.gatewayType}${RESET}\n`);
207
207
 
208
208
  const models = creds.models || {};
209
- if (models.orchestrator || models.reasoning || models.local) {
209
+ const planningModel = models.planning || models.orchestrator;
210
+ if (planningModel || models.reasoning || models.local) {
210
211
  process.stderr.write(`\n${BOLD} Models${RESET}\n`);
211
- if (models.orchestrator) process.stderr.write(` Orchestrator: ${DIM}${models.orchestrator}${RESET}\n`);
212
+ if (planningModel) process.stderr.write(` Planning: ${DIM}${planningModel}${RESET}\n`);
212
213
  if (models.reasoning) process.stderr.write(` Coding: ${DIM}${models.reasoning}${RESET}\n`);
213
214
  if (models.local) process.stderr.write(` Local: ${DIM}${models.local}${RESET}\n`);
214
215
  }
@@ -8,7 +8,7 @@
8
8
  */
9
9
 
10
10
  import { resolveBackendUrl } from '../core/backend-url.mjs';
11
- import { TarangAuth } from '../auth/tarang-auth.mjs';
11
+ import { BahulamAuth } from '../auth/bahulam-auth.mjs';
12
12
  import { listLocalAgents, syncAgentsToBackend, agentToSpec, agentContentHash } from '../agents/scaffold.mjs';
13
13
  import { parseAgentDefinition } from '../agents/parser.mjs';
14
14
  import fs from 'node:fs';
@@ -56,7 +56,7 @@ function printAgentUsage() {
56
56
  // ── Helpers ────────────────────────────────────────────────────
57
57
 
58
58
  function getAuth() {
59
- const auth = new TarangAuth();
59
+ const auth = new BahulamAuth();
60
60
  const creds = auth.loadCredentials();
61
61
  if (!creds.token) {
62
62
  process.stderr.write(`${RED}✗ Not authenticated. Run bahulam-code login first.${RESET}\n`);
@@ -66,7 +66,7 @@ function getAuth() {
66
66
  }
67
67
 
68
68
  function getBaseUrl() {
69
- const auth = new TarangAuth();
69
+ const auth = new BahulamAuth();
70
70
  return auth.loadCredentials().backendUrl || resolveBackendUrl();
71
71
  }
72
72
 
@@ -10,7 +10,7 @@
10
10
  * `bahulam device list`).
11
11
  */
12
12
 
13
- import { TarangAuth } from '../auth/tarang-auth.mjs';
13
+ import { BahulamAuth } from '../auth/bahulam-auth.mjs';
14
14
 
15
15
  const GATEWAY = (process.env.BAHULAM_GATEWAY_URL || 'https://gateway.bahulam.ai').replace(/\/+$/, '').replace(/\/v1$/, '');
16
16
  const RESET = '\x1b[0m';
@@ -22,7 +22,7 @@ const YELLOW = '\x1b[33m';
22
22
 
23
23
  export async function runDeviceCommand(args = []) {
24
24
  const sub = (args[0] || '').toLowerCase();
25
- const auth = new TarangAuth();
25
+ const auth = new BahulamAuth();
26
26
  const creds = auth.loadCredentials();
27
27
  if (!creds.token) {
28
28
  process.stderr.write(`${RED}Not logged in. Run ${BOLD}bahulam login${RESET}${RED} first.${RESET}\n`);
@@ -30,7 +30,7 @@ import * as fs from 'node:fs';
30
30
  import * as os from 'node:os';
31
31
  import { generateKeyPairSync, createPrivateKey, createPublicKey } from 'node:crypto';
32
32
  import { promisify } from 'node:util';
33
- import { TarangAuth } from '../auth/tarang-auth.mjs';
33
+ import { BahulamAuth } from '../auth/bahulam-auth.mjs';
34
34
 
35
35
  const GATEWAY = (process.env.BAHULAM_GATEWAY_URL || 'https://gateway.bahulam.ai').replace(/\/+$/, '').replace(/\/v1$/, '');
36
36
  const RESET = '\x1b[0m';
@@ -42,7 +42,7 @@ const YELLOW = '\x1b[33m';
42
42
  const CYAN = '\x1b[36m';
43
43
 
44
44
  export async function runPairCommand(args = []) {
45
- const auth = new TarangAuth();
45
+ const auth = new BahulamAuth();
46
46
  const creds = auth.loadCredentials();
47
47
  if (!creds.token) {
48
48
  process.stderr.write(`${RED}Not logged in. Run ${BOLD}bahulam login${RESET}${RED} first.${RESET}\n`);
@@ -13,7 +13,7 @@
13
13
  * connection — the daemon must be running. * daemon needs a device_id + keypair to authenticate to the relay.
14
14
  */
15
15
 
16
- import { TarangAuth } from '../auth/tarang-auth.mjs';
16
+ import { BahulamAuth } from '../auth/bahulam-auth.mjs';
17
17
 
18
18
  const RESET = '\x1b[0m';
19
19
  const BOLD = '\x1b[1m';
@@ -26,7 +26,7 @@ const DEFAULT_RELAY = (process.env.BAHULAM_RELAY_URL || 'wss://relay.bahulam.ai'
26
26
 
27
27
  export async function runRemoteCommand(args = []) {
28
28
  const sub = (args[0] || '').toLowerCase();
29
- const auth = new TarangAuth();
29
+ const auth = new BahulamAuth();
30
30
  auth.loadCredentials();
31
31
 
32
32
  if (sub === 'enable') return _enable(auth);
@@ -93,7 +93,7 @@ function _status(auth) {
93
93
  * public_key, peer_pubkeys } — or null if we shouldn't dial.
94
94
  */
95
95
  export function loadRemoteConfig() {
96
- const auth = new TarangAuth();
96
+ const auth = new BahulamAuth();
97
97
  const config = auth.getRawConfig() || auth.loadCredentials() && auth.getRawConfig();
98
98
  if (!config?.remote?.enabled) return null;
99
99
  if (!config?.pairing?.device_id) return null;
@@ -16,8 +16,8 @@
16
16
  */
17
17
 
18
18
  import { resolveBackendUrl } from '../core/backend-url.mjs';
19
- import { TarangAuth } from '../auth/tarang-auth.mjs';
20
- import { TarangStreamClient } from '../core/stream-client.mjs';
19
+ import { BahulamAuth } from '../auth/bahulam-auth.mjs';
20
+ import { BahulamStreamClient } from '../core/stream-client.mjs';
21
21
  import { createToolExecutor } from '../core/tool-executor.mjs';
22
22
  import { ApprovalManager } from '../core/approval.mjs';
23
23
  import { EventFormatter } from '../ui/formatter.mjs';
@@ -87,7 +87,7 @@ function printWorkflowUsage() {
87
87
  // ── Helpers ────────────────────────────────────────────────────
88
88
 
89
89
  function getAuthHeaders() {
90
- const auth = new TarangAuth();
90
+ const auth = new BahulamAuth();
91
91
  const creds = auth.loadCredentials();
92
92
  if (!creds.token) {
93
93
  process.stderr.write(`${RED}✗ Not authenticated. Run `bahulam-code login` first.${RESET}\n`);
@@ -100,7 +100,7 @@ function getAuthHeaders() {
100
100
  }
101
101
 
102
102
  function getBaseUrl() {
103
- const auth = new TarangAuth();
103
+ const auth = new BahulamAuth();
104
104
  return auth.loadCredentials().backendUrl || resolveBackendUrl();
105
105
  }
106
106
 
@@ -540,7 +540,7 @@ async function handleRunMulti(args) {
540
540
  process.exit(1);
541
541
  }
542
542
 
543
- const client = new TarangStreamClient({
543
+ const client = new BahulamStreamClient({
544
544
  baseUrl,
545
545
  token: headers.Authorization.replace(/^Bearer\s+/i, ''),
546
546
  toolExecutor: createToolExecutor(),
@@ -27,8 +27,8 @@ export const ENV_SCHEMA = {
27
27
  CLAUDE_CODE_BRIEF: { type: 'boolean', default: false, description: 'Brief output mode' },
28
28
  CLAUDE_CODE_DISABLE_CRON: { type: 'boolean', default: false, description: 'Disable cron tasks' },
29
29
  CLAUDE_CODE_ENABLE_TASKS: { type: 'boolean', default: false, description: 'Enable task system' },
30
- KEPLER_STAGNATION_DETECTION: { type: 'boolean', default: false, description: 'Detect consecutive identical tool-call loops' },
31
- KEPLER_STAGNATION_THRESHOLD: { type: 'number', default: 3, description: 'Consecutive identical calls before warning' },
30
+ BAHULAM_STAGNATION_DETECTION: { type: 'boolean', default: false, description: 'Detect repeated tool-call or no-op edit loops' },
31
+ BAHULAM_STAGNATION_THRESHOLD: { type: 'number', default: 3, description: 'Consecutive repeated calls before warning' },
32
32
  CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS: { type: 'boolean', default: false, description: 'Enable agent teams' },
33
33
  CLAUDE_CODE_DEBUG: { type: 'boolean', default: false, description: 'Debug mode' },
34
34
  CLAUDE_CODE_DISABLE_TELEMETRY: { type: 'boolean', default: false, description: 'Disable telemetry' },
@@ -44,6 +44,13 @@ export const ENV_SCHEMA = {
44
44
  // UI and Display
45
45
  SHOW_THINKING: { type: 'boolean', default: false, description: 'Show thinking blocks' },
46
46
  SHOW_TOOL_RESULTS: { type: 'boolean', default: false, description: 'Show tool results in REPL' },
47
+ BAHULAM_PLAIN: { type: 'boolean', default: false, description: 'Disable ANSI output and fixed terminal UI' },
48
+ BAHULAM_TTY_MODE: { type: 'string', default: 'rich', description: 'Terminal UI mode: rich, stable, transcript, or plain' },
49
+ BAHULAM_FIXED_INPUT: { type: 'boolean', default: true, description: 'Enable the fixed bottom input dock in rich TTY mode' },
50
+ BAHULAM_INPUT_ROWS_MAX: { type: 'number', default: 6, description: 'Maximum input rows reserved by the fixed input dock' },
51
+ BAHULAM_PROMPT_BOTTOM_PADDING: { type: 'number', default: 5, description: 'Blank rows reserved below the prompt when the fixed dock is disabled' },
52
+ BAHULAM_PASTE_FLUSH_MS: { type: 'number', default: 35, description: 'Debounce window for non-bracketed multiline paste input' },
53
+ BAHULAM_BLOCK_SEPARATOR: { type: 'string', default: 'space', description: 'Tool/content separator style: space, dotted, or off' },
47
54
  NO_COLOR: { type: 'boolean', default: false, description: 'Disable colored output' },
48
55
  TERM: { type: 'string', description: 'Terminal type' },
49
56
 
@@ -17,7 +17,7 @@ function readIfExists(filePath, maxChars = 12000) {
17
17
  }
18
18
  }
19
19
 
20
- export function loadKeplerMemory({ cwd = process.cwd() } = {}) {
20
+ export function loadBahulamMemory({ cwd = process.cwd() } = {}) {
21
21
  const files = [];
22
22
  const global = readIfExists(path.join(bahulamHome(), 'KEPLER.md'));
23
23
  if (global) files.push({ source: 'global', ...global });
@@ -1,5 +1,5 @@
1
1
  {
2
- "schema": "bahulam.models_catalog.snapshot.v1",
2
+ "schema": "bahulam.models_catalog.snapshot.v2",
3
3
  "source": "delivered_static_catalog",
4
4
  "generated_at": "2026-08-23T20:06:08.903480Z",
5
5
  "deactivate_missing": false,
@@ -10,7 +10,7 @@
10
10
  {"value": "us.anthropic.claude-opus-4-6-v1", "label": "Claude Opus 4.6 (Bedrock)", "provider": "anthropic", "inputCost": 15, "outputCost": 75, "context": 200000, "maxOutput": 32000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
11
11
  {"value": "us.anthropic.claude-sonnet-4-6", "label": "Claude Sonnet 4.6 (Bedrock)", "provider": "anthropic", "inputCost": 3, "outputCost": 15, "context": 200000, "maxOutput": 64000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
12
12
  {"value": "us.anthropic.claude-haiku-4-5-20251001-v1:0", "label": "Claude Haiku 4.5 (Bedrock)", "provider": "anthropic", "inputCost": 0.8, "outputCost": 4, "context": 200000, "maxOutput": 8192, "supportsTools": true, "supportsReasoning": false, "harnessValidated": false},
13
- {"value": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro", "provider": "google", "inputCost": 1.25, "outputCost": 10, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
13
+ {"value": "google/gemini-2.5-pro", "label": "Gemini 2.5 Pro", "provider": "google", "category": "image", "inputCost": 1.25, "outputCost": 10, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
14
14
  {"value": "google/gemini-2.5-flash", "label": "Gemini 2.5 Flash", "provider": "google", "inputCost": 0.15, "outputCost": 0.6, "context": 1048576, "maxOutput": 65535, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
15
15
  {"value": "google/gemini-2.5-flash-lite", "label": "Gemini 2.5 Flash Lite", "provider": "google", "inputCost": 0.075, "outputCost": 0.3, "context": 1048576, "maxOutput": 65535, "supportsTools": true, "supportsReasoning": false, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
16
16
  {"value": "openai/gpt-4.1", "label": "GPT-4.1", "provider": "openai", "inputCost": 2, "outputCost": 8, "context": 1047576, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": false, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
@@ -19,6 +19,7 @@
19
19
  {"value": "openai/codex-mini", "label": "Codex Mini", "provider": "openai", "inputCost": 1.5, "outputCost": 6, "context": 200000, "maxOutput": 100000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
20
20
  {"value": "deepseek/deepseek-v4-flash", "label": "DeepSeek V4 Flash", "provider": "deepseek", "inputCost": 0.098, "outputCost": 0.197, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
21
21
  {"value": "deepseek/deepseek-v4-flash-0731", "label": "DeepSeek V4 Flash (0731)", "provider": "deepseek", "inputCost": 0.098, "outputCost": 0.197, "context": 1310720, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "cacheProfile": "{\"type\": \"prefix_hash\", \"provider_hint\": \"DeepSeek\"}", "platformAccessTier": ["pro", "tier_49", "tier_99"]},
22
+ {"value": "deepseek/deepseek-v4-flash-vision-exp", "label": "DeepSeek V4 Flash Vision Exp", "provider": "deepseek", "category": "image", "inputCost": 0.22, "outputCost": 0.66, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["free", "pro", "tier_49", "tier_99"]},
22
23
  {"value": "deepseek/deepseek-v4-pro", "label": "DeepSeek V4 Pro", "provider": "deepseek", "inputCost": 0.435, "outputCost": 0.87, "context": 1048576, "maxOutput": 384000, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "cacheProfile": "{\"type\": \"prefix_hash\", \"provider_hint\": \"DeepSeek\"}", "platformAccessTier": ["pro", "tier_49", "tier_99"]},
23
24
  {"value": "deepseek/deepseek-chat-v3-0324", "label": "DeepSeek V3", "provider": "deepseek", "inputCost": 0.27, "outputCost": 1.1, "context": 163840, "maxOutput": 163840, "supportsTools": true, "supportsReasoning": false, "harnessValidated": false},
24
25
  {"value": "deepseek/deepseek-r1-0528", "label": "DeepSeek R1 0528", "provider": "deepseek", "inputCost": 0.8, "outputCost": 2.4, "context": 163840, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": true, "harnessValidated": false},
@@ -93,7 +94,7 @@
93
94
  {"value": "google/gemini-2.5-pro-preview", "label": "Google: Gemini 2.5 Pro Preview 06-05", "provider": "google", "inputCost": 1.25, "outputCost": 10.0, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
94
95
  {"value": "google/gemini-2.5-pro-preview-05-06", "label": "Google: Gemini 2.5 Pro Preview 05-06", "provider": "google", "inputCost": 1.25, "outputCost": 10.0, "context": 1048576, "maxOutput": 65535, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
95
96
  {"value": "google/gemini-3-flash-preview", "label": "Google: Gemini 3 Flash Preview", "provider": "google", "inputCost": 0.5, "outputCost": 3.0, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
96
- {"value": "google/gemini-3-pro-image", "label": "Google: Nano Banana Pro (Gemini 3 Pro Image)", "provider": "google", "inputCost": 2.0, "outputCost": 12.0, "context": 131072, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
97
+ {"value": "google/gemini-3-pro-image", "label": "Google: Nano Banana Pro (Gemini 3 Pro Image)", "provider": "google", "category": "image", "inputCost": 2.0, "outputCost": 12.0, "context": 131072, "maxOutput": 32768, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
97
98
  {"value": "google/gemini-3.1-flash-lite", "label": "Google: Gemini 3.1 Flash Lite", "provider": "google", "inputCost": 0.25, "outputCost": 1.5, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
98
99
  {"value": "google/gemini-3.1-flash-lite-preview", "label": "Google: Gemini 3.1 Flash Lite Preview", "provider": "google", "inputCost": 0.25, "outputCost": 1.5, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
99
100
  {"value": "google/gemini-3.1-pro-preview", "label": "Google: Gemini 3.1 Pro Preview", "provider": "google", "inputCost": 2.0, "outputCost": 12.0, "context": 1048576, "maxOutput": 65536, "supportsTools": true, "supportsReasoning": true, "harnessValidated": true, "platformAccessTier": ["pro", "tier_49", "tier_99"]},
@@ -31,10 +31,12 @@ let _cache = null;
31
31
  function normalizeSnapshotRow(row) {
32
32
  const id = row.value || row.id;
33
33
  if (!id) return null;
34
+ const category = row.category || row.modelCategory || row.model_category || 'text';
34
35
  return {
35
36
  id,
36
37
  provider: row.provider || (id.includes('/') ? id.split('/', 1)[0] : 'unknown'),
37
38
  label: row.label || id,
39
+ category,
38
40
  input_cost_usd_per_m: row.inputCost ?? row.input_cost_usd_per_m ?? null,
39
41
  output_cost_usd_per_m: row.outputCost ?? row.output_cost_usd_per_m ?? null,
40
42
  context_length: row.context ?? row.context_length ?? null,
@@ -118,13 +118,13 @@ function applyEnvOverrides(settings) {
118
118
  if (process.env.CLAUDE_CODE_THINKING === '1') settings.alwaysThinkingEnabled = true;
119
119
  if (process.env.CLAUDE_CODE_DISABLE_CRON === '1') settings.cronEnabled = false;
120
120
  if (process.env.CLAUDE_CODE_ENABLE_TASKS === '1') settings.enableTeams = true;
121
- const stagnationEnabled = process.env.KEPLER_STAGNATION_DETECTION;
121
+ const stagnationEnabled = process.env.BAHULAM_STAGNATION_DETECTION;
122
122
  if (stagnationEnabled !== undefined) {
123
123
  settings.stagnationDetection = ['1', 'true', 'yes', 'on'].includes(
124
124
  stagnationEnabled.toLowerCase(),
125
125
  );
126
126
  }
127
- const stagnationThreshold = process.env.KEPLER_STAGNATION_THRESHOLD;
127
+ const stagnationThreshold = process.env.BAHULAM_STAGNATION_THRESHOLD;
128
128
  if (stagnationThreshold) {
129
129
  const n = parseInt(stagnationThreshold, 10);
130
130
  if (Number.isInteger(n) && n >= 2) settings.stagnationThreshold = n;