@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.
- package/LICENSE +1 -1
- package/NOTICE +6 -6
- package/README.md +11 -18
- package/package.json +11 -11
- package/src/agents/loader.mjs +1 -1
- package/src/agents/workflow_loader.mjs +2 -2
- package/src/auth/{tarang-auth.mjs → bahulam-auth.mjs} +4 -3
- package/src/commands/agent.mjs +3 -3
- package/src/commands/device.mjs +2 -2
- package/src/commands/pair.mjs +2 -2
- package/src/commands/remote.mjs +3 -3
- package/src/commands/workflow.mjs +5 -5
- package/src/config/env.mjs +9 -2
- package/src/config/memory-loader.mjs +1 -1
- package/src/config/model-catalog-default.json +4 -3
- package/src/config/model-catalog.mjs +2 -0
- package/src/config/settings.mjs +2 -2
- package/src/context/prose-chunker.mjs +162 -5
- package/src/core/agent-loop.mjs +17 -0
- package/src/core/attachments.mjs +66 -4
- package/src/core/backend-url.mjs +11 -12
- package/src/core/bundled-runtime.mjs +1 -1
- package/src/core/callback-client.mjs +1 -1
- package/src/core/headless.mjs +18 -4
- package/src/core/jsonl-writer.mjs +18 -18
- package/src/core/lint-resolver.mjs +472 -0
- package/src/core/local-agent.mjs +40 -8
- package/src/core/local-store.mjs +5 -1
- package/src/core/mode-selector.mjs +1 -1
- package/src/core/output-filter.mjs +22 -26
- package/src/core/pricing.mjs +10 -3
- package/src/core/project-artifacts.mjs +3 -3
- package/src/core/project-context-loader.mjs +9 -9
- package/src/core/settings-sync.mjs +1 -1
- package/src/core/stagnation.mjs +61 -1
- package/src/core/stream-client.mjs +13 -8
- package/src/core/system-prompt.mjs +2 -2
- package/src/core/tool-executor.mjs +178 -84
- package/src/daemon/http-dashboard.mjs +400 -0
- package/src/daemon/session-core.mjs +1 -0
- package/src/local-service/agent-relay.mjs +868 -0
- package/src/local-service/approval-bridge.mjs +222 -0
- package/src/local-service/browser.mjs +24 -0
- package/src/local-service/command.mjs +155 -0
- package/src/local-service/file-access.mjs +393 -0
- package/src/local-service/machine.mjs +86 -0
- package/src/local-service/paths.mjs +29 -0
- package/src/local-service/preview-converters.mjs +260 -0
- package/src/local-service/server.mjs +2644 -0
- package/src/local-service/session-store.mjs +221 -0
- package/src/mcp/client.mjs +4 -4
- package/src/onboarding/preflight.mjs +2 -2
- package/src/terminal/agents.mjs +2 -2
- package/src/terminal/analytics.mjs +2 -6
- package/src/terminal/ansi.mjs +11 -3
- package/src/terminal/main.mjs +43 -17
- package/src/terminal/model-catalog-display.mjs +111 -0
- package/src/terminal/repl-format.mjs +4 -1
- package/src/terminal/repl-model-form.mjs +81 -14
- package/src/terminal/repl-render.mjs +37 -7
- package/src/terminal/repl-resume.mjs +2 -2
- package/src/terminal/repl-state.mjs +12 -0
- package/src/terminal/repl.mjs +248 -70
- package/src/terminal/tool-display.mjs +32 -0
- package/src/terminal/watch-state.mjs +118 -0
- package/src/tools/agent.mjs +2 -2
- package/src/tools/analyze-image.mjs +158 -0
- package/src/tools/bash.mjs +11 -9
- package/src/tools/generate-image.mjs +411 -0
- package/src/tools/lint.mjs +24 -43
- package/src/tools/project-overview.mjs +12 -12
- package/src/tools/registry.mjs +4 -0
- package/src/ui/formatter.mjs +2 -2
- package/src/ui/icons.mjs +2 -0
- package/src/ui/input-dock.mjs +7 -7
- package/src/ui/palette.mjs +1 -1
- package/src/ui/slash-commands.mjs +4 -6
- package/src/ui/spinner.mjs +1 -1
- package/src/ui/term.mjs +2 -6
- package/src/ui/tool-card.mjs +81 -6
- package/pulse/app/activity/page.tsx +0 -190
- package/pulse/app/api/activity/route.ts +0 -138
- package/pulse/app/api/benchmark/route.ts +0 -113
- package/pulse/app/api/benchmarks/route.ts +0 -195
- package/pulse/app/api/costs/route.ts +0 -88
- package/pulse/app/api/export/route.ts +0 -77
- package/pulse/app/api/history/route.ts +0 -11
- package/pulse/app/api/import/route.ts +0 -31
- package/pulse/app/api/memory/route.ts +0 -50
- package/pulse/app/api/plans/route.ts +0 -9
- package/pulse/app/api/projects/[slug]/route.ts +0 -96
- package/pulse/app/api/projects/route.ts +0 -121
- package/pulse/app/api/sessions/[id]/replay/route.ts +0 -20
- package/pulse/app/api/sessions/[id]/route.ts +0 -31
- package/pulse/app/api/sessions/route.ts +0 -112
- package/pulse/app/api/settings/route.ts +0 -14
- package/pulse/app/api/stats/route.ts +0 -143
- package/pulse/app/api/todos/route.ts +0 -9
- package/pulse/app/api/tools/route.ts +0 -160
- package/pulse/app/benchmarks/page.tsx +0 -224
- package/pulse/app/costs/page.tsx +0 -179
- package/pulse/app/export/page.tsx +0 -465
- package/pulse/app/favicon.ico +0 -0
- package/pulse/app/globals.css +0 -263
- package/pulse/app/help/page.tsx +0 -143
- package/pulse/app/history/page.tsx +0 -157
- package/pulse/app/layout.tsx +0 -46
- package/pulse/app/memory/page.tsx +0 -365
- package/pulse/app/overview-client.tsx +0 -393
- package/pulse/app/page.tsx +0 -14
- package/pulse/app/plans/page.tsx +0 -308
- package/pulse/app/projects/[slug]/page.tsx +0 -390
- package/pulse/app/projects/page.tsx +0 -110
- package/pulse/app/sessions/[id]/page.tsx +0 -243
- package/pulse/app/sessions/page.tsx +0 -39
- package/pulse/app/settings/page.tsx +0 -188
- package/pulse/app/todos/page.tsx +0 -211
- package/pulse/app/tools/page.tsx +0 -249
- package/pulse/cli.js +0 -164
- package/pulse/components/activity/day-of-week-chart.tsx +0 -35
- package/pulse/components/activity/streak-card.tsx +0 -36
- package/pulse/components/costs/cache-efficiency-panel.tsx +0 -76
- package/pulse/components/costs/cost-by-project-chart.tsx +0 -48
- package/pulse/components/costs/cost-over-time-chart.tsx +0 -95
- package/pulse/components/costs/model-token-table.tsx +0 -60
- package/pulse/components/global-search.tsx +0 -193
- package/pulse/components/keyboard-nav-provider.tsx +0 -23
- package/pulse/components/layout/bottom-nav.tsx +0 -53
- package/pulse/components/layout/client-layout.tsx +0 -31
- package/pulse/components/layout/sidebar-context.tsx +0 -50
- package/pulse/components/layout/sidebar.tsx +0 -183
- package/pulse/components/layout/top-bar.tsx +0 -121
- package/pulse/components/overview/activity-heatmap.tsx +0 -107
- package/pulse/components/overview/conversation-table.tsx +0 -148
- package/pulse/components/overview/model-breakdown-donut.tsx +0 -95
- package/pulse/components/overview/peak-hours-chart.tsx +0 -87
- package/pulse/components/overview/project-activity-donut.tsx +0 -96
- package/pulse/components/overview/stat-card.tsx +0 -102
- package/pulse/components/overview/usage-over-time-chart.tsx +0 -166
- package/pulse/components/projects/project-card.tsx +0 -175
- package/pulse/components/sessions/replay/assistant-markdown.tsx +0 -94
- package/pulse/components/sessions/replay/compaction-card.tsx +0 -25
- package/pulse/components/sessions/replay/session-sidebar.tsx +0 -231
- package/pulse/components/sessions/replay/token-accumulation-chart.tsx +0 -98
- package/pulse/components/sessions/replay/tool-call-badge.tsx +0 -127
- package/pulse/components/sessions/replay/turn-cards.tsx +0 -220
- package/pulse/components/sessions/replay/user-tool-result.tsx +0 -158
- package/pulse/components/sessions/session-badges.tsx +0 -49
- package/pulse/components/sessions/session-table.tsx +0 -299
- package/pulse/components/theme-provider.tsx +0 -44
- package/pulse/components/tools/feature-adoption-table.tsx +0 -58
- package/pulse/components/tools/mcp-server-panel.tsx +0 -45
- package/pulse/components/tools/tool-ranking-chart.tsx +0 -57
- package/pulse/components/tools/version-history-table.tsx +0 -32
- package/pulse/components/ui/alert.tsx +0 -66
- package/pulse/components/ui/badge.tsx +0 -48
- package/pulse/components/ui/breadcrumb.tsx +0 -109
- package/pulse/components/ui/button.tsx +0 -64
- package/pulse/components/ui/calendar.tsx +0 -220
- package/pulse/components/ui/card.tsx +0 -92
- package/pulse/components/ui/command.tsx +0 -158
- package/pulse/components/ui/dialog.tsx +0 -158
- package/pulse/components/ui/input.tsx +0 -21
- package/pulse/components/ui/popover.tsx +0 -89
- package/pulse/components/ui/progress.tsx +0 -31
- package/pulse/components/ui/select.tsx +0 -190
- package/pulse/components/ui/separator.tsx +0 -28
- package/pulse/components/ui/sheet.tsx +0 -143
- package/pulse/components/ui/skeleton.tsx +0 -13
- package/pulse/components/ui/table.tsx +0 -116
- package/pulse/components/ui/tabs.tsx +0 -91
- package/pulse/components/ui/tooltip.tsx +0 -57
- package/pulse/components/use-global-keyboard-nav.ts +0 -79
- package/pulse/components.json +0 -23
- package/pulse/eslint.config.mjs +0 -18
- package/pulse/lib/bahulam-paths.ts +0 -23
- package/pulse/lib/claude-reader.ts +0 -592
- package/pulse/lib/decode.ts +0 -129
- package/pulse/lib/pricing.ts +0 -102
- package/pulse/lib/replay-parser.ts +0 -165
- package/pulse/lib/tool-categories.ts +0 -140
- package/pulse/lib/utils.ts +0 -6
- package/pulse/next-env.d.ts +0 -6
- package/pulse/next.config.ts +0 -16
- package/pulse/package.json +0 -45
- package/pulse/postcss.config.mjs +0 -7
- package/pulse/public/activity.png +0 -0
- package/pulse/public/cc-lens.png +0 -0
- package/pulse/public/command-k.png +0 -0
- package/pulse/public/costs.png +0 -0
- package/pulse/public/dashboard-dark.png +0 -0
- package/pulse/public/dashboard-white.png +0 -0
- package/pulse/public/export.png +0 -0
- package/pulse/public/file.svg +0 -1
- package/pulse/public/globe.svg +0 -1
- package/pulse/public/next.svg +0 -1
- package/pulse/public/projects.png +0 -0
- package/pulse/public/session-chat.png +0 -0
- package/pulse/public/todos.png +0 -0
- package/pulse/public/tools.png +0 -0
- package/pulse/public/vercel.svg +0 -1
- package/pulse/public/window.svg +0 -1
- package/pulse/tsconfig.json +0 -34
- 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
|
|
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
|
|
2
|
+
Copyright 2026 Bahulam
|
|
3
3
|
|
|
4
|
-
This product includes software developed by
|
|
5
|
-
(https://
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
# @
|
|
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 @
|
|
22
|
+
npm install -g @bahulam/code@latest
|
|
23
23
|
```
|
|
24
24
|
|
|
25
25
|
Run without global install:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
npx @
|
|
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
|
-
##
|
|
62
|
+
## 0.1.7 Highlights
|
|
63
63
|
|
|
64
|
-
- Published
|
|
65
|
-
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
-
|
|
89
|
-
- Repository: https://github.com/raviakasapu/codekepler-npm
|
|
82
|
+
- Repository: https://github.com/BahulamAI/BahulamCode-CLI
|
|
90
83
|
|
|
91
84
|
## License
|
|
92
85
|
|
|
93
|
-
|
|
86
|
+
Apache-2.0
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bahulam/code",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"description": "Bahulam Code
|
|
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": "
|
|
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/
|
|
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
|
-
|
|
54
|
+
"web-tree-sitter": "^0.26.9",
|
|
55
|
+
"xlsx": "^0.18.5"
|
|
56
|
+
}
|
|
57
57
|
}
|
package/src/agents/loader.mjs
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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 (
|
|
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
|
}
|
package/src/commands/agent.mjs
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { resolveBackendUrl } from '../core/backend-url.mjs';
|
|
11
|
-
import {
|
|
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
|
|
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
|
|
69
|
+
const auth = new BahulamAuth();
|
|
70
70
|
return auth.loadCredentials().backendUrl || resolveBackendUrl();
|
|
71
71
|
}
|
|
72
72
|
|
package/src/commands/device.mjs
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `bahulam device list`).
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
|
-
import {
|
|
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
|
|
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`);
|
package/src/commands/pair.mjs
CHANGED
|
@@ -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 {
|
|
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
|
|
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`);
|
package/src/commands/remote.mjs
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
|
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 {
|
|
20
|
-
import {
|
|
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
|
|
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
|
|
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
|
|
543
|
+
const client = new BahulamStreamClient({
|
|
544
544
|
baseUrl,
|
|
545
545
|
token: headers.Authorization.replace(/^Bearer\s+/i, ''),
|
|
546
546
|
toolExecutor: createToolExecutor(),
|
package/src/config/env.mjs
CHANGED
|
@@ -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
|
-
|
|
31
|
-
|
|
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
|
|
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.
|
|
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,
|
package/src/config/settings.mjs
CHANGED
|
@@ -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.
|
|
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.
|
|
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;
|