indusagi-coding-agent 0.50.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/CHANGELOG.md +2249 -0
- package/README.md +546 -0
- package/dist/cli/args.js +282 -0
- package/dist/cli/config-selector.js +30 -0
- package/dist/cli/file-processor.js +78 -0
- package/dist/cli/list-models.js +91 -0
- package/dist/cli/session-picker.js +31 -0
- package/dist/cli.js +10 -0
- package/dist/config.js +158 -0
- package/dist/core/agent-session.js +2097 -0
- package/dist/core/auth-storage.js +278 -0
- package/dist/core/bash-executor.js +211 -0
- package/dist/core/compaction/branch-summarization.js +241 -0
- package/dist/core/compaction/compaction.js +606 -0
- package/dist/core/compaction/index.js +6 -0
- package/dist/core/compaction/utils.js +137 -0
- package/dist/core/diagnostics.js +1 -0
- package/dist/core/event-bus.js +24 -0
- package/dist/core/exec.js +70 -0
- package/dist/core/export-html/ansi-to-html.js +248 -0
- package/dist/core/export-html/index.js +221 -0
- package/dist/core/export-html/template.css +905 -0
- package/dist/core/export-html/template.html +54 -0
- package/dist/core/export-html/template.js +1549 -0
- package/dist/core/export-html/tool-renderer.js +56 -0
- package/dist/core/export-html/vendor/highlight.min.js +1213 -0
- package/dist/core/export-html/vendor/marked.min.js +6 -0
- package/dist/core/extensions/index.js +8 -0
- package/dist/core/extensions/loader.js +395 -0
- package/dist/core/extensions/runner.js +499 -0
- package/dist/core/extensions/types.js +31 -0
- package/dist/core/extensions/wrapper.js +101 -0
- package/dist/core/footer-data-provider.js +133 -0
- package/dist/core/index.js +8 -0
- package/dist/core/keybindings.js +140 -0
- package/dist/core/messages.js +122 -0
- package/dist/core/model-registry.js +454 -0
- package/dist/core/model-resolver.js +309 -0
- package/dist/core/package-manager.js +1142 -0
- package/dist/core/prompt-templates.js +250 -0
- package/dist/core/resource-loader.js +569 -0
- package/dist/core/sdk.js +225 -0
- package/dist/core/session-manager.js +1078 -0
- package/dist/core/settings-manager.js +430 -0
- package/dist/core/skills.js +339 -0
- package/dist/core/system-prompt.js +136 -0
- package/dist/core/timings.js +24 -0
- package/dist/core/tools/bash.js +226 -0
- package/dist/core/tools/edit-diff.js +242 -0
- package/dist/core/tools/edit.js +145 -0
- package/dist/core/tools/find.js +205 -0
- package/dist/core/tools/grep.js +238 -0
- package/dist/core/tools/index.js +60 -0
- package/dist/core/tools/ls.js +117 -0
- package/dist/core/tools/path-utils.js +52 -0
- package/dist/core/tools/read.js +165 -0
- package/dist/core/tools/truncate.js +204 -0
- package/dist/core/tools/write.js +77 -0
- package/dist/index.js +41 -0
- package/dist/main.js +565 -0
- package/dist/migrations.js +260 -0
- package/dist/modes/index.js +7 -0
- package/dist/modes/interactive/components/armin.js +328 -0
- package/dist/modes/interactive/components/assistant-message.js +86 -0
- package/dist/modes/interactive/components/bash-execution.js +155 -0
- package/dist/modes/interactive/components/bordered-loader.js +47 -0
- package/dist/modes/interactive/components/branch-summary-message.js +41 -0
- package/dist/modes/interactive/components/compaction-summary-message.js +42 -0
- package/dist/modes/interactive/components/config-selector.js +458 -0
- package/dist/modes/interactive/components/countdown-timer.js +27 -0
- package/dist/modes/interactive/components/custom-editor.js +61 -0
- package/dist/modes/interactive/components/custom-message.js +80 -0
- package/dist/modes/interactive/components/diff.js +132 -0
- package/dist/modes/interactive/components/dynamic-border.js +19 -0
- package/dist/modes/interactive/components/extension-editor.js +96 -0
- package/dist/modes/interactive/components/extension-input.js +54 -0
- package/dist/modes/interactive/components/extension-selector.js +70 -0
- package/dist/modes/interactive/components/footer.js +213 -0
- package/dist/modes/interactive/components/index.js +31 -0
- package/dist/modes/interactive/components/keybinding-hints.js +60 -0
- package/dist/modes/interactive/components/login-dialog.js +138 -0
- package/dist/modes/interactive/components/model-selector.js +253 -0
- package/dist/modes/interactive/components/oauth-selector.js +91 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +262 -0
- package/dist/modes/interactive/components/session-selector-search.js +145 -0
- package/dist/modes/interactive/components/session-selector.js +698 -0
- package/dist/modes/interactive/components/settings-selector.js +250 -0
- package/dist/modes/interactive/components/show-images-selector.js +33 -0
- package/dist/modes/interactive/components/skill-invocation-message.js +44 -0
- package/dist/modes/interactive/components/theme-selector.js +43 -0
- package/dist/modes/interactive/components/thinking-selector.js +45 -0
- package/dist/modes/interactive/components/tool-execution.js +608 -0
- package/dist/modes/interactive/components/tree-selector.js +892 -0
- package/dist/modes/interactive/components/user-message-selector.js +109 -0
- package/dist/modes/interactive/components/user-message.js +15 -0
- package/dist/modes/interactive/components/visual-truncate.js +32 -0
- package/dist/modes/interactive/interactive-mode.js +3576 -0
- package/dist/modes/interactive/theme/dark.json +85 -0
- package/dist/modes/interactive/theme/light.json +84 -0
- package/dist/modes/interactive/theme/theme-schema.json +335 -0
- package/dist/modes/interactive/theme/theme.js +938 -0
- package/dist/modes/print-mode.js +96 -0
- package/dist/modes/rpc/rpc-client.js +390 -0
- package/dist/modes/rpc/rpc-mode.js +448 -0
- package/dist/modes/rpc/rpc-types.js +7 -0
- package/dist/utils/changelog.js +86 -0
- package/dist/utils/clipboard-image.js +116 -0
- package/dist/utils/clipboard.js +58 -0
- package/dist/utils/frontmatter.js +25 -0
- package/dist/utils/git.js +5 -0
- package/dist/utils/image-convert.js +34 -0
- package/dist/utils/image-resize.js +180 -0
- package/dist/utils/mime.js +25 -0
- package/dist/utils/photon.js +120 -0
- package/dist/utils/shell.js +164 -0
- package/dist/utils/sleep.js +16 -0
- package/dist/utils/tools-manager.js +186 -0
- package/docs/compaction.md +390 -0
- package/docs/custom-provider.md +538 -0
- package/docs/development.md +69 -0
- package/docs/extensions.md +1733 -0
- package/docs/images/doom-extension.png +0 -0
- package/docs/images/interactive-mode.png +0 -0
- package/docs/images/tree-view.png +0 -0
- package/docs/json.md +79 -0
- package/docs/keybindings.md +162 -0
- package/docs/models.md +193 -0
- package/docs/packages.md +163 -0
- package/docs/prompt-templates.md +67 -0
- package/docs/providers.md +147 -0
- package/docs/rpc.md +1048 -0
- package/docs/sdk.md +957 -0
- package/docs/session.md +412 -0
- package/docs/settings.md +216 -0
- package/docs/shell-aliases.md +13 -0
- package/docs/skills.md +226 -0
- package/docs/terminal-setup.md +65 -0
- package/docs/themes.md +295 -0
- package/docs/tree.md +219 -0
- package/docs/tui.md +887 -0
- package/docs/windows.md +17 -0
- package/examples/README.md +25 -0
- package/examples/extensions/README.md +192 -0
- package/examples/extensions/antigravity-image-gen.ts +414 -0
- package/examples/extensions/auto-commit-on-exit.ts +49 -0
- package/examples/extensions/bookmark.ts +50 -0
- package/examples/extensions/claude-rules.ts +86 -0
- package/examples/extensions/confirm-destructive.ts +59 -0
- package/examples/extensions/custom-compaction.ts +115 -0
- package/examples/extensions/custom-footer.ts +65 -0
- package/examples/extensions/custom-header.ts +73 -0
- package/examples/extensions/custom-provider-anthropic/index.ts +605 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
- package/examples/extensions/custom-provider-anthropic/package.json +19 -0
- package/examples/extensions/custom-provider-gitlab-duo/index.ts +350 -0
- package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
- package/examples/extensions/custom-provider-gitlab-duo/test.ts +83 -0
- package/examples/extensions/dirty-repo-guard.ts +56 -0
- package/examples/extensions/doom-overlay/README.md +46 -0
- package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
- package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
- package/examples/extensions/doom-overlay/doom/build.sh +152 -0
- package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
- package/examples/extensions/doom-overlay/doom-component.ts +133 -0
- package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
- package/examples/extensions/doom-overlay/doom-keys.ts +105 -0
- package/examples/extensions/doom-overlay/index.ts +74 -0
- package/examples/extensions/doom-overlay/wad-finder.ts +51 -0
- package/examples/extensions/event-bus.ts +43 -0
- package/examples/extensions/file-trigger.ts +41 -0
- package/examples/extensions/git-checkpoint.ts +53 -0
- package/examples/extensions/handoff.ts +151 -0
- package/examples/extensions/hello.ts +25 -0
- package/examples/extensions/inline-bash.ts +94 -0
- package/examples/extensions/input-transform.ts +43 -0
- package/examples/extensions/interactive-shell.ts +196 -0
- package/examples/extensions/mac-system-theme.ts +47 -0
- package/examples/extensions/message-renderer.ts +60 -0
- package/examples/extensions/modal-editor.ts +86 -0
- package/examples/extensions/model-status.ts +31 -0
- package/examples/extensions/notify.ts +25 -0
- package/examples/extensions/overlay-qa-tests.ts +882 -0
- package/examples/extensions/overlay-test.ts +151 -0
- package/examples/extensions/permission-gate.ts +34 -0
- package/examples/extensions/pirate.ts +47 -0
- package/examples/extensions/plan-mode/README.md +65 -0
- package/examples/extensions/plan-mode/index.ts +341 -0
- package/examples/extensions/plan-mode/utils.ts +168 -0
- package/examples/extensions/preset.ts +399 -0
- package/examples/extensions/protected-paths.ts +30 -0
- package/examples/extensions/qna.ts +120 -0
- package/examples/extensions/question.ts +265 -0
- package/examples/extensions/questionnaire.ts +428 -0
- package/examples/extensions/rainbow-editor.ts +88 -0
- package/examples/extensions/sandbox/index.ts +318 -0
- package/examples/extensions/sandbox/package-lock.json +92 -0
- package/examples/extensions/sandbox/package.json +19 -0
- package/examples/extensions/send-user-message.ts +97 -0
- package/examples/extensions/session-name.ts +27 -0
- package/examples/extensions/shutdown-command.ts +63 -0
- package/examples/extensions/snake.ts +344 -0
- package/examples/extensions/space-invaders.ts +561 -0
- package/examples/extensions/ssh.ts +220 -0
- package/examples/extensions/status-line.ts +40 -0
- package/examples/extensions/subagent/README.md +172 -0
- package/examples/extensions/subagent/agents/planner.md +37 -0
- package/examples/extensions/subagent/agents/reviewer.md +35 -0
- package/examples/extensions/subagent/agents/scout.md +50 -0
- package/examples/extensions/subagent/agents/worker.md +24 -0
- package/examples/extensions/subagent/agents.ts +127 -0
- package/examples/extensions/subagent/index.ts +964 -0
- package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
- package/examples/extensions/subagent/prompts/implement.md +10 -0
- package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
- package/examples/extensions/summarize.ts +196 -0
- package/examples/extensions/timed-confirm.ts +70 -0
- package/examples/extensions/todo.ts +300 -0
- package/examples/extensions/tool-override.ts +144 -0
- package/examples/extensions/tools.ts +147 -0
- package/examples/extensions/trigger-compact.ts +40 -0
- package/examples/extensions/truncated-tool.ts +193 -0
- package/examples/extensions/widget-placement.ts +17 -0
- package/examples/extensions/with-deps/index.ts +36 -0
- package/examples/extensions/with-deps/package-lock.json +31 -0
- package/examples/extensions/with-deps/package.json +22 -0
- package/examples/sdk/01-minimal.ts +22 -0
- package/examples/sdk/02-custom-model.ts +50 -0
- package/examples/sdk/03-custom-prompt.ts +55 -0
- package/examples/sdk/04-skills.ts +46 -0
- package/examples/sdk/05-tools.ts +56 -0
- package/examples/sdk/06-extensions.ts +88 -0
- package/examples/sdk/07-context-files.ts +40 -0
- package/examples/sdk/08-prompt-templates.ts +47 -0
- package/examples/sdk/09-api-keys-and-oauth.ts +48 -0
- package/examples/sdk/10-settings.ts +38 -0
- package/examples/sdk/11-sessions.ts +48 -0
- package/examples/sdk/12-full-control.ts +82 -0
- package/examples/sdk/13-codex-oauth.ts +37 -0
- package/examples/sdk/README.md +144 -0
- package/package.json +85 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Container, getEditorKeybindings, Spacer, Text, truncateToWidth } from "indusagi/tui";
|
|
2
|
+
import { theme } from "../theme/theme.js";
|
|
3
|
+
import { DynamicBorder } from "./dynamic-border.js";
|
|
4
|
+
/**
|
|
5
|
+
* Custom user message list component with selection
|
|
6
|
+
*/
|
|
7
|
+
class UserMessageList {
|
|
8
|
+
constructor(messages) {
|
|
9
|
+
this.messages = [];
|
|
10
|
+
this.selectedIndex = 0;
|
|
11
|
+
this.maxVisible = 10; // Max messages visible
|
|
12
|
+
// Store messages in chronological order (oldest to newest)
|
|
13
|
+
this.messages = messages;
|
|
14
|
+
// Start with the last (most recent) message selected
|
|
15
|
+
this.selectedIndex = Math.max(0, messages.length - 1);
|
|
16
|
+
}
|
|
17
|
+
invalidate() {
|
|
18
|
+
// No cached state to invalidate currently
|
|
19
|
+
}
|
|
20
|
+
render(width) {
|
|
21
|
+
const lines = [];
|
|
22
|
+
if (this.messages.length === 0) {
|
|
23
|
+
lines.push(theme.fg("muted", " No user messages found"));
|
|
24
|
+
return lines;
|
|
25
|
+
}
|
|
26
|
+
// Calculate visible range with scrolling
|
|
27
|
+
const startIndex = Math.max(0, Math.min(this.selectedIndex - Math.floor(this.maxVisible / 2), this.messages.length - this.maxVisible));
|
|
28
|
+
const endIndex = Math.min(startIndex + this.maxVisible, this.messages.length);
|
|
29
|
+
// Render visible messages (2 lines per message + blank line)
|
|
30
|
+
for (let i = startIndex; i < endIndex; i++) {
|
|
31
|
+
const message = this.messages[i];
|
|
32
|
+
const isSelected = i === this.selectedIndex;
|
|
33
|
+
// Normalize message to single line
|
|
34
|
+
const normalizedMessage = message.text.replace(/\n/g, " ").trim();
|
|
35
|
+
// First line: cursor + message
|
|
36
|
+
const cursor = isSelected ? theme.fg("accent", "› ") : " ";
|
|
37
|
+
const maxMsgWidth = width - 2; // Account for cursor (2 chars)
|
|
38
|
+
const truncatedMsg = truncateToWidth(normalizedMessage, maxMsgWidth);
|
|
39
|
+
const messageLine = cursor + (isSelected ? theme.bold(truncatedMsg) : truncatedMsg);
|
|
40
|
+
lines.push(messageLine);
|
|
41
|
+
// Second line: metadata (position in history)
|
|
42
|
+
const position = i + 1;
|
|
43
|
+
const metadata = ` Message ${position} of ${this.messages.length}`;
|
|
44
|
+
const metadataLine = theme.fg("muted", metadata);
|
|
45
|
+
lines.push(metadataLine);
|
|
46
|
+
lines.push(""); // Blank line between messages
|
|
47
|
+
}
|
|
48
|
+
// Add scroll indicator if needed
|
|
49
|
+
if (startIndex > 0 || endIndex < this.messages.length) {
|
|
50
|
+
const scrollInfo = theme.fg("muted", ` (${this.selectedIndex + 1}/${this.messages.length})`);
|
|
51
|
+
lines.push(scrollInfo);
|
|
52
|
+
}
|
|
53
|
+
return lines;
|
|
54
|
+
}
|
|
55
|
+
handleInput(keyData) {
|
|
56
|
+
const kb = getEditorKeybindings();
|
|
57
|
+
// Up arrow - go to previous (older) message, wrap to bottom when at top
|
|
58
|
+
if (kb.matches(keyData, "selectUp")) {
|
|
59
|
+
this.selectedIndex = this.selectedIndex === 0 ? this.messages.length - 1 : this.selectedIndex - 1;
|
|
60
|
+
}
|
|
61
|
+
// Down arrow - go to next (newer) message, wrap to top when at bottom
|
|
62
|
+
else if (kb.matches(keyData, "selectDown")) {
|
|
63
|
+
this.selectedIndex = this.selectedIndex === this.messages.length - 1 ? 0 : this.selectedIndex + 1;
|
|
64
|
+
}
|
|
65
|
+
// Enter - select message and branch
|
|
66
|
+
else if (kb.matches(keyData, "selectConfirm")) {
|
|
67
|
+
const selected = this.messages[this.selectedIndex];
|
|
68
|
+
if (selected && this.onSelect) {
|
|
69
|
+
this.onSelect(selected.id);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Escape - cancel
|
|
73
|
+
else if (kb.matches(keyData, "selectCancel")) {
|
|
74
|
+
if (this.onCancel) {
|
|
75
|
+
this.onCancel();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Component that renders a user message selector for branching
|
|
82
|
+
*/
|
|
83
|
+
export class UserMessageSelectorComponent extends Container {
|
|
84
|
+
constructor(messages, onSelect, onCancel) {
|
|
85
|
+
super();
|
|
86
|
+
// Add header
|
|
87
|
+
this.addChild(new Spacer(1));
|
|
88
|
+
this.addChild(new Text(theme.bold("Branch from Message"), 1, 0));
|
|
89
|
+
this.addChild(new Text(theme.fg("muted", "Select a message to create a new branch from that point"), 1, 0));
|
|
90
|
+
this.addChild(new Spacer(1));
|
|
91
|
+
this.addChild(new DynamicBorder());
|
|
92
|
+
this.addChild(new Spacer(1));
|
|
93
|
+
// Create message list
|
|
94
|
+
this.messageList = new UserMessageList(messages);
|
|
95
|
+
this.messageList.onSelect = onSelect;
|
|
96
|
+
this.messageList.onCancel = onCancel;
|
|
97
|
+
this.addChild(this.messageList);
|
|
98
|
+
// Add bottom border
|
|
99
|
+
this.addChild(new Spacer(1));
|
|
100
|
+
this.addChild(new DynamicBorder());
|
|
101
|
+
// Auto-cancel if no messages
|
|
102
|
+
if (messages.length === 0) {
|
|
103
|
+
setTimeout(() => onCancel(), 100);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
getMessageList() {
|
|
107
|
+
return this.messageList;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Container, Markdown, Spacer } from "indusagi/tui";
|
|
2
|
+
import { getMarkdownTheme, theme } from "../theme/theme.js";
|
|
3
|
+
/**
|
|
4
|
+
* Component that renders a user message
|
|
5
|
+
*/
|
|
6
|
+
export class UserMessageComponent extends Container {
|
|
7
|
+
constructor(text, markdownTheme = getMarkdownTheme()) {
|
|
8
|
+
super();
|
|
9
|
+
this.addChild(new Spacer(1));
|
|
10
|
+
this.addChild(new Markdown(text, 1, 1, markdownTheme, {
|
|
11
|
+
bgColor: (text) => theme.bg("userMessageBg", text),
|
|
12
|
+
color: (text) => theme.fg("userMessageText", text),
|
|
13
|
+
}));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared utility for truncating text to visual lines (accounting for line wrapping).
|
|
3
|
+
* Used by both tool-execution.ts and bash-execution.ts for consistent behavior.
|
|
4
|
+
*/
|
|
5
|
+
import { Text } from "indusagi/tui";
|
|
6
|
+
/**
|
|
7
|
+
* Truncate text to a maximum number of visual lines (from the end).
|
|
8
|
+
* This accounts for line wrapping based on terminal width.
|
|
9
|
+
*
|
|
10
|
+
* @param text - The text content (may contain newlines)
|
|
11
|
+
* @param maxVisualLines - Maximum number of visual lines to show
|
|
12
|
+
* @param width - Terminal/render width
|
|
13
|
+
* @param paddingX - Horizontal padding for Text component (default 0).
|
|
14
|
+
* Use 0 when result will be placed in a Box (Box adds its own padding).
|
|
15
|
+
* Use 1 when result will be placed in a plain Container.
|
|
16
|
+
* @returns The truncated visual lines and count of skipped lines
|
|
17
|
+
*/
|
|
18
|
+
export function truncateToVisualLines(text, maxVisualLines, width, paddingX = 0) {
|
|
19
|
+
if (!text) {
|
|
20
|
+
return { visualLines: [], skippedCount: 0 };
|
|
21
|
+
}
|
|
22
|
+
// Create a temporary Text component to render and get visual lines
|
|
23
|
+
const tempText = new Text(text, paddingX, 0);
|
|
24
|
+
const allVisualLines = tempText.render(width);
|
|
25
|
+
if (allVisualLines.length <= maxVisualLines) {
|
|
26
|
+
return { visualLines: allVisualLines, skippedCount: 0 };
|
|
27
|
+
}
|
|
28
|
+
// Take the last N visual lines
|
|
29
|
+
const truncatedLines = allVisualLines.slice(-maxVisualLines);
|
|
30
|
+
const skippedCount = allVisualLines.length - maxVisualLines;
|
|
31
|
+
return { visualLines: truncatedLines, skippedCount };
|
|
32
|
+
}
|