cast-code 1.0.0
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 +21 -0
- package/README.md +217 -0
- package/dist/app.module.js +45 -0
- package/dist/app.module.js.map +1 -0
- package/dist/common/common.module.js +49 -0
- package/dist/common/common.module.js.map +1 -0
- package/dist/common/constants/index.js +105 -0
- package/dist/common/constants/index.js.map +1 -0
- package/dist/common/index.js +24 -0
- package/dist/common/index.js.map +1 -0
- package/dist/common/services/config.service.js +119 -0
- package/dist/common/services/config.service.js.map +1 -0
- package/dist/common/services/llm.service.js +56 -0
- package/dist/common/services/llm.service.js.map +1 -0
- package/dist/common/services/markdown-parser.service.js +101 -0
- package/dist/common/services/markdown-parser.service.js.map +1 -0
- package/dist/common/services/markdown-renderer.service.js +220 -0
- package/dist/common/services/markdown-renderer.service.js.map +1 -0
- package/dist/common/services/multi-llm.service.js +115 -0
- package/dist/common/services/multi-llm.service.js.map +1 -0
- package/dist/common/types/index.js +20 -0
- package/dist/common/types/index.js.map +1 -0
- package/dist/common/types/markdown.types.js +6 -0
- package/dist/common/types/markdown.types.js.map +1 -0
- package/dist/main.js +84 -0
- package/dist/main.js.map +1 -0
- package/dist/modules/agents/agents.module.js +43 -0
- package/dist/modules/agents/agents.module.js.map +1 -0
- package/dist/modules/agents/definitions/architect.md +35 -0
- package/dist/modules/agents/definitions/backend.md +43 -0
- package/dist/modules/agents/definitions/coder.md +34 -0
- package/dist/modules/agents/definitions/devops.md +42 -0
- package/dist/modules/agents/definitions/frontend.md +46 -0
- package/dist/modules/agents/definitions/reviewer.md +35 -0
- package/dist/modules/agents/definitions/tester.md +41 -0
- package/dist/modules/agents/index.js +23 -0
- package/dist/modules/agents/index.js.map +1 -0
- package/dist/modules/agents/services/agent-loader.service.js +150 -0
- package/dist/modules/agents/services/agent-loader.service.js.map +1 -0
- package/dist/modules/agents/services/agent-registry.service.js +108 -0
- package/dist/modules/agents/services/agent-registry.service.js.map +1 -0
- package/dist/modules/agents/types/agent.types.js +6 -0
- package/dist/modules/agents/types/agent.types.js.map +1 -0
- package/dist/modules/agents/types/index.js +20 -0
- package/dist/modules/agents/types/index.js.map +1 -0
- package/dist/modules/config/config.module.js +38 -0
- package/dist/modules/config/config.module.js.map +1 -0
- package/dist/modules/config/index.js +24 -0
- package/dist/modules/config/index.js.map +1 -0
- package/dist/modules/config/services/config-commands.service.js +405 -0
- package/dist/modules/config/services/config-commands.service.js.map +1 -0
- package/dist/modules/config/services/config-manager.service.js +175 -0
- package/dist/modules/config/services/config-manager.service.js.map +1 -0
- package/dist/modules/config/services/init-config.service.js +238 -0
- package/dist/modules/config/services/init-config.service.js.map +1 -0
- package/dist/modules/config/types/config.types.js +163 -0
- package/dist/modules/config/types/config.types.js.map +1 -0
- package/dist/modules/config/types/index.js +20 -0
- package/dist/modules/config/types/index.js.map +1 -0
- package/dist/modules/core/core.module.js +60 -0
- package/dist/modules/core/core.module.js.map +1 -0
- package/dist/modules/core/index.js +22 -0
- package/dist/modules/core/index.js.map +1 -0
- package/dist/modules/core/services/deep-agent.service.js +575 -0
- package/dist/modules/core/services/deep-agent.service.js.map +1 -0
- package/dist/modules/core/services/plan-mode.service.js +225 -0
- package/dist/modules/core/services/plan-mode.service.js.map +1 -0
- package/dist/modules/git/git.module.js +48 -0
- package/dist/modules/git/git.module.js.map +1 -0
- package/dist/modules/git/index.js +23 -0
- package/dist/modules/git/index.js.map +1 -0
- package/dist/modules/git/services/code-review.service.js +330 -0
- package/dist/modules/git/services/code-review.service.js.map +1 -0
- package/dist/modules/git/services/commit-generator.service.js +403 -0
- package/dist/modules/git/services/commit-generator.service.js.map +1 -0
- package/dist/modules/git/services/index.js +21 -0
- package/dist/modules/git/services/index.js.map +1 -0
- package/dist/modules/git/services/monorepo-detector.service.js +338 -0
- package/dist/modules/git/services/monorepo-detector.service.js.map +1 -0
- package/dist/modules/git/services/pr-generator.service.js +429 -0
- package/dist/modules/git/services/pr-generator.service.js.map +1 -0
- package/dist/modules/git/services/release-notes.service.js +426 -0
- package/dist/modules/git/services/release-notes.service.js.map +1 -0
- package/dist/modules/git/types/git.types.js +6 -0
- package/dist/modules/git/types/git.types.js.map +1 -0
- package/dist/modules/git/types/index.js +20 -0
- package/dist/modules/git/types/index.js.map +1 -0
- package/dist/modules/mcp/catalog/mcp-templates.js +606 -0
- package/dist/modules/mcp/catalog/mcp-templates.js.map +1 -0
- package/dist/modules/mcp/index.js +23 -0
- package/dist/modules/mcp/index.js.map +1 -0
- package/dist/modules/mcp/mcp.module.js +35 -0
- package/dist/modules/mcp/mcp.module.js.map +1 -0
- package/dist/modules/mcp/services/mcp-client.service.js +289 -0
- package/dist/modules/mcp/services/mcp-client.service.js.map +1 -0
- package/dist/modules/mcp/services/mcp-registry.service.js +197 -0
- package/dist/modules/mcp/services/mcp-registry.service.js.map +1 -0
- package/dist/modules/mcp/types/index.js +20 -0
- package/dist/modules/mcp/types/index.js.map +1 -0
- package/dist/modules/mcp/types/mcp.types.js +6 -0
- package/dist/modules/mcp/types/mcp.types.js.map +1 -0
- package/dist/modules/memory/index.js +23 -0
- package/dist/modules/memory/index.js.map +1 -0
- package/dist/modules/memory/memory.module.js +35 -0
- package/dist/modules/memory/memory.module.js.map +1 -0
- package/dist/modules/memory/services/memory-tools.service.js +78 -0
- package/dist/modules/memory/services/memory-tools.service.js.map +1 -0
- package/dist/modules/memory/services/memory.service.js +169 -0
- package/dist/modules/memory/services/memory.service.js.map +1 -0
- package/dist/modules/memory/types/index.js +20 -0
- package/dist/modules/memory/types/index.js.map +1 -0
- package/dist/modules/memory/types/memory.types.js +6 -0
- package/dist/modules/memory/types/memory.types.js.map +1 -0
- package/dist/modules/mentions/index.js +22 -0
- package/dist/modules/mentions/index.js.map +1 -0
- package/dist/modules/mentions/mentions.module.js +32 -0
- package/dist/modules/mentions/mentions.module.js.map +1 -0
- package/dist/modules/mentions/services/mentions.service.js +336 -0
- package/dist/modules/mentions/services/mentions.service.js.map +1 -0
- package/dist/modules/mentions/types/index.js +20 -0
- package/dist/modules/mentions/types/index.js.map +1 -0
- package/dist/modules/mentions/types/mention.types.js +19 -0
- package/dist/modules/mentions/types/mention.types.js.map +1 -0
- package/dist/modules/permissions/index.js +23 -0
- package/dist/modules/permissions/index.js.map +1 -0
- package/dist/modules/permissions/permissions.module.js +35 -0
- package/dist/modules/permissions/permissions.module.js.map +1 -0
- package/dist/modules/permissions/services/permission.service.js +269 -0
- package/dist/modules/permissions/services/permission.service.js.map +1 -0
- package/dist/modules/permissions/services/prompt.service.js +116 -0
- package/dist/modules/permissions/services/prompt.service.js.map +1 -0
- package/dist/modules/permissions/types/permission.types.js +32 -0
- package/dist/modules/permissions/types/permission.types.js.map +1 -0
- package/dist/modules/project/index.js +24 -0
- package/dist/modules/project/index.js.map +1 -0
- package/dist/modules/project/project.module.js +38 -0
- package/dist/modules/project/project.module.js.map +1 -0
- package/dist/modules/project/services/project-analyzer.service.js +1063 -0
- package/dist/modules/project/services/project-analyzer.service.js.map +1 -0
- package/dist/modules/project/services/project-context.service.js +62 -0
- package/dist/modules/project/services/project-context.service.js.map +1 -0
- package/dist/modules/project/services/project-loader.service.js +147 -0
- package/dist/modules/project/services/project-loader.service.js.map +1 -0
- package/dist/modules/project/types/index.js +20 -0
- package/dist/modules/project/types/index.js.map +1 -0
- package/dist/modules/project/types/project.types.js +6 -0
- package/dist/modules/project/types/project.types.js.map +1 -0
- package/dist/modules/repl/index.js +21 -0
- package/dist/modules/repl/index.js.map +1 -0
- package/dist/modules/repl/repl.module.js +66 -0
- package/dist/modules/repl/repl.module.js.map +1 -0
- package/dist/modules/repl/services/commands/agent-commands.service.js +196 -0
- package/dist/modules/repl/services/commands/agent-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/git-commands.service.js +500 -0
- package/dist/modules/repl/services/commands/git-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/mcp-commands.service.js +579 -0
- package/dist/modules/repl/services/commands/mcp-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/project-commands.service.js +226 -0
- package/dist/modules/repl/services/commands/project-commands.service.js.map +1 -0
- package/dist/modules/repl/services/commands/repl-commands.service.js +254 -0
- package/dist/modules/repl/services/commands/repl-commands.service.js.map +1 -0
- package/dist/modules/repl/services/repl.service.js +647 -0
- package/dist/modules/repl/services/repl.service.js.map +1 -0
- package/dist/modules/repl/services/smart-input.js +544 -0
- package/dist/modules/repl/services/smart-input.js.map +1 -0
- package/dist/modules/repl/services/welcome-screen.service.js +117 -0
- package/dist/modules/repl/services/welcome-screen.service.js.map +1 -0
- package/dist/modules/repl/utils/prompts-with-esc.js +187 -0
- package/dist/modules/repl/utils/prompts-with-esc.js.map +1 -0
- package/dist/modules/repl/utils/theme.js +185 -0
- package/dist/modules/repl/utils/theme.js.map +1 -0
- package/dist/modules/skills/definitions/general/file-operations.md +60 -0
- package/dist/modules/skills/definitions/general/git-operations.md +59 -0
- package/dist/modules/skills/definitions/general/planning.md +86 -0
- package/dist/modules/skills/definitions/general/search.md +59 -0
- package/dist/modules/skills/definitions/specialized/api-design.md +85 -0
- package/dist/modules/skills/definitions/specialized/database-operations.md +78 -0
- package/dist/modules/skills/definitions/specialized/frontend-bootstrap.md +71 -0
- package/dist/modules/skills/definitions/specialized/react-patterns.md +77 -0
- package/dist/modules/skills/definitions/specialized/testing-strategies.md +79 -0
- package/dist/modules/skills/index.js +23 -0
- package/dist/modules/skills/index.js.map +1 -0
- package/dist/modules/skills/services/skill-loader.service.js +130 -0
- package/dist/modules/skills/services/skill-loader.service.js.map +1 -0
- package/dist/modules/skills/services/skill-registry.service.js +96 -0
- package/dist/modules/skills/services/skill-registry.service.js.map +1 -0
- package/dist/modules/skills/skills.module.js +38 -0
- package/dist/modules/skills/skills.module.js.map +1 -0
- package/dist/modules/skills/types/index.js +20 -0
- package/dist/modules/skills/types/index.js.map +1 -0
- package/dist/modules/skills/types/skill.types.js +6 -0
- package/dist/modules/skills/types/skill.types.js.map +1 -0
- package/dist/modules/tasks/index.js +24 -0
- package/dist/modules/tasks/index.js.map +1 -0
- package/dist/modules/tasks/services/plan-executor.service.js +199 -0
- package/dist/modules/tasks/services/plan-executor.service.js.map +1 -0
- package/dist/modules/tasks/services/plan-mode.service.js +118 -0
- package/dist/modules/tasks/services/plan-mode.service.js.map +1 -0
- package/dist/modules/tasks/services/plan-persistence.service.js +148 -0
- package/dist/modules/tasks/services/plan-persistence.service.js.map +1 -0
- package/dist/modules/tasks/services/task-management.service.js +255 -0
- package/dist/modules/tasks/services/task-management.service.js.map +1 -0
- package/dist/modules/tasks/services/task-tools.service.js +270 -0
- package/dist/modules/tasks/services/task-tools.service.js.map +1 -0
- package/dist/modules/tasks/tasks.module.js +49 -0
- package/dist/modules/tasks/tasks.module.js.map +1 -0
- package/dist/modules/tasks/types/task.types.js +21 -0
- package/dist/modules/tasks/types/task.types.js.map +1 -0
- package/dist/modules/tools/index.js +24 -0
- package/dist/modules/tools/index.js.map +1 -0
- package/dist/modules/tools/services/filesystem-tools.service.js +450 -0
- package/dist/modules/tools/services/filesystem-tools.service.js.map +1 -0
- package/dist/modules/tools/services/search-tools.service.js +63 -0
- package/dist/modules/tools/services/search-tools.service.js.map +1 -0
- package/dist/modules/tools/services/shell-tools.service.js +194 -0
- package/dist/modules/tools/services/shell-tools.service.js.map +1 -0
- package/dist/modules/tools/services/tools-registry.service.js +83 -0
- package/dist/modules/tools/services/tools-registry.service.js.map +1 -0
- package/dist/modules/tools/tools.module.js +46 -0
- package/dist/modules/tools/tools.module.js.map +1 -0
- package/package.json +74 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Pedro Castanheira Costa
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Cast Code
|
|
2
|
+
|
|
3
|
+
Cast Code is a multi-agent coding CLI for day-to-day engineering work.
|
|
4
|
+
It is designed to feel like an in-terminal AI teammate that can read your codebase, plan work, use tools, and delegate to specialist sub-agents.
|
|
5
|
+
|
|
6
|
+
## Why this project
|
|
7
|
+
|
|
8
|
+
Main goal: accelerate product delivery, especially frontend bootstrap work from design prototypes.
|
|
9
|
+
|
|
10
|
+
Typical target workflow:
|
|
11
|
+
- connect Figma MCP,
|
|
12
|
+
- map project context,
|
|
13
|
+
- ask Cast to scaffold screens/components/styles,
|
|
14
|
+
- let frontend engineers focus on integration and complex business flows.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
- Node.js `>= 20`
|
|
19
|
+
- npm
|
|
20
|
+
- At least one LLM provider configured (`/config init`)
|
|
21
|
+
|
|
22
|
+
## Install (global, from npm)
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install -g cast-code
|
|
26
|
+
cast
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
> Requires Node.js >= 20. Works on any Linux/macOS terminal: bash, zsh, fish, dash, ksh, and others.
|
|
30
|
+
|
|
31
|
+
### If `cast` is not found after install
|
|
32
|
+
|
|
33
|
+
The npm global bin directory may not be in your PATH. Run `npm prefix -g` to find it, then add `<prefix>/bin` to your shell:
|
|
34
|
+
|
|
35
|
+
**bash** (`~/.bashrc` or `~/.bash_profile`):
|
|
36
|
+
```bash
|
|
37
|
+
export PATH="$(npm prefix -g)/bin:$PATH"
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**zsh** (`~/.zshrc`):
|
|
41
|
+
```zsh
|
|
42
|
+
export PATH="$(npm prefix -g)/bin:$PATH"
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**fish** (`~/.config/fish/config.fish`):
|
|
46
|
+
```fish
|
|
47
|
+
fish_add_path (npm prefix -g)/bin
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
**dash / ksh / others** (`~/.profile`):
|
|
51
|
+
```sh
|
|
52
|
+
export PATH="$(npm prefix -g)/bin:$PATH"
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
After editing, reload your shell (`source ~/.zshrc`, `source ~/.bashrc`, or open a new terminal), then run `cast`.
|
|
56
|
+
|
|
57
|
+
## Install (local development)
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm install
|
|
61
|
+
npm run build
|
|
62
|
+
npm run start
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
For development mode:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
npm run start:dev
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## First Run
|
|
72
|
+
|
|
73
|
+
On first run, configure providers/models:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
/config init
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
Configuration file:
|
|
80
|
+
- `~/.cast/config.yaml`
|
|
81
|
+
|
|
82
|
+
## Frontend Daily Flow (Recommended)
|
|
83
|
+
|
|
84
|
+
1. Connect Figma MCP
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
/mcp add
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
2. Map project context
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
/init
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`/init` is the project bootstrap command. It analyzes the repo and refreshes `.cast/context.md`.
|
|
97
|
+
|
|
98
|
+
3. Validate specialists
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
/agents
|
|
102
|
+
/skills
|
|
103
|
+
/context
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
4. Prompt for scaffold generation
|
|
107
|
+
|
|
108
|
+
Example prompt:
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
Use Figma to extract main screens and create a full frontend scaffold:
|
|
112
|
+
- routes
|
|
113
|
+
- page skeletons
|
|
114
|
+
- reusable UI components (button, table, modal, form)
|
|
115
|
+
- design tokens and global styling
|
|
116
|
+
- responsive behavior
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Useful Commands
|
|
120
|
+
|
|
121
|
+
### Core
|
|
122
|
+
- `/help` show command guide
|
|
123
|
+
- `/init` analyze project and generate context
|
|
124
|
+
- `/project-deep` generate deep context + specialist brief
|
|
125
|
+
- `/context` show session, tools, agents, skills, MCP status
|
|
126
|
+
- `/clear` clear conversation history
|
|
127
|
+
- `/compact` compact context window
|
|
128
|
+
- `/exit` exit CLI
|
|
129
|
+
|
|
130
|
+
### Config
|
|
131
|
+
- `/config` config menu
|
|
132
|
+
- `/config show` show current config
|
|
133
|
+
- `/config path` print config path
|
|
134
|
+
- `/config add-provider` add provider
|
|
135
|
+
- `/config set-model` set model by purpose
|
|
136
|
+
|
|
137
|
+
### MCP
|
|
138
|
+
- `/mcp` MCP hub menu
|
|
139
|
+
- `/mcp list` list servers
|
|
140
|
+
- `/mcp tools` list tools
|
|
141
|
+
- `/mcp add` add server from templates or custom
|
|
142
|
+
- `/mcp remove` remove server
|
|
143
|
+
- `/mcp what` explain MCP
|
|
144
|
+
|
|
145
|
+
### Git
|
|
146
|
+
- `/status`, `/diff`, `/log`
|
|
147
|
+
- `/commit`, `/up`, `/split-up`, `/pr`
|
|
148
|
+
- `/review`, `/fix`, `/ident`, `/release`
|
|
149
|
+
|
|
150
|
+
### Agents & Skills
|
|
151
|
+
- `/agents`, `/agents create`
|
|
152
|
+
- `/skills`, `/skills create`
|
|
153
|
+
|
|
154
|
+
## Mentions
|
|
155
|
+
|
|
156
|
+
Use mentions to inject context directly:
|
|
157
|
+
|
|
158
|
+
- `@src/file.ts`
|
|
159
|
+
- `@path/to/dir/`
|
|
160
|
+
- `@git:status`
|
|
161
|
+
- `@git:diff`
|
|
162
|
+
|
|
163
|
+
## Plan Mode
|
|
164
|
+
|
|
165
|
+
For complex requests, Cast can enter plan mode:
|
|
166
|
+
- asks clarifying questions,
|
|
167
|
+
- generates a structured plan,
|
|
168
|
+
- allows refine/approve/cancel,
|
|
169
|
+
- executes with the approved plan as context.
|
|
170
|
+
|
|
171
|
+
## Providers and Model Purposes
|
|
172
|
+
|
|
173
|
+
Cast supports multiple providers and model purposes:
|
|
174
|
+
- `default`
|
|
175
|
+
- `subAgent`
|
|
176
|
+
- `coder`
|
|
177
|
+
- `architect`
|
|
178
|
+
- `reviewer`
|
|
179
|
+
- `planner`
|
|
180
|
+
- `cheap`
|
|
181
|
+
|
|
182
|
+
This enables cost/performance tuning by task type.
|
|
183
|
+
|
|
184
|
+
## Project Structure (high level)
|
|
185
|
+
|
|
186
|
+
- `src/modules/repl` interactive CLI and commands
|
|
187
|
+
- `src/modules/core` deep agent orchestration and system prompt
|
|
188
|
+
- `src/modules/agents` specialist sub-agents
|
|
189
|
+
- `src/modules/skills` skill definitions and knowledge
|
|
190
|
+
- `src/modules/mcp` MCP integration
|
|
191
|
+
- `src/modules/project` project analysis/context generation
|
|
192
|
+
- `src/modules/tasks` task and plan tools
|
|
193
|
+
|
|
194
|
+
## Notes
|
|
195
|
+
|
|
196
|
+
- Keep `.cast/context.md` updated for better answers.
|
|
197
|
+
- For MCP servers requiring OAuth (like Figma), authenticate after adding and restarting Cast.
|
|
198
|
+
- If no agents/skills appear, run `/context` and verify project-level `.cast/agents` and `.cast/skills`.
|
|
199
|
+
|
|
200
|
+
## Environment Variables
|
|
201
|
+
|
|
202
|
+
Before running, configure at least one LLM provider via `/config init` or set the relevant environment variables:
|
|
203
|
+
|
|
204
|
+
| Variable | Provider |
|
|
205
|
+
|---|---|
|
|
206
|
+
| `ANTHROPIC_API_KEY` | Anthropic / Claude |
|
|
207
|
+
| `OPENAI_API_KEY` | OpenAI |
|
|
208
|
+
| `GOOGLE_API_KEY` | Google Gemini |
|
|
209
|
+
|
|
210
|
+
Example:
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
export ANTHROPIC_API_KEY=sk-ant-...
|
|
214
|
+
cast
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Or create a `.env` file in your working directory with the keys above.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "AppModule", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return AppModule;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _commonmodule = require("./common/common.module");
|
|
13
|
+
const _coremodule = require("./modules/core/core.module");
|
|
14
|
+
const _replmodule = require("./modules/repl/repl.module");
|
|
15
|
+
const _permissionsmodule = require("./modules/permissions/permissions.module");
|
|
16
|
+
const _tasksmodule = require("./modules/tasks/tasks.module");
|
|
17
|
+
const _memorymodule = require("./modules/memory/memory.module");
|
|
18
|
+
const _mentionsmodule = require("./modules/mentions/mentions.module");
|
|
19
|
+
const _gitmodule = require("./modules/git/git.module");
|
|
20
|
+
const _config = require("./modules/config");
|
|
21
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
22
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
23
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
24
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
25
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
26
|
+
}
|
|
27
|
+
let AppModule = class AppModule {
|
|
28
|
+
};
|
|
29
|
+
AppModule = _ts_decorate([
|
|
30
|
+
(0, _common.Module)({
|
|
31
|
+
imports: [
|
|
32
|
+
_config.ConfigModule,
|
|
33
|
+
_commonmodule.CommonModule,
|
|
34
|
+
_coremodule.CoreModule,
|
|
35
|
+
_replmodule.ReplModule,
|
|
36
|
+
_permissionsmodule.PermissionsModule,
|
|
37
|
+
_tasksmodule.TasksModule,
|
|
38
|
+
_memorymodule.MemoryModule,
|
|
39
|
+
_mentionsmodule.MentionsModule,
|
|
40
|
+
_gitmodule.GitModule
|
|
41
|
+
]
|
|
42
|
+
})
|
|
43
|
+
], AppModule);
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=app.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/app.module.ts"],"sourcesContent":["import { Module } from '@nestjs/common';\nimport { CommonModule } from './common/common.module';\nimport { CoreModule } from './modules/core/core.module';\nimport { ReplModule } from './modules/repl/repl.module';\nimport { PermissionsModule } from './modules/permissions/permissions.module';\nimport { TasksModule } from './modules/tasks/tasks.module';\nimport { MemoryModule } from './modules/memory/memory.module';\nimport { MentionsModule } from './modules/mentions/mentions.module';\nimport { GitModule } from './modules/git/git.module';\nimport { ConfigModule } from './modules/config';\n\n@Module({\n imports: [ConfigModule, CommonModule, CoreModule, ReplModule, PermissionsModule, TasksModule, MemoryModule, MentionsModule, GitModule],\n})\nexport class AppModule {}\n"],"names":["AppModule","imports","ConfigModule","CommonModule","CoreModule","ReplModule","PermissionsModule","TasksModule","MemoryModule","MentionsModule","GitModule"],"mappings":";;;;+BAcaA;;;eAAAA;;;wBAdU;8BACM;4BACF;4BACA;mCACO;6BACN;8BACC;gCACE;2BACL;wBACG;;;;;;;AAKtB,IAAA,AAAMA,YAAN,MAAMA;AAAW;;;QAFtBC,SAAS;YAACC,oBAAY;YAAEC,0BAAY;YAAEC,sBAAU;YAAEC,sBAAU;YAAEC,oCAAiB;YAAEC,wBAAW;YAAEC,0BAAY;YAAEC,8BAAc;YAAEC,oBAAS;SAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "CommonModule", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return CommonModule;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _markdownparserservice = require("./services/markdown-parser.service");
|
|
13
|
+
const _llmservice = require("./services/llm.service");
|
|
14
|
+
const _multillmservice = require("./services/multi-llm.service");
|
|
15
|
+
const _configservice = require("./services/config.service");
|
|
16
|
+
const _markdownrendererservice = require("./services/markdown-renderer.service");
|
|
17
|
+
const _config = require("../modules/config");
|
|
18
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
}
|
|
24
|
+
let CommonModule = class CommonModule {
|
|
25
|
+
};
|
|
26
|
+
CommonModule = _ts_decorate([
|
|
27
|
+
(0, _common.Global)(),
|
|
28
|
+
(0, _common.Module)({
|
|
29
|
+
imports: [
|
|
30
|
+
_config.ConfigModule
|
|
31
|
+
],
|
|
32
|
+
providers: [
|
|
33
|
+
_markdownparserservice.MarkdownParserService,
|
|
34
|
+
_llmservice.LlmService,
|
|
35
|
+
_multillmservice.MultiLlmService,
|
|
36
|
+
_configservice.ConfigService,
|
|
37
|
+
_markdownrendererservice.MarkdownRendererService
|
|
38
|
+
],
|
|
39
|
+
exports: [
|
|
40
|
+
_markdownparserservice.MarkdownParserService,
|
|
41
|
+
_llmservice.LlmService,
|
|
42
|
+
_multillmservice.MultiLlmService,
|
|
43
|
+
_configservice.ConfigService,
|
|
44
|
+
_markdownrendererservice.MarkdownRendererService
|
|
45
|
+
]
|
|
46
|
+
})
|
|
47
|
+
], CommonModule);
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=common.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/common/common.module.ts"],"sourcesContent":["import { Module, Global } from '@nestjs/common';\nimport { MarkdownParserService } from './services/markdown-parser.service';\nimport { LlmService } from './services/llm.service';\nimport { MultiLlmService } from './services/multi-llm.service';\nimport { ConfigService } from './services/config.service';\nimport { MarkdownRendererService } from './services/markdown-renderer.service';\nimport { ConfigModule } from '../modules/config';\n\n@Global()\n@Module({\n imports: [ConfigModule],\n providers: [MarkdownParserService, LlmService, MultiLlmService, ConfigService, MarkdownRendererService],\n exports: [MarkdownParserService, LlmService, MultiLlmService, ConfigService, MarkdownRendererService],\n})\nexport class CommonModule {}\n"],"names":["CommonModule","imports","ConfigModule","providers","MarkdownParserService","LlmService","MultiLlmService","ConfigService","MarkdownRendererService","exports"],"mappings":";;;;+BAcaA;;;eAAAA;;;wBAdkB;uCACO;4BACX;iCACK;+BACF;yCACU;wBACX;;;;;;;AAQtB,IAAA,AAAMA,eAAN,MAAMA;AAAc;;;;QAJzBC,SAAS;YAACC,oBAAY;SAAC;QACvBC,WAAW;YAACC,4CAAqB;YAAEC,sBAAU;YAAEC,gCAAe;YAAEC,4BAAa;YAAEC,gDAAuB;SAAC;QACvGC,SAAS;YAACL,4CAAqB;YAAEC,sBAAU;YAAEC,gCAAe;YAAEC,4BAAa;YAAEC,gDAAuB;SAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get BUILT_IN_TOOLS () {
|
|
13
|
+
return BUILT_IN_TOOLS;
|
|
14
|
+
},
|
|
15
|
+
get CAST_DIR () {
|
|
16
|
+
return CAST_DIR;
|
|
17
|
+
},
|
|
18
|
+
get DEFAULT_MODEL () {
|
|
19
|
+
return DEFAULT_MODEL;
|
|
20
|
+
},
|
|
21
|
+
get DEFAULT_TEMPERATURE () {
|
|
22
|
+
return DEFAULT_TEMPERATURE;
|
|
23
|
+
},
|
|
24
|
+
get DEFINITIONS_DIR () {
|
|
25
|
+
return DEFINITIONS_DIR;
|
|
26
|
+
},
|
|
27
|
+
get GLOBAL_CONFIG_DIR () {
|
|
28
|
+
return GLOBAL_CONFIG_DIR;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
|
|
32
|
+
const _os = /*#__PURE__*/ _interop_require_wildcard(require("os"));
|
|
33
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
34
|
+
if (typeof WeakMap !== "function") return null;
|
|
35
|
+
var cacheBabelInterop = new WeakMap();
|
|
36
|
+
var cacheNodeInterop = new WeakMap();
|
|
37
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
38
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
39
|
+
})(nodeInterop);
|
|
40
|
+
}
|
|
41
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
42
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
43
|
+
return obj;
|
|
44
|
+
}
|
|
45
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
46
|
+
return {
|
|
47
|
+
default: obj
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
51
|
+
if (cache && cache.has(obj)) {
|
|
52
|
+
return cache.get(obj);
|
|
53
|
+
}
|
|
54
|
+
var newObj = {
|
|
55
|
+
__proto__: null
|
|
56
|
+
};
|
|
57
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
58
|
+
for(var key in obj){
|
|
59
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
60
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
61
|
+
if (desc && (desc.get || desc.set)) {
|
|
62
|
+
Object.defineProperty(newObj, key, desc);
|
|
63
|
+
} else {
|
|
64
|
+
newObj[key] = obj[key];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
newObj.default = obj;
|
|
69
|
+
if (cache) {
|
|
70
|
+
cache.set(obj, newObj);
|
|
71
|
+
}
|
|
72
|
+
return newObj;
|
|
73
|
+
}
|
|
74
|
+
const CAST_DIR = '.cast';
|
|
75
|
+
const GLOBAL_CONFIG_DIR = _path.join(_os.homedir(), '.cast');
|
|
76
|
+
const DEFAULT_MODEL = 'gpt-4.1-nano';
|
|
77
|
+
const DEFAULT_TEMPERATURE = 0.1;
|
|
78
|
+
const DEFINITIONS_DIR = {
|
|
79
|
+
AGENTS: 'definitions',
|
|
80
|
+
SKILLS: 'definitions'
|
|
81
|
+
};
|
|
82
|
+
const BUILT_IN_TOOLS = [
|
|
83
|
+
'read_file',
|
|
84
|
+
'write_file',
|
|
85
|
+
'edit_file',
|
|
86
|
+
'glob',
|
|
87
|
+
'grep',
|
|
88
|
+
'ls',
|
|
89
|
+
'shell',
|
|
90
|
+
'shell_background',
|
|
91
|
+
'web_search',
|
|
92
|
+
'web_fetch',
|
|
93
|
+
'task_create',
|
|
94
|
+
'task_update',
|
|
95
|
+
'task_list',
|
|
96
|
+
'task_get',
|
|
97
|
+
'ask_user_question',
|
|
98
|
+
'enter_plan_mode',
|
|
99
|
+
'exit_plan_mode',
|
|
100
|
+
'memory_write',
|
|
101
|
+
'memory_read',
|
|
102
|
+
'memory_search'
|
|
103
|
+
];
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/common/constants/index.ts"],"sourcesContent":["import * as path from 'path';\nimport * as os from 'os';\n\nexport const CAST_DIR = '.cast';\nexport const GLOBAL_CONFIG_DIR = path.join(os.homedir(), '.cast');\n\nexport const DEFAULT_MODEL = 'gpt-4.1-nano';\nexport const DEFAULT_TEMPERATURE = 0.1;\n\nexport const DEFINITIONS_DIR = {\n AGENTS: 'definitions',\n SKILLS: 'definitions',\n} as const;\n\nexport const BUILT_IN_TOOLS = [\n 'read_file',\n 'write_file',\n 'edit_file',\n 'glob',\n 'grep',\n 'ls',\n 'shell',\n 'shell_background',\n 'web_search',\n 'web_fetch',\n 'task_create',\n 'task_update',\n 'task_list',\n 'task_get',\n 'ask_user_question',\n 'enter_plan_mode',\n 'exit_plan_mode',\n 'memory_write',\n 'memory_read',\n 'memory_search',\n] as const;\n\nexport type BuiltInToolName = (typeof BUILT_IN_TOOLS)[number];\n"],"names":["BUILT_IN_TOOLS","CAST_DIR","DEFAULT_MODEL","DEFAULT_TEMPERATURE","DEFINITIONS_DIR","GLOBAL_CONFIG_DIR","path","join","os","homedir","AGENTS","SKILLS"],"mappings":";;;;;;;;;;;QAcaA;eAAAA;;QAXAC;eAAAA;;QAGAC;eAAAA;;QACAC;eAAAA;;QAEAC;eAAAA;;QALAC;eAAAA;;;8DAJS;4DACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEb,MAAMJ,WAAW;AACjB,MAAMI,oBAAoBC,MAAKC,IAAI,CAACC,IAAGC,OAAO,IAAI;AAElD,MAAMP,gBAAgB;AACtB,MAAMC,sBAAsB;AAE5B,MAAMC,kBAAkB;IAC7BM,QAAQ;IACRC,QAAQ;AACV;AAEO,MAAMX,iBAAiB;IAC5B;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
_export_star(require("./types"), exports);
|
|
6
|
+
_export_star(require("./constants"), exports);
|
|
7
|
+
_export_star(require("./services/markdown-parser.service"), exports);
|
|
8
|
+
_export_star(require("./services/llm.service"), exports);
|
|
9
|
+
_export_star(require("./common.module"), exports);
|
|
10
|
+
function _export_star(from, to) {
|
|
11
|
+
Object.keys(from).forEach(function(k) {
|
|
12
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
13
|
+
Object.defineProperty(to, k, {
|
|
14
|
+
enumerable: true,
|
|
15
|
+
get: function() {
|
|
16
|
+
return from[k];
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return from;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/common/index.ts"],"sourcesContent":["export * from './types';\nexport * from './constants';\nexport * from './services/markdown-parser.service';\nexport * from './services/llm.service';\nexport * from './common.module';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "ConfigService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return ConfigService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _path = /*#__PURE__*/ _interop_require_wildcard(require("path"));
|
|
13
|
+
const _markdownparserservice = require("./markdown-parser.service");
|
|
14
|
+
const _constants = require("../constants");
|
|
15
|
+
function _getRequireWildcardCache(nodeInterop) {
|
|
16
|
+
if (typeof WeakMap !== "function") return null;
|
|
17
|
+
var cacheBabelInterop = new WeakMap();
|
|
18
|
+
var cacheNodeInterop = new WeakMap();
|
|
19
|
+
return (_getRequireWildcardCache = function(nodeInterop) {
|
|
20
|
+
return nodeInterop ? cacheNodeInterop : cacheBabelInterop;
|
|
21
|
+
})(nodeInterop);
|
|
22
|
+
}
|
|
23
|
+
function _interop_require_wildcard(obj, nodeInterop) {
|
|
24
|
+
if (!nodeInterop && obj && obj.__esModule) {
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
if (obj === null || typeof obj !== "object" && typeof obj !== "function") {
|
|
28
|
+
return {
|
|
29
|
+
default: obj
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
var cache = _getRequireWildcardCache(nodeInterop);
|
|
33
|
+
if (cache && cache.has(obj)) {
|
|
34
|
+
return cache.get(obj);
|
|
35
|
+
}
|
|
36
|
+
var newObj = {
|
|
37
|
+
__proto__: null
|
|
38
|
+
};
|
|
39
|
+
var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;
|
|
40
|
+
for(var key in obj){
|
|
41
|
+
if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) {
|
|
42
|
+
var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;
|
|
43
|
+
if (desc && (desc.get || desc.set)) {
|
|
44
|
+
Object.defineProperty(newObj, key, desc);
|
|
45
|
+
} else {
|
|
46
|
+
newObj[key] = obj[key];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
newObj.default = obj;
|
|
51
|
+
if (cache) {
|
|
52
|
+
cache.set(obj, newObj);
|
|
53
|
+
}
|
|
54
|
+
return newObj;
|
|
55
|
+
}
|
|
56
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
57
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
58
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
59
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
60
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
61
|
+
}
|
|
62
|
+
function _ts_metadata(k, v) {
|
|
63
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
64
|
+
}
|
|
65
|
+
let ConfigService = class ConfigService {
|
|
66
|
+
async loadGlobalConfig() {
|
|
67
|
+
const configPath = _path.join(_constants.GLOBAL_CONFIG_DIR, 'config.md');
|
|
68
|
+
if (await this.markdownParser.exists(configPath)) {
|
|
69
|
+
const { frontmatter } = await this.markdownParser.parse(configPath);
|
|
70
|
+
this.config = {
|
|
71
|
+
model: frontmatter.model || process.env.OLLAMA_MODEL || this.config.model,
|
|
72
|
+
temperature: frontmatter.temperature ?? this.config.temperature,
|
|
73
|
+
apiKey: frontmatter.apiKey || process.env.OPENAI_API_KEY || '',
|
|
74
|
+
provider: frontmatter.provider || process.env.LLM_PROVIDER || this.config.provider,
|
|
75
|
+
ollamaBaseUrl: frontmatter.ollamaBaseUrl || process.env.OLLAMA_BASE_URL || this.config.ollamaBaseUrl
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
if (this.config.provider === 'openai' && !this.config.apiKey) {
|
|
79
|
+
throw new Error('OPENAI_API_KEY not configured. Set it in environment or ~/.cast/config.md');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
getConfig() {
|
|
83
|
+
return this.config;
|
|
84
|
+
}
|
|
85
|
+
getModel() {
|
|
86
|
+
return this.config.model;
|
|
87
|
+
}
|
|
88
|
+
getTemperature() {
|
|
89
|
+
return this.config.temperature;
|
|
90
|
+
}
|
|
91
|
+
getApiKey() {
|
|
92
|
+
return this.config.apiKey;
|
|
93
|
+
}
|
|
94
|
+
getProvider() {
|
|
95
|
+
return this.config.provider;
|
|
96
|
+
}
|
|
97
|
+
getOllamaBaseUrl() {
|
|
98
|
+
return this.config.ollamaBaseUrl;
|
|
99
|
+
}
|
|
100
|
+
constructor(markdownParser){
|
|
101
|
+
this.markdownParser = markdownParser;
|
|
102
|
+
this.config = {
|
|
103
|
+
model: process.env.OLLAMA_MODEL || _constants.DEFAULT_MODEL,
|
|
104
|
+
temperature: _constants.DEFAULT_TEMPERATURE,
|
|
105
|
+
apiKey: process.env.OPENAI_API_KEY || '',
|
|
106
|
+
provider: process.env.LLM_PROVIDER || 'openai',
|
|
107
|
+
ollamaBaseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434'
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
ConfigService = _ts_decorate([
|
|
112
|
+
(0, _common.Injectable)(),
|
|
113
|
+
_ts_metadata("design:type", Function),
|
|
114
|
+
_ts_metadata("design:paramtypes", [
|
|
115
|
+
typeof _markdownparserservice.MarkdownParserService === "undefined" ? Object : _markdownparserservice.MarkdownParserService
|
|
116
|
+
])
|
|
117
|
+
], ConfigService);
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=config.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/common/services/config.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport * as path from 'path';\nimport { MarkdownParserService } from './markdown-parser.service';\nimport { GLOBAL_CONFIG_DIR, DEFAULT_MODEL, DEFAULT_TEMPERATURE } from '../constants';\n\ninterface GlobalConfigFrontmatter {\n model?: string;\n temperature?: number;\n apiKey?: string;\n provider?: string;\n ollamaBaseUrl?: string;\n}\n\nexport interface GlobalConfig {\n model: string;\n temperature: number;\n apiKey: string;\n provider: string;\n ollamaBaseUrl: string;\n}\n\n@Injectable()\nexport class ConfigService {\n private config: GlobalConfig = {\n model: process.env.OLLAMA_MODEL || DEFAULT_MODEL,\n temperature: DEFAULT_TEMPERATURE,\n apiKey: process.env.OPENAI_API_KEY || '',\n provider: process.env.LLM_PROVIDER || 'openai',\n ollamaBaseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',\n };\n\n constructor(private readonly markdownParser: MarkdownParserService) {}\n\n async loadGlobalConfig() {\n const configPath = path.join(GLOBAL_CONFIG_DIR, 'config.md');\n\n if (await this.markdownParser.exists(configPath)) {\n const { frontmatter } =\n await this.markdownParser.parse<GlobalConfigFrontmatter>(configPath);\n\n this.config = {\n model: frontmatter.model || process.env.OLLAMA_MODEL || this.config.model,\n temperature: frontmatter.temperature ?? this.config.temperature,\n apiKey: frontmatter.apiKey || process.env.OPENAI_API_KEY || '',\n provider: frontmatter.provider || process.env.LLM_PROVIDER || this.config.provider,\n ollamaBaseUrl: frontmatter.ollamaBaseUrl || process.env.OLLAMA_BASE_URL || this.config.ollamaBaseUrl,\n };\n }\n\n if (this.config.provider === 'openai' && !this.config.apiKey) {\n throw new Error(\n 'OPENAI_API_KEY not configured. Set it in environment or ~/.cast/config.md',\n );\n }\n }\n\n getConfig(): GlobalConfig {\n return this.config;\n }\n\n getModel(): string {\n return this.config.model;\n }\n\n getTemperature(): number {\n return this.config.temperature;\n }\n\n getApiKey(): string {\n return this.config.apiKey;\n }\n\n getProvider(): string {\n return this.config.provider;\n }\n\n getOllamaBaseUrl(): string {\n return this.config.ollamaBaseUrl;\n }\n}\n"],"names":["ConfigService","loadGlobalConfig","configPath","path","join","GLOBAL_CONFIG_DIR","markdownParser","exists","frontmatter","parse","config","model","process","env","OLLAMA_MODEL","temperature","apiKey","OPENAI_API_KEY","provider","LLM_PROVIDER","ollamaBaseUrl","OLLAMA_BASE_URL","Error","getConfig","getModel","getTemperature","getApiKey","getProvider","getOllamaBaseUrl","DEFAULT_MODEL","DEFAULT_TEMPERATURE"],"mappings":";;;;+BAsBaA;;;eAAAA;;;wBAtBc;8DACL;uCACgB;2BACgC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmB/D,IAAA,AAAMA,gBAAN,MAAMA;IAWX,MAAMC,mBAAmB;QACvB,MAAMC,aAAaC,MAAKC,IAAI,CAACC,4BAAiB,EAAE;QAEhD,IAAI,MAAM,IAAI,CAACC,cAAc,CAACC,MAAM,CAACL,aAAa;YAChD,MAAM,EAAEM,WAAW,EAAE,GACnB,MAAM,IAAI,CAACF,cAAc,CAACG,KAAK,CAA0BP;YAE3D,IAAI,CAACQ,MAAM,GAAG;gBACZC,OAAOH,YAAYG,KAAK,IAAIC,QAAQC,GAAG,CAACC,YAAY,IAAI,IAAI,CAACJ,MAAM,CAACC,KAAK;gBACzEI,aAAaP,YAAYO,WAAW,IAAI,IAAI,CAACL,MAAM,CAACK,WAAW;gBAC/DC,QAAQR,YAAYQ,MAAM,IAAIJ,QAAQC,GAAG,CAACI,cAAc,IAAI;gBAC5DC,UAAUV,YAAYU,QAAQ,IAAIN,QAAQC,GAAG,CAACM,YAAY,IAAI,IAAI,CAACT,MAAM,CAACQ,QAAQ;gBAClFE,eAAeZ,YAAYY,aAAa,IAAIR,QAAQC,GAAG,CAACQ,eAAe,IAAI,IAAI,CAACX,MAAM,CAACU,aAAa;YACtG;QACF;QAEA,IAAI,IAAI,CAACV,MAAM,CAACQ,QAAQ,KAAK,YAAY,CAAC,IAAI,CAACR,MAAM,CAACM,MAAM,EAAE;YAC5D,MAAM,IAAIM,MACR;QAEJ;IACF;IAEAC,YAA0B;QACxB,OAAO,IAAI,CAACb,MAAM;IACpB;IAEAc,WAAmB;QACjB,OAAO,IAAI,CAACd,MAAM,CAACC,KAAK;IAC1B;IAEAc,iBAAyB;QACvB,OAAO,IAAI,CAACf,MAAM,CAACK,WAAW;IAChC;IAEAW,YAAoB;QAClB,OAAO,IAAI,CAAChB,MAAM,CAACM,MAAM;IAC3B;IAEAW,cAAsB;QACpB,OAAO,IAAI,CAACjB,MAAM,CAACQ,QAAQ;IAC7B;IAEAU,mBAA2B;QACzB,OAAO,IAAI,CAAClB,MAAM,CAACU,aAAa;IAClC;IA/CA,YAAY,AAAiBd,cAAqC,CAAE;aAAvCA,iBAAAA;aARrBI,SAAuB;YAC7BC,OAAOC,QAAQC,GAAG,CAACC,YAAY,IAAIe,wBAAa;YAChDd,aAAae,8BAAmB;YAChCd,QAAQJ,QAAQC,GAAG,CAACI,cAAc,IAAI;YACtCC,UAAUN,QAAQC,GAAG,CAACM,YAAY,IAAI;YACtCC,eAAeR,QAAQC,GAAG,CAACQ,eAAe,IAAI;QAChD;IAEqE;AAgDvE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "LlmService", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return LlmService;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _common = require("@nestjs/common");
|
|
12
|
+
const _openai = require("@langchain/openai");
|
|
13
|
+
const _ollama = require("@langchain/ollama");
|
|
14
|
+
const _configservice = require("./config.service");
|
|
15
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
16
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
17
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
18
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
19
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
20
|
+
}
|
|
21
|
+
function _ts_metadata(k, v) {
|
|
22
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
23
|
+
}
|
|
24
|
+
let LlmService = class LlmService {
|
|
25
|
+
createModel(streaming = false) {
|
|
26
|
+
const provider = this.configService.getProvider();
|
|
27
|
+
if (provider === 'ollama') {
|
|
28
|
+
return new _ollama.ChatOllama({
|
|
29
|
+
model: this.configService.getModel(),
|
|
30
|
+
temperature: this.configService.getTemperature(),
|
|
31
|
+
baseUrl: this.configService.getOllamaBaseUrl()
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
return new _openai.ChatOpenAI({
|
|
35
|
+
modelName: this.configService.getModel(),
|
|
36
|
+
temperature: this.configService.getTemperature(),
|
|
37
|
+
openAIApiKey: this.configService.getApiKey(),
|
|
38
|
+
streaming
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
createStreamingModel() {
|
|
42
|
+
return this.createModel(true);
|
|
43
|
+
}
|
|
44
|
+
constructor(configService){
|
|
45
|
+
this.configService = configService;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
LlmService = _ts_decorate([
|
|
49
|
+
(0, _common.Injectable)(),
|
|
50
|
+
_ts_metadata("design:type", Function),
|
|
51
|
+
_ts_metadata("design:paramtypes", [
|
|
52
|
+
typeof _configservice.ConfigService === "undefined" ? Object : _configservice.ConfigService
|
|
53
|
+
])
|
|
54
|
+
], LlmService);
|
|
55
|
+
|
|
56
|
+
//# sourceMappingURL=llm.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/common/services/llm.service.ts"],"sourcesContent":["import { Injectable } from '@nestjs/common';\nimport { ChatOpenAI } from '@langchain/openai';\nimport { ChatOllama } from '@langchain/ollama';\nimport { BaseChatModel } from '@langchain/core/language_models/chat_models';\nimport { ConfigService } from './config.service';\n\n@Injectable()\nexport class LlmService {\n constructor(private readonly configService: ConfigService) {}\n\n createModel(streaming = false): BaseChatModel {\n const provider = this.configService.getProvider();\n\n if (provider === 'ollama') {\n return new ChatOllama({\n model: this.configService.getModel(),\n temperature: this.configService.getTemperature(),\n baseUrl: this.configService.getOllamaBaseUrl(),\n });\n }\n\n return new ChatOpenAI({\n modelName: this.configService.getModel(),\n temperature: this.configService.getTemperature(),\n openAIApiKey: this.configService.getApiKey(),\n streaming,\n });\n }\n\n createStreamingModel(): BaseChatModel {\n return this.createModel(true);\n }\n}\n"],"names":["LlmService","createModel","streaming","provider","configService","getProvider","ChatOllama","model","getModel","temperature","getTemperature","baseUrl","getOllamaBaseUrl","ChatOpenAI","modelName","openAIApiKey","getApiKey","createStreamingModel"],"mappings":";;;;+BAOaA;;;eAAAA;;;wBAPc;wBACA;wBACA;+BAEG;;;;;;;;;;AAGvB,IAAA,AAAMA,aAAN,MAAMA;IAGXC,YAAYC,YAAY,KAAK,EAAiB;QAC5C,MAAMC,WAAW,IAAI,CAACC,aAAa,CAACC,WAAW;QAE/C,IAAIF,aAAa,UAAU;YACzB,OAAO,IAAIG,kBAAU,CAAC;gBACpBC,OAAO,IAAI,CAACH,aAAa,CAACI,QAAQ;gBAClCC,aAAa,IAAI,CAACL,aAAa,CAACM,cAAc;gBAC9CC,SAAS,IAAI,CAACP,aAAa,CAACQ,gBAAgB;YAC9C;QACF;QAEA,OAAO,IAAIC,kBAAU,CAAC;YACpBC,WAAW,IAAI,CAACV,aAAa,CAACI,QAAQ;YACtCC,aAAa,IAAI,CAACL,aAAa,CAACM,cAAc;YAC9CK,cAAc,IAAI,CAACX,aAAa,CAACY,SAAS;YAC1Cd;QACF;IACF;IAEAe,uBAAsC;QACpC,OAAO,IAAI,CAAChB,WAAW,CAAC;IAC1B;IAvBA,YAAY,AAAiBG,aAA4B,CAAE;aAA9BA,gBAAAA;IAA+B;AAwB9D"}
|