@travisennis/acai 0.0.11 → 0.0.13
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/README.md +5 -5
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +2 -5
- package/dist/commands/history/types.d.ts +3 -2
- package/dist/commands/history/types.d.ts.map +1 -1
- package/dist/commands/init-project/utils.d.ts +0 -1
- package/dist/commands/init-project/utils.d.ts.map +1 -1
- package/dist/commands/init-project/utils.js +1 -12
- package/dist/commands/manager.d.ts.map +1 -1
- package/dist/commands/manager.js +6 -19
- package/dist/commands/resources/index.d.ts.map +1 -1
- package/dist/commands/resources/index.js +4 -1
- package/dist/commands/session/index.d.ts.map +1 -1
- package/dist/commands/session/index.js +6 -0
- package/dist/commands/session/types.d.ts +1 -0
- package/dist/commands/session/types.d.ts.map +1 -1
- package/dist/commands/share/html-renderer.d.ts.map +1 -1
- package/dist/commands/share/html-renderer.js +54 -48
- package/dist/commands/tools/index.d.ts +3 -0
- package/dist/commands/tools/index.d.ts.map +1 -0
- package/dist/commands/tools/index.js +191 -0
- package/dist/commands/tools/templates.d.ts +6 -0
- package/dist/commands/tools/templates.d.ts.map +1 -0
- package/dist/commands/tools/templates.js +97 -0
- package/dist/config/index.d.ts +5 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +42 -6
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -68
- package/dist/models/anthropic-provider.d.ts +1 -1
- package/dist/models/deepseek-provider.d.ts +3 -3
- package/dist/models/deepseek-provider.js +17 -17
- package/dist/models/google-provider.d.ts +2 -4
- package/dist/models/google-provider.d.ts.map +1 -1
- package/dist/models/google-provider.js +2 -17
- package/dist/models/groq-provider.d.ts +2 -4
- package/dist/models/groq-provider.d.ts.map +1 -1
- package/dist/models/groq-provider.js +3 -21
- package/dist/models/manager.d.ts +1 -10
- package/dist/models/manager.d.ts.map +1 -1
- package/dist/models/manager.js +2 -2
- package/dist/models/opencode-go-provider.d.ts +11 -1
- package/dist/models/opencode-go-provider.d.ts.map +1 -1
- package/dist/models/opencode-go-provider.js +130 -0
- package/dist/models/opencode-zen-provider.d.ts +3 -3
- package/dist/models/opencode-zen-provider.d.ts.map +1 -1
- package/dist/models/opencode-zen-provider.js +26 -32
- package/dist/models/openrouter-provider.d.ts +4 -15
- package/dist/models/openrouter-provider.d.ts.map +1 -1
- package/dist/models/openrouter-provider.js +26 -169
- package/dist/models/providers.d.ts +1 -1
- package/dist/models/providers.d.ts.map +1 -1
- package/dist/models/xai-provider.d.ts +1 -2
- package/dist/models/xai-provider.d.ts.map +1 -1
- package/dist/models/xai-provider.js +0 -13
- package/dist/prompts/manager.d.ts.map +1 -1
- package/dist/prompts/manager.js +5 -1
- package/dist/prompts/system-prompt.d.ts +1 -2
- package/dist/prompts/system-prompt.d.ts.map +1 -1
- package/dist/prompts/system-prompt.js +26 -15
- package/dist/repl/index.d.ts +28 -13
- package/dist/repl/index.d.ts.map +1 -1
- package/dist/repl/index.js +242 -305
- package/dist/skills/activated-tracker.d.ts +11 -0
- package/dist/skills/activated-tracker.d.ts.map +1 -0
- package/dist/skills/activated-tracker.js +16 -0
- package/dist/skills/index.d.ts +12 -2
- package/dist/skills/index.d.ts.map +1 -1
- package/dist/skills/index.js +127 -71
- package/dist/terminal/control.d.ts +1 -21
- package/dist/terminal/control.d.ts.map +1 -1
- package/dist/terminal/control.js +1 -32
- package/dist/terminal/formatting.d.ts +0 -33
- package/dist/terminal/formatting.d.ts.map +1 -1
- package/dist/terminal/formatting.js +0 -91
- package/dist/terminal/highlight/theme.d.ts +0 -37
- package/dist/terminal/highlight/theme.d.ts.map +1 -1
- package/dist/terminal/highlight/theme.js +1 -79
- package/dist/terminal/keys.d.ts +0 -97
- package/dist/terminal/keys.d.ts.map +1 -1
- package/dist/terminal/keys.js +0 -194
- package/dist/terminal/select-prompt.d.ts.map +1 -1
- package/dist/terminal/select-prompt.js +65 -51
- package/dist/terminal/style.d.ts +1 -1
- package/dist/terminal/style.d.ts.map +1 -1
- package/dist/terminal/supports-color.d.ts.map +1 -1
- package/dist/terminal/supports-color.js +38 -20
- package/dist/terminal/supports-hyperlinks.d.ts +3 -0
- package/dist/terminal/supports-hyperlinks.d.ts.map +1 -1
- package/dist/terminal/supports-hyperlinks.js +72 -31
- package/dist/terminal/table/layout-manager.d.ts +0 -20
- package/dist/terminal/table/layout-manager.d.ts.map +1 -1
- package/dist/terminal/table/layout-manager.js +68 -44
- package/dist/terminal/table/utils.d.ts +0 -1
- package/dist/terminal/table/utils.d.ts.map +1 -1
- package/dist/terminal/table/utils.js +2 -4
- package/dist/tools/apply-patch.d.ts +5 -3
- package/dist/tools/apply-patch.d.ts.map +1 -1
- package/dist/tools/apply-patch.js +154 -123
- package/dist/tools/bash.d.ts +4 -4
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +27 -13
- package/dist/tools/dynamic-tool-loader.d.ts +17 -3
- package/dist/tools/dynamic-tool-loader.d.ts.map +1 -1
- package/dist/tools/dynamic-tool-loader.js +360 -81
- package/dist/tools/edit-file.d.ts +2 -2
- package/dist/tools/index.d.ts +27 -151
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +16 -21
- package/dist/tools/read-file.d.ts +8 -8
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +32 -13
- package/dist/tools/save-file.d.ts +4 -4
- package/dist/tools/skill.d.ts +2 -1
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +64 -14
- package/dist/tools/types.d.ts +8 -2
- package/dist/tools/types.d.ts.map +1 -1
- package/dist/tools/web-fetch.d.ts +8 -12
- package/dist/tools/web-fetch.d.ts.map +1 -1
- package/dist/tools/web-fetch.js +86 -44
- package/dist/tools/web-search.d.ts +4 -8
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +41 -33
- package/dist/tui/autocomplete/utils.d.ts +0 -15
- package/dist/tui/autocomplete/utils.d.ts.map +1 -1
- package/dist/tui/autocomplete/utils.js +0 -85
- package/dist/tui/autocomplete.d.ts +1 -1
- package/dist/tui/autocomplete.d.ts.map +1 -1
- package/dist/tui/autocomplete.js +1 -1
- package/dist/tui/components/editor.d.ts +12 -0
- package/dist/tui/components/editor.d.ts.map +1 -1
- package/dist/tui/components/editor.js +181 -195
- package/dist/tui/components/footer.d.ts +0 -2
- package/dist/tui/components/footer.d.ts.map +1 -1
- package/dist/tui/components/footer.js +1 -17
- package/dist/tui/components/input.d.ts +4 -0
- package/dist/tui/components/input.d.ts.map +1 -1
- package/dist/tui/components/input.js +33 -31
- package/dist/tui/components/markdown.d.ts +30 -0
- package/dist/tui/components/markdown.d.ts.map +1 -1
- package/dist/tui/components/markdown.js +274 -242
- package/dist/tui/components/modal.d.ts.map +1 -1
- package/dist/tui/components/modal.js +11 -11
- package/dist/tui/components/select-list.d.ts +5 -0
- package/dist/tui/components/select-list.d.ts.map +1 -1
- package/dist/tui/components/select-list.js +69 -98
- package/dist/tui/components/table.d.ts +6 -0
- package/dist/tui/components/table.d.ts.map +1 -1
- package/dist/tui/components/table.js +61 -52
- package/dist/tui/index.d.ts +1 -8
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +0 -8
- package/dist/tui/tui.d.ts +9 -0
- package/dist/tui/tui.d.ts.map +1 -1
- package/dist/tui/tui.js +78 -48
- package/dist/tui/utils.d.ts +7 -0
- package/dist/tui/utils.d.ts.map +1 -1
- package/dist/tui/utils.js +117 -53
- package/dist/utils/bash.d.ts.map +1 -1
- package/dist/utils/bash.js +121 -104
- package/dist/utils/binary-output.d.ts +32 -0
- package/dist/utils/binary-output.d.ts.map +1 -0
- package/dist/utils/binary-output.js +127 -0
- package/dist/utils/command-protection.d.ts +3 -2
- package/dist/utils/command-protection.d.ts.map +1 -1
- package/dist/utils/command-protection.js +121 -29
- package/dist/utils/filesystem/operations.d.ts +0 -15
- package/dist/utils/filesystem/operations.d.ts.map +1 -1
- package/dist/utils/filesystem/operations.js +1 -38
- package/dist/utils/filesystem/security.d.ts.map +1 -1
- package/dist/utils/filesystem/security.js +22 -15
- package/dist/utils/filetype-detection.d.ts +0 -1
- package/dist/utils/filetype-detection.d.ts.map +1 -1
- package/dist/utils/filetype-detection.js +0 -12
- package/dist/utils/formatting.d.ts +0 -30
- package/dist/utils/formatting.d.ts.map +1 -1
- package/dist/utils/formatting.js +0 -44
- package/dist/utils/git.d.ts +4 -6
- package/dist/utils/git.d.ts.map +1 -1
- package/dist/utils/git.js +36 -46
- package/dist/utils/ignore.d.ts +1 -1
- package/dist/utils/ignore.d.ts.map +1 -1
- package/dist/utils/ignore.js +1 -1
- package/dist/utils/parsing.d.ts +1 -1
- package/dist/utils/parsing.d.ts.map +1 -1
- package/dist/utils/process.d.ts.map +1 -1
- package/dist/utils/process.js +77 -79
- package/dist/utils/yaml.d.ts +0 -1
- package/dist/utils/yaml.d.ts.map +1 -1
- package/dist/utils/yaml.js +80 -89
- package/dist/utils/zod.d.ts +0 -3
- package/dist/utils/zod.d.ts.map +1 -1
- package/dist/utils/zod.js +0 -7
- package/package.json +32 -29
- package/dist/agent/sub-agent.d.ts +0 -23
- package/dist/agent/sub-agent.d.ts.map +0 -1
- package/dist/agent/sub-agent.js +0 -109
- package/dist/commands/add-directory/index.d.ts +0 -3
- package/dist/commands/add-directory/index.d.ts.map +0 -1
- package/dist/commands/add-directory/index.js +0 -50
- package/dist/commands/add-directory/utils.d.ts +0 -3
- package/dist/commands/add-directory/utils.d.ts.map +0 -1
- package/dist/commands/add-directory/utils.js +0 -15
- package/dist/commands/clear/index.d.ts +0 -3
- package/dist/commands/clear/index.d.ts.map +0 -1
- package/dist/commands/clear/index.js +0 -13
- package/dist/commands/generate-rules/index.d.ts +0 -3
- package/dist/commands/generate-rules/index.d.ts.map +0 -1
- package/dist/commands/generate-rules/index.js +0 -206
- package/dist/commands/generate-rules/service.d.ts +0 -22
- package/dist/commands/generate-rules/service.d.ts.map +0 -1
- package/dist/commands/generate-rules/service.js +0 -103
- package/dist/commands/generate-rules/utils.d.ts +0 -5
- package/dist/commands/generate-rules/utils.d.ts.map +0 -1
- package/dist/commands/generate-rules/utils.js +0 -25
- package/dist/commands/handoff/index.d.ts +0 -3
- package/dist/commands/handoff/index.d.ts.map +0 -1
- package/dist/commands/handoff/index.js +0 -97
- package/dist/commands/handoff/utils.d.ts +0 -4
- package/dist/commands/handoff/utils.d.ts.map +0 -1
- package/dist/commands/handoff/utils.js +0 -123
- package/dist/commands/list-directories/index.d.ts +0 -3
- package/dist/commands/list-directories/index.d.ts.map +0 -1
- package/dist/commands/list-directories/index.js +0 -35
- package/dist/commands/pickup/index.d.ts +0 -3
- package/dist/commands/pickup/index.d.ts.map +0 -1
- package/dist/commands/pickup/index.js +0 -141
- package/dist/commands/pickup/types.d.ts +0 -6
- package/dist/commands/pickup/types.d.ts.map +0 -1
- package/dist/commands/pickup/types.js +0 -1
- package/dist/commands/pickup/utils.d.ts +0 -7
- package/dist/commands/pickup/utils.d.ts.map +0 -1
- package/dist/commands/pickup/utils.js +0 -56
- package/dist/commands/remove-directory/index.d.ts +0 -3
- package/dist/commands/remove-directory/index.d.ts.map +0 -1
- package/dist/commands/remove-directory/index.js +0 -55
- package/dist/commands/review/index.d.ts +0 -3
- package/dist/commands/review/index.d.ts.map +0 -1
- package/dist/commands/review/index.js +0 -12
- package/dist/commands/review/review-panel.d.ts +0 -3
- package/dist/commands/review/review-panel.d.ts.map +0 -1
- package/dist/commands/review/review-panel.js +0 -186
- package/dist/commands/review/utils.d.ts +0 -18
- package/dist/commands/review/utils.d.ts.map +0 -1
- package/dist/commands/review/utils.js +0 -146
- package/dist/commands/shell/index.d.ts +0 -3
- package/dist/commands/shell/index.d.ts.map +0 -1
- package/dist/commands/shell/index.js +0 -96
- package/dist/modes/manager.d.ts +0 -24
- package/dist/modes/manager.d.ts.map +0 -1
- package/dist/modes/manager.js +0 -77
- package/dist/modes/prompts.d.ts +0 -2
- package/dist/modes/prompts.d.ts.map +0 -1
- package/dist/modes/prompts.js +0 -142
- package/dist/subagents/index.d.ts +0 -16
- package/dist/subagents/index.d.ts.map +0 -1
- package/dist/subagents/index.js +0 -231
- package/dist/terminal/index.d.ts +0 -9
- package/dist/terminal/index.d.ts.map +0 -1
- package/dist/terminal/index.js +0 -8
- package/dist/tools/agent.d.ts +0 -27
- package/dist/tools/agent.d.ts.map +0 -1
- package/dist/tools/agent.js +0 -81
- package/dist/tools/directory-tree.d.ts +0 -28
- package/dist/tools/directory-tree.d.ts.map +0 -1
- package/dist/tools/directory-tree.js +0 -152
- package/dist/tools/glob.d.ts +0 -35
- package/dist/tools/glob.d.ts.map +0 -1
- package/dist/tools/glob.js +0 -159
- package/dist/tools/grep.d.ts +0 -100
- package/dist/tools/grep.d.ts.map +0 -1
- package/dist/tools/grep.js +0 -601
- package/dist/tools/ls.d.ts +0 -26
- package/dist/tools/ls.d.ts.map +0 -1
- package/dist/tools/ls.js +0 -82
- package/dist/tui/components/header.d.ts +0 -21
- package/dist/tui/components/header.d.ts.map +0 -1
- package/dist/tui/components/header.js +0 -63
- package/dist/utils/bash/parse.d.ts +0 -19
- package/dist/utils/bash/parse.d.ts.map +0 -1
- package/dist/utils/bash/parse.js +0 -223
- package/dist/utils/bash/quote.d.ts +0 -6
- package/dist/utils/bash/quote.d.ts.map +0 -1
- package/dist/utils/bash/quote.js +0 -23
- package/dist/utils/generators.d.ts +0 -3
- package/dist/utils/generators.d.ts.map +0 -1
- package/dist/utils/generators.js +0 -25
- package/dist/utils/glob.d.ts +0 -52
- package/dist/utils/glob.d.ts.map +0 -1
- package/dist/utils/glob.js +0 -376
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# acai
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|

|
|
@@ -19,7 +19,7 @@ Acai is an AI-driven command-line tool that assists software developers with cod
|
|
|
19
19
|
|
|
20
20
|
## Prerequisites
|
|
21
21
|
|
|
22
|
-
- Node.js
|
|
22
|
+
- Node.js 24 or higher
|
|
23
23
|
- Git
|
|
24
24
|
- [Ripgrep](https://github.com/BurntSushi/ripgrep) (`rg`) - Fast file content searching
|
|
25
25
|
- [GitHub CLI](https://cli.github.com/) (`gh`) - Git operations and repository management
|
|
@@ -75,19 +75,19 @@ Reference files directly with `@filename`, directories with `@dirname`, or run s
|
|
|
75
75
|
- **Pino** for structured logging
|
|
76
76
|
- **Zod** for schema validation
|
|
77
77
|
- **Biome** for formatting and linting
|
|
78
|
+
- **Fallow** for dead code, duplication, and complexity analysis
|
|
78
79
|
|
|
79
80
|
## Project Structure
|
|
80
81
|
|
|
81
82
|
```
|
|
82
83
|
.
|
|
83
84
|
├── source/ # Main application source code
|
|
84
|
-
│ ├── agent/ # Agent loop
|
|
85
|
+
│ ├── agent/ # Agent loop
|
|
85
86
|
│ ├── cli.ts # CLI entry point
|
|
86
87
|
│ ├── commands/ # REPL command implementations
|
|
87
88
|
│ ├── execution/ # Command execution utilities
|
|
88
89
|
│ ├── middleware/ # AI request/response middleware
|
|
89
90
|
│ ├── models/ # AI model providers and management
|
|
90
|
-
│ ├── modes/ # Agent mode management
|
|
91
91
|
│ ├── prompts/ # Prompt generation and management
|
|
92
92
|
│ ├── repl/ # REPL utilities
|
|
93
93
|
│ ├── sessions/ # Session persistence and management
|
|
@@ -108,7 +108,7 @@ Reference files directly with `@filename`, directories with `@dirname`, or run s
|
|
|
108
108
|
- [Usage Guide](docs/usage.md) - Commands, keyboard shortcuts, piped input, and prompt syntax
|
|
109
109
|
- [Configuration](docs/configuration.md) - Environment variables, project and global settings
|
|
110
110
|
- [Skills System](docs/skills.md) - Creating and using specialized instruction files
|
|
111
|
-
- [Dynamic Tools](docs/dynamic-tools.md) - Creating custom tools to extend acai
|
|
111
|
+
- [Dynamic Tools](docs/dynamic-tools.md) - Creating custom tools to extend acai (supports bash, python, and other languages; Amp-compatible text schema format; `/tools make` scaffolding command)
|
|
112
112
|
- [Architecture](ARCHITECTURE.md) - Internal architecture and flow diagrams
|
|
113
113
|
- [Contributing](CONTRIBUTING.md) - Development setup, scripts, and code style
|
|
114
114
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EAEhB,MAAM,mBAAmB,CAAC;AAI3B,KAAK,YAAY,GAAG;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,KAAK,UAAU,GAAG;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;IACvB,WAAW,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,SAAS,GACjB;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,IAAI,EAAE,eAAe,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,GACD;IACE,IAAI,EAAE,iBAAiB,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEN,KAAK,iBAAiB,GAAG;IACvB,IAAI,EAAE,qBAAqB,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,UAAU,GAElB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAExC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAErB;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAE3D,iBAAiB,CAAC;AActB,KAAK,UAAU,GAAG;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,CAAC;AAeF,MAAM,MAAM,UAAU,GAAG;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,aAAa,CAAC;IAC3B,KAAK,EAAE;QACL,WAAW,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACzC,SAAS,EAAE,KAAK,CAAC;YAAE,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxC,EAAE,CAAC;IACJ,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE;QACV,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH,CAAC;AAEF,qBAAa,KAAK;IAChB,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,eAAe,CAAkB;gBAE7B,IAAI,EAAE,YAAY;IAO9B,SAAS,CAAC,MAAM,EAAE,MAAM;IAIxB,IAAI,KAAK,eAER;IAED,IAAI,WAAW,gBAEd;IAGM,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,CAAC,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../source/agent/index.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/index.js
CHANGED
|
@@ -30,7 +30,7 @@ export class Agent {
|
|
|
30
30
|
const { systemPrompt, input, tools, activeTools, abortSignal } = args;
|
|
31
31
|
this.resetState();
|
|
32
32
|
this._state.timestamps.start = performance.now();
|
|
33
|
-
const { modelManager, sessionManager
|
|
33
|
+
const { modelManager, sessionManager } = this.opts;
|
|
34
34
|
const maxIterations = args.maxIterations ?? this.config.loop.maxIterations ?? 200;
|
|
35
35
|
const maxRetries = args.maxRetries ?? 2;
|
|
36
36
|
const langModel = modelManager.getModel("repl");
|
|
@@ -144,8 +144,6 @@ export class Agent {
|
|
|
144
144
|
// If finishReason is not tool-calls, break
|
|
145
145
|
const finishReason = await result.finishReason;
|
|
146
146
|
if (finishReason !== "tool-calls") {
|
|
147
|
-
// Track aggregate usage before yielding agent-stop so footer can display it
|
|
148
|
-
tokenTracker.trackUsage("repl", this._state.totalUsage);
|
|
149
147
|
yield {
|
|
150
148
|
type: "agent-stop",
|
|
151
149
|
};
|
|
@@ -225,8 +223,6 @@ export class Agent {
|
|
|
225
223
|
}
|
|
226
224
|
// Emit agent-stop if loop ended without emitting a terminal event (maxIterations reached)
|
|
227
225
|
if (!hasEmittedTerminalEvent) {
|
|
228
|
-
// Track aggregate usage before yielding agent-stop so footer can display it
|
|
229
|
-
tokenTracker.trackUsage("repl", this._state.totalUsage);
|
|
230
226
|
yield {
|
|
231
227
|
type: "agent-stop",
|
|
232
228
|
};
|
|
@@ -385,6 +381,7 @@ export class Agent {
|
|
|
385
381
|
this._state.totalUsage.cachedInputTokens += cacheReadTokens;
|
|
386
382
|
this._state.totalUsage.inputTokenDetails.cacheReadTokens += cacheReadTokens;
|
|
387
383
|
this._state.totalUsage.reasoningTokens += reasoningTokens;
|
|
384
|
+
this.opts.tokenTracker.trackUsage("repl", stepUsage);
|
|
388
385
|
sessionManager.recordTurnUsage({
|
|
389
386
|
inputTokens,
|
|
390
387
|
outputTokens,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ModelMessage } from "ai";
|
|
2
|
-
|
|
2
|
+
interface SessionTokenUsage {
|
|
3
3
|
total: {
|
|
4
4
|
inputTokens: number;
|
|
5
5
|
outputTokens: number;
|
|
@@ -17,7 +17,7 @@ export interface SessionTokenUsage {
|
|
|
17
17
|
estimatedCost: number;
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
-
|
|
20
|
+
interface TokenUsageTurn {
|
|
21
21
|
stepIndex: number;
|
|
22
22
|
inputTokens: number;
|
|
23
23
|
outputTokens: number;
|
|
@@ -46,4 +46,5 @@ export interface ConversationHistory {
|
|
|
46
46
|
project: string;
|
|
47
47
|
tokenUsage?: SessionTokenUsage | TokenUsageTurn[];
|
|
48
48
|
}
|
|
49
|
+
export {};
|
|
49
50
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/history/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAGvC,UAAU,iBAAiB;IACzB,KAAK,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,QAAQ,EAAE;QACR,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,eAAe,EAAE,MAAM,CAAC;QACxB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAGD,UAAU,cAAc;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,eAAe,EAAE,MAAM,CAAC;QACxB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;IACF,kBAAkB,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAAC;CACnD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/init-project/utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../source/commands/init-project/utils.ts"],"names":[],"mappings":"AAMA,UAAU,oBAAoB;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,GACjB,oBAAoB,CAwBtB;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,oBAAoB,CAazE;AAED,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, mkdirSync, writeFileSync } from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { defaultConfig } from "../../config/index.js";
|
|
4
|
-
|
|
4
|
+
const DEVELOPMENT_DIRECTORY = "/Users/travisennis/Github/acai-ts";
|
|
5
5
|
export function ensureProjectDirectory(projectDir) {
|
|
6
6
|
const created = [];
|
|
7
7
|
const existing = [];
|
|
@@ -12,17 +12,6 @@ export function ensureProjectDirectory(projectDir) {
|
|
|
12
12
|
else {
|
|
13
13
|
existing.push(".acai/");
|
|
14
14
|
}
|
|
15
|
-
const subdirs = ["rules"];
|
|
16
|
-
for (const subdir of subdirs) {
|
|
17
|
-
const dirPath = path.join(projectDir, subdir);
|
|
18
|
-
if (!existsSync(dirPath)) {
|
|
19
|
-
mkdirSync(dirPath, { recursive: true });
|
|
20
|
-
created.push(`.acai/${subdir}/`);
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
existing.push(`.acai/${subdir}/`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
15
|
const agentsSkillsDir = path.join(path.dirname(projectDir), ".agents", "skills");
|
|
27
16
|
if (!existsSync(agentsSkillsDir)) {
|
|
28
17
|
mkdirSync(agentsSkillsDir, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../source/commands/manager.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAEV,SAAS,EACT,MAAM,EACN,YAAY,EACZ,GAAG,EACJ,MAAM,iBAAiB,CAAC;AAsBzB,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,YAAY,CAAC;AAE9D,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,SAAS,CAAmB;IACpC,OAAO,CAAC,WAAW,CAAU;gBAEjB,EACV,aAAa,EACb,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,MAAM,EACN,YAAY,EACZ,aAAa,EACb,SAAS,GACV,EAAE,cAAc;IAaX,mBAAmB;YAkDX,qBAAqB;IA4EnC,OAAO,CAAC,iBAAiB;IAQnB,cAAc,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAuB/C,WAAW;IAKL,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlD,MAAM,CACV,EAAE,SAAS,EAAE,EAAE;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,EACpC,OAAO,EAAE;QACP,GAAG,EAAE,GAAG,CAAC;QACT,SAAS,EAAE,SAAS,CAAC;QACrB,cAAc,EAAE,SAAS,CAAC;QAC1B,MAAM,EAAE,MAAM,CAAC;KAChB;;;CAsBJ"}
|
package/dist/commands/manager.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { parseSkillsPath } from "../config/index.js";
|
|
2
3
|
import { processPrompt } from "../prompts/mentions.js";
|
|
3
4
|
import { loadSkills } from "../skills/index.js";
|
|
4
5
|
import style from "../terminal/style.js";
|
|
@@ -6,27 +7,19 @@ import { Spacer, Text } from "../tui/index.js";
|
|
|
6
7
|
import { logger } from "../utils/logger.js";
|
|
7
8
|
import { replaceArgumentPlaceholders } from "../utils/templates.js";
|
|
8
9
|
import { parseFrontMatter } from "../utils/yaml.js";
|
|
9
|
-
import { addDirectoryCommand } from "./add-directory/index.js";
|
|
10
|
-
import { clearCommand } from "./clear/index.js";
|
|
11
10
|
import { copyCommand } from "./copy/index.js";
|
|
12
|
-
import { generateRulesCommand } from "./generate-rules/index.js";
|
|
13
|
-
import { handoffCommand } from "./handoff/index.js";
|
|
14
11
|
import { healthCommand } from "./health/index.js";
|
|
15
12
|
import { helpCommand } from "./help/index.js";
|
|
16
13
|
import { historyCommand } from "./history/index.js";
|
|
17
14
|
import { initCommand } from "./init/index.js";
|
|
18
15
|
import { initProjectCommand } from "./init-project/index.js";
|
|
19
|
-
import { listDirectoriesCommand } from "./list-directories/index.js";
|
|
20
16
|
import { listToolsCommand } from "./list-tools/index.js";
|
|
21
17
|
import { modelCommand } from "./model/index.js";
|
|
22
18
|
import { pasteCommand } from "./paste/index.js";
|
|
23
|
-
import { pickupCommand } from "./pickup/index.js";
|
|
24
|
-
import { removeDirectoryCommand } from "./remove-directory/index.js";
|
|
25
19
|
import { resourcesCommand } from "./resources/index.js";
|
|
26
|
-
import { reviewCommand } from "./review/index.js";
|
|
27
20
|
import { sessionCommand } from "./session/index.js";
|
|
28
21
|
import { shareCommand } from "./share/index.js";
|
|
29
|
-
import {
|
|
22
|
+
import { toolsCommand } from "./tools/index.js";
|
|
30
23
|
export class CommandManager {
|
|
31
24
|
commands;
|
|
32
25
|
promptManager;
|
|
@@ -67,26 +60,18 @@ export class CommandManager {
|
|
|
67
60
|
};
|
|
68
61
|
// Register all commands
|
|
69
62
|
const cmds = [
|
|
70
|
-
addDirectoryCommand(options),
|
|
71
|
-
clearCommand(options),
|
|
72
63
|
healthCommand(options),
|
|
73
64
|
historyCommand(options),
|
|
74
65
|
initCommand(options),
|
|
75
66
|
initProjectCommand(options),
|
|
76
|
-
listDirectoriesCommand(options),
|
|
77
67
|
pasteCommand(options),
|
|
78
|
-
pickupCommand(options),
|
|
79
|
-
removeDirectoryCommand(options),
|
|
80
|
-
reviewCommand(options),
|
|
81
68
|
modelCommand(options),
|
|
82
69
|
sessionCommand(options),
|
|
83
|
-
generateRulesCommand(options),
|
|
84
|
-
handoffCommand(options),
|
|
85
70
|
copyCommand(options),
|
|
86
71
|
listToolsCommand(options),
|
|
87
72
|
resourcesCommand(options),
|
|
88
73
|
shareCommand(options),
|
|
89
|
-
|
|
74
|
+
toolsCommand(options),
|
|
90
75
|
];
|
|
91
76
|
// Add help command with access to all commands
|
|
92
77
|
const helpCmd = helpCommand(options, this.commands);
|
|
@@ -103,7 +88,9 @@ export class CommandManager {
|
|
|
103
88
|
this.initialized = true;
|
|
104
89
|
}
|
|
105
90
|
async registerSkillCommands(options) {
|
|
106
|
-
const
|
|
91
|
+
const appConfig = await this.config.getConfig();
|
|
92
|
+
const skillPaths = parseSkillsPath(appConfig.skills.path);
|
|
93
|
+
const skills = await loadSkills(skillPaths);
|
|
107
94
|
const userInvocableSkills = skills.getUserInvocable();
|
|
108
95
|
for (const skill of userInvocableSkills) {
|
|
109
96
|
const commandName = `/${skill.name}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/resources/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/resources/index.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAkC/D,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CAqErE"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { parseSkillsPath } from "../../config/index.js";
|
|
1
2
|
import { loadSkills } from "../../skills/index.js";
|
|
2
3
|
import style from "../../terminal/style.js";
|
|
3
4
|
import { Modal, Container as ModalContainer, ModalText, } from "../../tui/index.js";
|
|
@@ -30,7 +31,9 @@ export function resourcesCommand(options) {
|
|
|
30
31
|
getSubCommands: async () => [],
|
|
31
32
|
async handle(_args, { tui, editor }) {
|
|
32
33
|
try {
|
|
33
|
-
const
|
|
34
|
+
const appConfig = await options.config.getConfig();
|
|
35
|
+
const skillPaths = parseSkillsPath(appConfig.skills.path);
|
|
36
|
+
const skills = await loadSkills(skillPaths);
|
|
34
37
|
const allSkills = skills.getAll();
|
|
35
38
|
const agentsFiles = await options.config.readAgentsFiles();
|
|
36
39
|
const projectSkills = allSkills.filter((s) => s.source === "project");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/session/index.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAyH/D,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACT,YAAY,GACb,EAAE,cAAc,GAAG,WAAW,CAiK9B"}
|
|
@@ -44,6 +44,11 @@ function buildContextTable(breakdown, window) {
|
|
|
44
44
|
formatNumber(breakdown.systemPromptBreakdown.userAgentsMd),
|
|
45
45
|
formatPercentage(breakdown.systemPromptBreakdown.userAgentsMd, window),
|
|
46
46
|
],
|
|
47
|
+
[
|
|
48
|
+
" ~/.config/AGENTS.md",
|
|
49
|
+
formatNumber(breakdown.systemPromptBreakdown.configAgentsMd),
|
|
50
|
+
formatPercentage(breakdown.systemPromptBreakdown.configAgentsMd, window),
|
|
51
|
+
],
|
|
47
52
|
[
|
|
48
53
|
" ./AGENTS.md",
|
|
49
54
|
formatNumber(breakdown.systemPromptBreakdown.cwdAgentsMd),
|
|
@@ -126,6 +131,7 @@ export function sessionCommand({ config, tokenCounter, modelManager, sessionMana
|
|
|
126
131
|
const systemPromptBreakdown = {
|
|
127
132
|
core: tokenCounter.count(sysResult.components.core),
|
|
128
133
|
userAgentsMd: tokenCounter.count(sysResult.components.userAgentsMd),
|
|
134
|
+
configAgentsMd: tokenCounter.count(sysResult.components.configAgentsMd),
|
|
129
135
|
cwdAgentsMd: tokenCounter.count(sysResult.components.cwdAgentsMd),
|
|
130
136
|
learnedRules: tokenCounter.count(sysResult.components.learnedRules),
|
|
131
137
|
skills: tokenCounter.count(sysResult.components.skills),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxC,MAAM,CAOR"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../source/commands/session/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,MAAM,MAAM,SAAS,GAAG;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,YAAY,EAAE,EACxB,OAAO,EAAE;IAAE,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAE,GACxC,MAAM,CAOR"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../source/commands/share/html-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,IAAI,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;
|
|
1
|
+
{"version":3,"file":"html-renderer.d.ts","sourceRoot":"","sources":["../../../source/commands/share/html-renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAA0C,MAAM,IAAI,CAAC;AAE/E,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO/C;AA8ID,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAwO9D;AAED,wBAAgB,cAAc,CAC5B,cAAc,EAAE;IACd,GAAG,EAAE,MAAM,YAAY,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B,EACD,OAAO,CAAC,EAAE,MAAM,GACf,WAAW,CAUb;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG;IACzD,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAMA"}
|
|
@@ -69,68 +69,74 @@ function renderToolResult(toolResult) {
|
|
|
69
69
|
</div>
|
|
70
70
|
</div>`;
|
|
71
71
|
}
|
|
72
|
-
function
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
72
|
+
function extractTextContent(content) {
|
|
73
|
+
if (typeof content === "string") {
|
|
74
|
+
return escapeHtml(content);
|
|
75
|
+
}
|
|
76
|
+
if (Array.isArray(content)) {
|
|
77
|
+
return content
|
|
78
|
+
.filter((p) => typeof p !== "string" && p.type === "text")
|
|
79
|
+
.map((p) => escapeHtml(p.text))
|
|
80
|
+
.join("\n");
|
|
81
|
+
}
|
|
82
|
+
return "";
|
|
83
|
+
}
|
|
84
|
+
function renderSystemMessage(content) {
|
|
85
|
+
const textContent = extractTextContent(content);
|
|
86
|
+
return `
|
|
82
87
|
<div class="message system">
|
|
83
88
|
<div class="role">system</div>
|
|
84
|
-
<div class="content">${
|
|
89
|
+
<div class="content">${textContent}</div>
|
|
85
90
|
</div>`;
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
if (typeof content === "string") {
|
|
91
|
-
textContent = escapeHtml(content);
|
|
92
|
-
}
|
|
93
|
-
else if (Array.isArray(content)) {
|
|
94
|
-
textContent = content
|
|
95
|
-
.filter((p) => typeof p !== "string" && p.type === "text")
|
|
96
|
-
.map((p) => escapeHtml(p.text))
|
|
97
|
-
.join("\n");
|
|
98
|
-
}
|
|
99
|
-
return `
|
|
91
|
+
}
|
|
92
|
+
function renderUserMessage(content) {
|
|
93
|
+
const textContent = extractTextContent(content);
|
|
94
|
+
return `
|
|
100
95
|
<div class="message user">
|
|
101
96
|
<div class="role">user</div>
|
|
102
97
|
<div class="content">${textContent}</div>
|
|
103
98
|
</div>`;
|
|
99
|
+
}
|
|
100
|
+
function renderAssistantContent(content) {
|
|
101
|
+
if (typeof content === "string") {
|
|
102
|
+
return `<div class="content">${escapeHtml(content)}</div>`;
|
|
104
103
|
}
|
|
105
|
-
if (
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
if (part.type === "text" && part.text.trim()) {
|
|
114
|
-
html += `<div class="content">${escapeHtml(part.text)}</div>`;
|
|
115
|
-
}
|
|
116
|
-
else if (part.type === "tool-call") {
|
|
117
|
-
html += renderToolCall(part);
|
|
118
|
-
}
|
|
104
|
+
if (Array.isArray(content)) {
|
|
105
|
+
let html = "";
|
|
106
|
+
for (const part of content) {
|
|
107
|
+
if (part.type === "text" && part.text.trim()) {
|
|
108
|
+
html += `<div class="content">${escapeHtml(part.text)}</div>`;
|
|
109
|
+
}
|
|
110
|
+
else if (part.type === "tool-call") {
|
|
111
|
+
html += renderToolCall(part);
|
|
119
112
|
}
|
|
120
113
|
}
|
|
121
|
-
html += "</div>";
|
|
122
114
|
return html;
|
|
123
115
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
116
|
+
return "";
|
|
117
|
+
}
|
|
118
|
+
function renderAssistantMessage(content) {
|
|
119
|
+
return `<div class="message assistant"><div class="role">assistant</div>${renderAssistantContent(content)}</div>`;
|
|
120
|
+
}
|
|
121
|
+
function renderToolMessage(parts) {
|
|
122
|
+
let html = "";
|
|
123
|
+
for (const part of parts) {
|
|
124
|
+
if (part.type === "tool-result") {
|
|
125
|
+
html += renderToolResult(part);
|
|
131
126
|
}
|
|
132
|
-
return html;
|
|
133
127
|
}
|
|
128
|
+
return html;
|
|
129
|
+
}
|
|
130
|
+
function renderMessage(message) {
|
|
131
|
+
const role = message.role;
|
|
132
|
+
if (role === "system")
|
|
133
|
+
return renderSystemMessage(message.content);
|
|
134
|
+
if (role === "user")
|
|
135
|
+
return renderUserMessage(message.content);
|
|
136
|
+
if (role === "assistant")
|
|
137
|
+
return renderAssistantMessage(message.content);
|
|
138
|
+
if (role === "tool")
|
|
139
|
+
return renderToolMessage(message.content);
|
|
134
140
|
return "";
|
|
135
141
|
}
|
|
136
142
|
export function renderSessionHtml(session) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/commands/tools/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa/D,wBAAgB,YAAY,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW,CA6CjE"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import style from "../../terminal/style.js";
|
|
4
|
+
import { Text } from "../../tui/index.js";
|
|
5
|
+
import { bashTemplate, nodeTemplate, textCompanionTemplate, textSchemaTemplate, zshTemplate, } from "./templates.js";
|
|
6
|
+
const TOOL_NAME_REGEX = /^[a-zA-Z_][a-zA-Z0-9_-]*$/;
|
|
7
|
+
export function toolsCommand(options) {
|
|
8
|
+
return {
|
|
9
|
+
command: "/tools",
|
|
10
|
+
description: "Manage dynamic tools (make, list)",
|
|
11
|
+
aliases: [],
|
|
12
|
+
getSubCommands: async () => ["make", "list"],
|
|
13
|
+
async handle(args, { tui, container, editor, }) {
|
|
14
|
+
const subCommand = args[0];
|
|
15
|
+
if (subCommand === "make") {
|
|
16
|
+
return handleToolMake(args.slice(1), options, container, editor, tui);
|
|
17
|
+
}
|
|
18
|
+
if (subCommand === "list") {
|
|
19
|
+
return handleToolList(options, container, editor, tui);
|
|
20
|
+
}
|
|
21
|
+
// Default: show help
|
|
22
|
+
container.addChild(new Text(style.dim("Usage: /tools make <name> [--bash|--zsh|--node|--text] [--description <desc>] [--dir <path>]"), 0, 1));
|
|
23
|
+
container.addChild(new Text(style.dim(" /tools list"), 0, 1));
|
|
24
|
+
return "continue";
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
function writeToolFile(filePath, content, makeExecutable) {
|
|
29
|
+
const files = [];
|
|
30
|
+
fs.writeFileSync(filePath, content, "utf8");
|
|
31
|
+
if (makeExecutable) {
|
|
32
|
+
fs.chmodSync(filePath, 0o755);
|
|
33
|
+
}
|
|
34
|
+
files.push(filePath);
|
|
35
|
+
return files;
|
|
36
|
+
}
|
|
37
|
+
function createToolFiles(toolName, description, toolType, outputDir) {
|
|
38
|
+
const files = [];
|
|
39
|
+
const typeConfig = {
|
|
40
|
+
node: {
|
|
41
|
+
ext: ".mjs",
|
|
42
|
+
template: () => nodeTemplate(toolName, description),
|
|
43
|
+
executable: true,
|
|
44
|
+
},
|
|
45
|
+
bash: {
|
|
46
|
+
ext: ".sh",
|
|
47
|
+
template: () => bashTemplate(toolName, description),
|
|
48
|
+
executable: true,
|
|
49
|
+
},
|
|
50
|
+
zsh: {
|
|
51
|
+
ext: ".zsh",
|
|
52
|
+
template: () => zshTemplate(toolName, description),
|
|
53
|
+
executable: true,
|
|
54
|
+
},
|
|
55
|
+
text: { ext: ".sh", template: () => "", executable: true }, // handled separately
|
|
56
|
+
};
|
|
57
|
+
if (toolType === "text") {
|
|
58
|
+
const toolFilePath = path.join(outputDir, `${toolName}.tool`);
|
|
59
|
+
const companionFilePath = path.join(outputDir, `${toolName}.sh`);
|
|
60
|
+
if (fs.existsSync(toolFilePath))
|
|
61
|
+
return toolFilePath;
|
|
62
|
+
if (fs.existsSync(companionFilePath))
|
|
63
|
+
return companionFilePath;
|
|
64
|
+
files.push(...writeToolFile(toolFilePath, textSchemaTemplate(toolName, description), false));
|
|
65
|
+
files.push(...writeToolFile(companionFilePath, textCompanionTemplate(toolName), true));
|
|
66
|
+
return files;
|
|
67
|
+
}
|
|
68
|
+
const config = typeConfig[toolType];
|
|
69
|
+
const filePath = path.join(outputDir, `${toolName}${config.ext}`);
|
|
70
|
+
if (fs.existsSync(filePath))
|
|
71
|
+
return filePath;
|
|
72
|
+
files.push(...writeToolFile(filePath, config.template(), config.executable));
|
|
73
|
+
return files;
|
|
74
|
+
}
|
|
75
|
+
const TYPE_FLAGS = {
|
|
76
|
+
"--bash": "bash",
|
|
77
|
+
"--zsh": "zsh",
|
|
78
|
+
"--node": "node",
|
|
79
|
+
"--text": "text",
|
|
80
|
+
};
|
|
81
|
+
function parseToolArgs(args) {
|
|
82
|
+
let toolName = "";
|
|
83
|
+
let toolType = "bash";
|
|
84
|
+
let description = "";
|
|
85
|
+
let customDir = "";
|
|
86
|
+
for (let i = 0; i < args.length; i++) {
|
|
87
|
+
const arg = args[i];
|
|
88
|
+
const typeFlag = TYPE_FLAGS[arg];
|
|
89
|
+
if (typeFlag) {
|
|
90
|
+
toolType = typeFlag;
|
|
91
|
+
}
|
|
92
|
+
else if (arg === "--description" || arg === "-d") {
|
|
93
|
+
description = args[++i] || "";
|
|
94
|
+
}
|
|
95
|
+
else if (arg === "--dir") {
|
|
96
|
+
customDir = args[++i] || "";
|
|
97
|
+
}
|
|
98
|
+
else if (!arg.startsWith("-")) {
|
|
99
|
+
toolName = arg;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return { toolName, toolType, description, customDir };
|
|
103
|
+
}
|
|
104
|
+
function showToolError(container, editor, tui, message, usage) {
|
|
105
|
+
container.addChild(new Text(style.red(message), 0, 1));
|
|
106
|
+
if (usage) {
|
|
107
|
+
container.addChild(new Text(style.dim(usage), 0, 1));
|
|
108
|
+
}
|
|
109
|
+
tui.requestRender();
|
|
110
|
+
editor.setText("");
|
|
111
|
+
return "continue";
|
|
112
|
+
}
|
|
113
|
+
function showToolSuccess(container, editor, tui, toolName, filePaths) {
|
|
114
|
+
container.addChild(new Text(style.green(`Created tool: ${toolName}`), 0, 1));
|
|
115
|
+
for (const filePath of filePaths) {
|
|
116
|
+
container.addChild(new Text(style.dim(` ${filePath}`), 0, 1));
|
|
117
|
+
}
|
|
118
|
+
container.addChild(new Text(style.dim("Restart acai or reload tools to use the new tool."), 0, 1));
|
|
119
|
+
tui.requestRender();
|
|
120
|
+
editor.setText("");
|
|
121
|
+
return "continue";
|
|
122
|
+
}
|
|
123
|
+
function handleToolMake(args, options, container, editor, tui) {
|
|
124
|
+
const parsed = parseToolArgs(args);
|
|
125
|
+
let { toolName, toolType, description, customDir } = parsed;
|
|
126
|
+
if (!toolName) {
|
|
127
|
+
return showToolError(container, editor, tui, "Error: Tool name is required", "Usage: /tools make <name> [--bash|--zsh|--node|--text] [--description <desc>] [--dir <path>]");
|
|
128
|
+
}
|
|
129
|
+
if (!TOOL_NAME_REGEX.test(toolName)) {
|
|
130
|
+
return showToolError(container, editor, tui, `Error: Tool name must match ${TOOL_NAME_REGEX.source}`);
|
|
131
|
+
}
|
|
132
|
+
if (!description) {
|
|
133
|
+
description = `Dynamic tool: ${toolName}`;
|
|
134
|
+
}
|
|
135
|
+
const outputDir = customDir || path.join(options.workspace.primaryDir, ".acai", "tools");
|
|
136
|
+
if (!fs.existsSync(outputDir)) {
|
|
137
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
const result = createToolFiles(toolName, description, toolType, outputDir);
|
|
141
|
+
if (typeof result === "string") {
|
|
142
|
+
return showToolError(container, editor, tui, `Error: File already exists: ${result}`);
|
|
143
|
+
}
|
|
144
|
+
return showToolSuccess(container, editor, tui, toolName, result);
|
|
145
|
+
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
return showToolError(container, editor, tui, `Error creating tool: ${e.message}`);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
async function handleToolList(options, container, editor, tui) {
|
|
151
|
+
const projectDir = path.join(options.workspace.primaryDir, ".acai", "tools");
|
|
152
|
+
const userDir = path.join(process.env["HOME"] || process.env["USERPROFILE"] || "", ".acai", "tools");
|
|
153
|
+
const dirs = [
|
|
154
|
+
{ label: "User tools", dirPath: userDir },
|
|
155
|
+
{ label: "Project tools", dirPath: projectDir },
|
|
156
|
+
];
|
|
157
|
+
let foundAny = false;
|
|
158
|
+
for (const dir of dirs) {
|
|
159
|
+
if (!fs.existsSync(dir.dirPath)) {
|
|
160
|
+
container.addChild(new Text(style.dim(`${dir.label}: directory not found (${dir.dirPath})`), 0, 1));
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
const files = fs.readdirSync(dir.dirPath);
|
|
164
|
+
const toolFiles = files.filter((f) => f.endsWith(".js") ||
|
|
165
|
+
f.endsWith(".mjs") ||
|
|
166
|
+
f.endsWith(".cjs") ||
|
|
167
|
+
f.endsWith(".sh") ||
|
|
168
|
+
f.endsWith(".bash") ||
|
|
169
|
+
f.endsWith(".zsh") ||
|
|
170
|
+
f.endsWith(".py") ||
|
|
171
|
+
f.endsWith(".rb") ||
|
|
172
|
+
f.endsWith(".tool") ||
|
|
173
|
+
(!path.extname(f) &&
|
|
174
|
+
fs.statSync(path.join(dir.dirPath, f)).mode & 0o111));
|
|
175
|
+
if (toolFiles.length === 0) {
|
|
176
|
+
container.addChild(new Text(style.dim(`${dir.label}: no tools found`), 0, 1));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
foundAny = true;
|
|
180
|
+
container.addChild(new Text(style.bold(dir.label), 0, 1));
|
|
181
|
+
for (const file of toolFiles) {
|
|
182
|
+
container.addChild(new Text(style.dim(` ${file}`), 0, 1));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!foundAny) {
|
|
186
|
+
container.addChild(new Text(style.dim("No dynamic tools found."), 0, 1));
|
|
187
|
+
}
|
|
188
|
+
tui.requestRender();
|
|
189
|
+
editor.setText("");
|
|
190
|
+
return "continue";
|
|
191
|
+
}
|