@nghyane/arcane 0.1.13 → 0.1.15
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 +28 -0
- package/package.json +21 -70
- package/scripts/format-prompts.ts +1 -3
- package/src/cli/args.ts +2 -7
- package/src/cli/config-cli.ts +1 -1
- package/src/cli/plugin-cli.ts +1 -1
- package/src/cli/setup-cli.ts +1 -1
- package/src/cli/update-cli.ts +1 -1
- package/src/cli/web-search-cli.ts +1 -1
- package/src/cli.ts +0 -1
- package/src/commands/config.ts +1 -1
- package/src/commands/grep.ts +1 -1
- package/src/commands/jupyter.ts +1 -1
- package/src/commands/plugin.ts +1 -1
- package/src/commands/setup.ts +1 -1
- package/src/commands/shell.ts +1 -1
- package/src/commands/ssh.ts +1 -1
- package/src/commands/stats.ts +1 -1
- package/src/commands/update.ts +1 -1
- package/src/config/model-registry.ts +3 -4
- package/src/config/model-resolver.ts +36 -9
- package/src/config/prompt-templates.ts +1 -9
- package/src/config/settings-schema.ts +32 -88
- package/src/config/settings.ts +3 -4
- package/src/debug/index.ts +1 -1
- package/src/debug/log-formatting.ts +1 -1
- package/src/debug/log-viewer.ts +2 -2
- package/src/discovery/helpers.ts +13 -3
- package/src/exa/index.ts +1 -35
- package/src/exa/render.ts +30 -190
- package/src/export/html/index.ts +1 -1
- package/src/extensibility/custom-tools/loader.ts +1 -1
- package/src/extensibility/custom-tools/types.ts +5 -1
- package/src/extensibility/custom-tools/wrapper.ts +1 -1
- package/src/extensibility/extensions/runner.ts +1 -1
- package/src/extensibility/extensions/types.ts +1 -1
- package/src/extensibility/extensions/wrapper.ts +7 -15
- package/src/extensibility/hooks/runner.ts +1 -1
- package/src/extensibility/hooks/types.ts +1 -1
- package/src/extensibility/plugins/doctor.ts +1 -1
- package/src/index.ts +13 -13
- package/src/lsp/index.ts +77 -24
- package/src/lsp/render.ts +34 -583
- package/src/lsp/types.ts +3 -3
- package/src/lsp/utils.ts +1 -1
- package/src/main.ts +1 -1
- package/src/mcp/tool-bridge.ts +1 -24
- package/src/modes/components/assistant-message.ts +7 -7
- package/src/modes/components/bash-execution.ts +50 -112
- package/src/modes/components/bordered-loader.ts +1 -1
- package/src/modes/components/branch-summary-message.ts +16 -10
- package/src/modes/components/compaction-summary-message.ts +20 -12
- package/src/modes/components/context-group.ts +106 -0
- package/src/modes/components/custom-message.ts +4 -5
- package/src/modes/components/diff.ts +2 -2
- package/src/modes/components/dynamic-border.ts +1 -1
- package/src/modes/components/extensions/extension-dashboard.ts +1 -1
- package/src/modes/components/extensions/extension-list.ts +1 -1
- package/src/modes/components/extensions/inspector-panel.ts +1 -1
- package/src/modes/components/footer.ts +2 -2
- package/src/modes/components/history-search.ts +1 -1
- package/src/modes/components/hook-editor.ts +1 -1
- package/src/modes/components/hook-input.ts +1 -1
- package/src/modes/components/hook-message.ts +4 -5
- package/src/modes/components/hook-selector.ts +1 -1
- package/src/modes/components/index.ts +0 -2
- package/src/modes/components/keybinding-hints.ts +1 -1
- package/src/modes/components/login-dialog.ts +1 -1
- package/src/modes/components/mcp-add-wizard.ts +1 -1
- package/src/modes/components/model-selector.ts +1 -1
- package/src/modes/components/oauth-selector.ts +1 -1
- package/src/modes/components/plugin-settings.ts +1 -1
- package/src/modes/components/python-execution.ts +51 -91
- package/src/modes/components/queue-mode-selector.ts +1 -1
- package/src/modes/components/session-selector.ts +1 -1
- package/src/modes/components/settings-defs.ts +5 -10
- package/src/modes/components/settings-selector.ts +1 -1
- package/src/modes/components/show-images-selector.ts +1 -1
- package/src/modes/components/skill-message.ts +4 -4
- package/src/modes/components/status-line/segments.ts +2 -2
- package/src/modes/components/status-line/separators.ts +1 -1
- package/src/modes/components/status-line-segment-editor.ts +1 -1
- package/src/modes/components/status-line.ts +1 -1
- package/src/modes/components/theme-selector.ts +1 -1
- package/src/modes/components/thinking-selector.ts +1 -1
- package/src/modes/components/todo-display.ts +2 -4
- package/src/modes/components/todo-reminder.ts +4 -4
- package/src/modes/components/tool-execution.ts +118 -440
- package/src/modes/components/tool-image-display.ts +107 -0
- package/src/modes/components/tree-selector.ts +2 -2
- package/src/modes/components/ttsr-notification.ts +4 -17
- package/src/modes/components/user-message-selector.ts +1 -1
- package/src/modes/components/user-message.ts +9 -10
- package/src/modes/components/welcome.ts +1 -1
- package/src/modes/controllers/command-controller.ts +1 -1
- package/src/modes/controllers/event-controller.ts +58 -187
- package/src/modes/controllers/extension-ui-controller.ts +1 -1
- package/src/modes/controllers/input-controller.ts +3 -1
- package/src/modes/controllers/mcp-command-controller.ts +1 -1
- package/src/modes/controllers/selector-controller.ts +3 -26
- package/src/modes/controllers/ssh-command-controller.ts +1 -1
- package/src/modes/interactive-mode.ts +3 -7
- package/src/modes/print-mode.ts +5 -5
- package/src/modes/rpc/rpc-mode.ts +1 -1
- package/src/modes/types.ts +1 -2
- package/src/modes/utils/ui-helpers.ts +34 -32
- package/src/patch/edit-tool.ts +742 -0
- package/src/patch/index.ts +32 -898
- package/src/patch/schemas.ts +208 -0
- package/src/patch/shared.ts +83 -151
- package/src/prompts/agents/explore.md +22 -37
- package/src/prompts/agents/init.md +1 -1
- package/src/prompts/agents/librarian.md +29 -20
- package/src/prompts/agents/oracle.md +9 -2
- package/src/prompts/agents/reviewer.md +14 -48
- package/src/prompts/agents/task.md +16 -8
- package/src/prompts/compaction/branch-summary.md +4 -1
- package/src/prompts/compaction/compaction-summary.md +4 -1
- package/src/prompts/system/subagent-system-prompt.md +1 -1
- package/src/prompts/system/system-prompt.md +162 -178
- package/src/prompts/system/verification-reminder.md +6 -0
- package/src/sdk.ts +0 -9
- package/src/session/agent-session.ts +244 -1459
- package/src/session/model-controller.ts +406 -0
- package/src/session/retry-utils.ts +71 -0
- package/src/session/session-manager.ts +22 -186
- package/src/session/session-types.ts +312 -0
- package/src/session/stats.ts +387 -0
- package/src/session/streaming-edit.ts +258 -0
- package/src/session/ttsr.ts +213 -0
- package/src/slash-commands/builtin-registry.ts +0 -8
- package/src/stt/recorder.ts +2 -2
- package/src/system-prompt.ts +1 -14
- package/src/task/agents.ts +7 -33
- package/src/task/executor.ts +50 -438
- package/src/task/index.ts +104 -71
- package/src/task/progress-tracker.ts +390 -0
- package/src/task/render.ts +371 -187
- package/src/task/subprocess-tool-registry.ts +1 -1
- package/src/task/types.ts +14 -47
- package/src/tools/ask.ts +31 -42
- package/src/tools/bash-interactive.ts +2 -2
- package/src/tools/bash-interceptor.ts +2 -2
- package/src/tools/bash-normalize.ts +1 -1
- package/src/tools/bash-skill-urls.ts +2 -2
- package/src/tools/bash.ts +87 -136
- package/src/tools/browser.ts +54 -84
- package/src/tools/create-tools.ts +186 -0
- package/src/tools/default-renderer.ts +104 -0
- package/src/tools/explore.ts +11 -10
- package/src/tools/fetch.ts +24 -114
- package/src/tools/find.ts +48 -132
- package/src/tools/gemini-image.ts +5 -15
- package/src/tools/github.ts +450 -0
- package/src/tools/grep.ts +43 -179
- package/src/tools/index.ts +35 -198
- package/src/tools/json-tree.ts +3 -3
- package/src/tools/librarian.ts +18 -18
- package/src/tools/list-limit.ts +2 -2
- package/src/tools/notebook.ts +35 -87
- package/src/tools/oracle.ts +25 -25
- package/src/tools/output-meta.ts +89 -4
- package/src/tools/output-utils.ts +2 -2
- package/src/tools/python.ts +86 -637
- package/src/tools/read.ts +36 -119
- package/src/tools/reviewer-tool.ts +19 -21
- package/src/tools/search-code.ts +128 -0
- package/src/tools/ssh.ts +67 -126
- package/src/tools/subagent-tool.ts +197 -123
- package/src/tools/todo-write.ts +15 -31
- package/src/tools/tool-errors.ts +0 -30
- package/src/tools/undo-edit.ts +30 -67
- package/src/tools/write.ts +78 -127
- package/src/tui/code-cell.ts +4 -4
- package/src/tui/file-list.ts +2 -2
- package/src/tui/output-block.ts +1 -1
- package/src/tui/status-line.ts +1 -1
- package/src/tui/tree-list.ts +2 -2
- package/src/tui/types.ts +1 -1
- package/src/tui/utils.ts +1 -1
- package/src/{tools → ui}/render-utils.ts +87 -126
- package/src/utils/external-editor.ts +4 -4
- package/src/utils/file-mentions.ts +1 -1
- package/src/utils/index.ts +30 -0
- package/src/utils/tools-manager.ts +9 -19
- package/src/web/github-client.ts +290 -0
- package/src/web/scrapers/github.ts +11 -62
- package/src/web/search/auth.ts +1 -3
- package/src/web/search/index.ts +82 -46
- package/src/web/search/provider.ts +11 -16
- package/src/web/search/providers/grep.ts +160 -0
- package/src/web/search/render.ts +48 -235
- package/src/web/search/types.ts +1 -1
- package/src/commands/commit.ts +0 -36
- package/src/commit/agentic/agent.ts +0 -311
- package/src/commit/agentic/fallback.ts +0 -96
- package/src/commit/agentic/index.ts +0 -359
- package/src/commit/agentic/prompts/analyze-file.md +0 -22
- package/src/commit/agentic/prompts/session-user.md +0 -25
- package/src/commit/agentic/prompts/split-confirm.md +0 -1
- package/src/commit/agentic/prompts/system.md +0 -38
- package/src/commit/agentic/state.ts +0 -69
- package/src/commit/agentic/tools/analyze-file.ts +0 -118
- package/src/commit/agentic/tools/git-file-diff.ts +0 -194
- package/src/commit/agentic/tools/git-hunk.ts +0 -50
- package/src/commit/agentic/tools/git-overview.ts +0 -84
- package/src/commit/agentic/tools/index.ts +0 -56
- package/src/commit/agentic/tools/propose-changelog.ts +0 -128
- package/src/commit/agentic/tools/propose-commit.ts +0 -154
- package/src/commit/agentic/tools/recent-commits.ts +0 -81
- package/src/commit/agentic/tools/split-commit.ts +0 -280
- package/src/commit/agentic/topo-sort.ts +0 -44
- package/src/commit/agentic/trivial.ts +0 -51
- package/src/commit/agentic/validation.ts +0 -200
- package/src/commit/analysis/conventional.ts +0 -165
- package/src/commit/analysis/index.ts +0 -4
- package/src/commit/analysis/scope.ts +0 -242
- package/src/commit/analysis/summary.ts +0 -112
- package/src/commit/analysis/validation.ts +0 -66
- package/src/commit/changelog/detect.ts +0 -37
- package/src/commit/changelog/generate.ts +0 -110
- package/src/commit/changelog/index.ts +0 -234
- package/src/commit/changelog/parse.ts +0 -44
- package/src/commit/cli.ts +0 -93
- package/src/commit/git/diff.ts +0 -148
- package/src/commit/git/errors.ts +0 -9
- package/src/commit/git/index.ts +0 -211
- package/src/commit/git/operations.ts +0 -54
- package/src/commit/index.ts +0 -5
- package/src/commit/map-reduce/index.ts +0 -64
- package/src/commit/map-reduce/map-phase.ts +0 -178
- package/src/commit/map-reduce/reduce-phase.ts +0 -145
- package/src/commit/map-reduce/utils.ts +0 -9
- package/src/commit/message.ts +0 -11
- package/src/commit/model-selection.ts +0 -69
- package/src/commit/pipeline.ts +0 -243
- package/src/commit/prompts/analysis-system.md +0 -148
- package/src/commit/prompts/analysis-user.md +0 -38
- package/src/commit/prompts/changelog-system.md +0 -50
- package/src/commit/prompts/changelog-user.md +0 -18
- package/src/commit/prompts/file-observer-system.md +0 -24
- package/src/commit/prompts/file-observer-user.md +0 -8
- package/src/commit/prompts/reduce-system.md +0 -50
- package/src/commit/prompts/reduce-user.md +0 -17
- package/src/commit/prompts/summary-retry.md +0 -3
- package/src/commit/prompts/summary-system.md +0 -38
- package/src/commit/prompts/summary-user.md +0 -13
- package/src/commit/prompts/types-description.md +0 -2
- package/src/commit/types.ts +0 -109
- package/src/commit/utils/exclusions.ts +0 -42
- package/src/mcp/render.ts +0 -123
- package/src/modes/components/agent-dashboard.ts +0 -1130
- package/src/modes/components/codemode-group.ts +0 -369
- package/src/modes/components/read-tool-group.ts +0 -119
- package/src/modes/components/visual-truncate.ts +0 -63
- package/src/prompts/system/subagent-user-prompt.md +0 -8
- package/src/prompts/tools/ask.md +0 -44
- package/src/prompts/tools/bash.md +0 -24
- package/src/prompts/tools/browser.md +0 -33
- package/src/prompts/tools/calculator.md +0 -12
- package/src/prompts/tools/explore.md +0 -29
- package/src/prompts/tools/fetch.md +0 -16
- package/src/prompts/tools/find.md +0 -18
- package/src/prompts/tools/gemini-image.md +0 -23
- package/src/prompts/tools/grep.md +0 -28
- package/src/prompts/tools/hashline.md +0 -232
- package/src/prompts/tools/librarian.md +0 -24
- package/src/prompts/tools/lsp.md +0 -28
- package/src/prompts/tools/oracle.md +0 -26
- package/src/prompts/tools/patch.md +0 -74
- package/src/prompts/tools/python.md +0 -66
- package/src/prompts/tools/read.md +0 -36
- package/src/prompts/tools/replace.md +0 -38
- package/src/prompts/tools/reviewer.md +0 -41
- package/src/prompts/tools/ssh.md +0 -51
- package/src/prompts/tools/task-summary.md +0 -28
- package/src/prompts/tools/task.md +0 -146
- package/src/prompts/tools/todo-write.md +0 -65
- package/src/prompts/tools/undo-edit.md +0 -7
- package/src/prompts/tools/web-search.md +0 -19
- package/src/prompts/tools/write.md +0 -18
- package/src/task/batch.ts +0 -102
- package/src/task/discovery.ts +0 -126
- package/src/task/parallel.ts +0 -84
- package/src/task/template.ts +0 -32
- package/src/tools/calculator.ts +0 -537
- package/src/tools/jtd-to-typescript.ts +0 -198
- package/src/tools/renderers.ts +0 -60
- package/src/tools/tool-result.ts +0 -86
- /package/src/{modes/theme → theme}/dark.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-catppuccin.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-dracula.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-gruvbox.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-solarized.json +0 -0
- /package/src/{modes/theme → theme}/defaults/dark-tokyo-night.json +0 -0
- /package/src/{modes/theme → theme}/defaults/index.ts +0 -0
- /package/src/{modes/theme → theme}/defaults/light-catppuccin.json +0 -0
- /package/src/{modes/theme → theme}/defaults/light-github.json +0 -0
- /package/src/{modes/theme → theme}/defaults/light-solarized.json +0 -0
- /package/src/{modes/theme → theme}/light.json +0 -0
- /package/src/{modes/theme → theme}/mermaid-cache.ts +0 -0
- /package/src/{modes/theme → theme}/theme-schema.json +0 -0
- /package/src/{modes/theme → theme}/theme.ts +0 -0
|
@@ -262,15 +262,6 @@ export const SETTINGS_SCHEMA = {
|
|
|
262
262
|
description: "Rewrite tool call arguments to normalized format in session history",
|
|
263
263
|
},
|
|
264
264
|
},
|
|
265
|
-
repeatToolDescriptions: {
|
|
266
|
-
type: "boolean",
|
|
267
|
-
default: false,
|
|
268
|
-
ui: {
|
|
269
|
-
tab: "agent",
|
|
270
|
-
label: "Repeat tool descriptions",
|
|
271
|
-
description: "Render full tool descriptions in the system prompt instead of a tool name list",
|
|
272
|
-
},
|
|
273
|
-
},
|
|
274
265
|
readLineNumbers: {
|
|
275
266
|
type: "boolean",
|
|
276
267
|
default: false,
|
|
@@ -397,6 +388,29 @@ export const SETTINGS_SCHEMA = {
|
|
|
397
388
|
},
|
|
398
389
|
"retry.baseDelayMs": { type: "number", default: 2000 },
|
|
399
390
|
|
|
391
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
392
|
+
// Verification loop settings
|
|
393
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
394
|
+
"verification.autoCheck": {
|
|
395
|
+
type: "boolean",
|
|
396
|
+
default: true,
|
|
397
|
+
ui: {
|
|
398
|
+
tab: "agent",
|
|
399
|
+
label: "Auto-verify changes",
|
|
400
|
+
description: "Automatically remind agent to verify changes before completing",
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
"verification.maxReminders": {
|
|
404
|
+
type: "number",
|
|
405
|
+
default: 2,
|
|
406
|
+
ui: {
|
|
407
|
+
tab: "agent",
|
|
408
|
+
label: "Verification max reminders",
|
|
409
|
+
description: "Maximum verification reminders before giving up",
|
|
410
|
+
submenu: true,
|
|
411
|
+
},
|
|
412
|
+
},
|
|
413
|
+
|
|
400
414
|
// ─────────────────────────────────────────────────────────────────────────
|
|
401
415
|
// Todo completion settings
|
|
402
416
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -469,6 +483,15 @@ export const SETTINGS_SCHEMA = {
|
|
|
469
483
|
default: true,
|
|
470
484
|
ui: { tab: "tools", label: "Enable Fetch", description: "Enable the fetch tool for URL fetching" },
|
|
471
485
|
},
|
|
486
|
+
"github.enabled": {
|
|
487
|
+
type: "boolean",
|
|
488
|
+
default: true,
|
|
489
|
+
ui: {
|
|
490
|
+
tab: "tools",
|
|
491
|
+
label: "Enable GitHub",
|
|
492
|
+
description: "Enable the GitHub API tool for repository exploration",
|
|
493
|
+
},
|
|
494
|
+
},
|
|
472
495
|
"librarian.enabled": {
|
|
473
496
|
type: "boolean",
|
|
474
497
|
default: true,
|
|
@@ -488,15 +511,6 @@ export const SETTINGS_SCHEMA = {
|
|
|
488
511
|
default: true,
|
|
489
512
|
ui: { tab: "tools", label: "Enable LSP", description: "Enable the lsp tool for language server protocol" },
|
|
490
513
|
},
|
|
491
|
-
"calc.enabled": {
|
|
492
|
-
type: "boolean",
|
|
493
|
-
default: false,
|
|
494
|
-
ui: {
|
|
495
|
-
tab: "tools",
|
|
496
|
-
label: "Enable Calculator",
|
|
497
|
-
description: "Enable the calculator tool for basic calculations",
|
|
498
|
-
},
|
|
499
|
-
},
|
|
500
514
|
"browser.enabled": {
|
|
501
515
|
type: "boolean",
|
|
502
516
|
default: true,
|
|
@@ -515,47 +529,10 @@ export const SETTINGS_SCHEMA = {
|
|
|
515
529
|
description: "Launch browser in headless mode (disable to show browser UI)",
|
|
516
530
|
},
|
|
517
531
|
},
|
|
518
|
-
"tools.intentTracing": {
|
|
519
|
-
type: "boolean",
|
|
520
|
-
default: true,
|
|
521
|
-
ui: {
|
|
522
|
-
tab: "tools",
|
|
523
|
-
label: "Intent tracing",
|
|
524
|
-
description: "Ask the agent to describe the intent of each tool call before executing it",
|
|
525
|
-
},
|
|
526
|
-
},
|
|
527
532
|
|
|
528
533
|
// ─────────────────────────────────────────────────────────────────────────
|
|
529
534
|
// Task tool settings
|
|
530
535
|
// ─────────────────────────────────────────────────────────────────────────
|
|
531
|
-
"task.isolation.enabled": {
|
|
532
|
-
type: "boolean",
|
|
533
|
-
default: false,
|
|
534
|
-
ui: {
|
|
535
|
-
tab: "tools",
|
|
536
|
-
label: "Task isolation",
|
|
537
|
-
description: "Run subagents in isolated git worktrees",
|
|
538
|
-
submenu: true,
|
|
539
|
-
},
|
|
540
|
-
},
|
|
541
|
-
"task.maxConcurrency": {
|
|
542
|
-
type: "number",
|
|
543
|
-
default: 32,
|
|
544
|
-
ui: {
|
|
545
|
-
tab: "tools",
|
|
546
|
-
label: "Task max concurrency",
|
|
547
|
-
description: "Concurrent limit for subagents",
|
|
548
|
-
submenu: true,
|
|
549
|
-
},
|
|
550
|
-
},
|
|
551
|
-
"task.disabledAgents": {
|
|
552
|
-
type: "array",
|
|
553
|
-
default: [] as string[],
|
|
554
|
-
},
|
|
555
|
-
"task.agentModelOverrides": {
|
|
556
|
-
type: "record",
|
|
557
|
-
default: {} as Record<string, string>,
|
|
558
|
-
},
|
|
559
536
|
|
|
560
537
|
// ─────────────────────────────────────────────────────────────────────────
|
|
561
538
|
// Startup settings
|
|
@@ -737,19 +714,6 @@ export const SETTINGS_SCHEMA = {
|
|
|
737
714
|
ui: { tab: "services", label: "Exa websets", description: "Webset management and enrichment tools" },
|
|
738
715
|
},
|
|
739
716
|
|
|
740
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
741
|
-
// Code Mode settings
|
|
742
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
743
|
-
"codemode.enabled": {
|
|
744
|
-
type: "boolean",
|
|
745
|
-
default: true,
|
|
746
|
-
ui: {
|
|
747
|
-
tab: "agent",
|
|
748
|
-
label: "Code Mode",
|
|
749
|
-
description: "Replace tool-calling with code generation (LLM writes JS to orchestrate tools)",
|
|
750
|
-
},
|
|
751
|
-
},
|
|
752
|
-
|
|
753
717
|
// Bash interceptor settings
|
|
754
718
|
// ─────────────────────────────────────────────────────────────────────────
|
|
755
719
|
"bash.virtualTerminal": {
|
|
@@ -963,16 +927,6 @@ export const SETTINGS_SCHEMA = {
|
|
|
963
927
|
},
|
|
964
928
|
},
|
|
965
929
|
|
|
966
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
967
|
-
// Commit settings (no UI - advanced)
|
|
968
|
-
// ─────────────────────────────────────────────────────────────────────────
|
|
969
|
-
"commit.mapReduceEnabled": { type: "boolean", default: true },
|
|
970
|
-
"commit.mapReduceMinFiles": { type: "number", default: 4 },
|
|
971
|
-
"commit.mapReduceMaxFileTokens": { type: "number", default: 50000 },
|
|
972
|
-
"commit.mapReduceTimeoutMs": { type: "number", default: 120000 },
|
|
973
|
-
"commit.mapReduceMaxConcurrency": { type: "number", default: 5 },
|
|
974
|
-
"commit.changelogMaxDiffChars": { type: "number", default: 120000 },
|
|
975
|
-
|
|
976
930
|
// ─────────────────────────────────────────────────────────────────────────
|
|
977
931
|
// Thinking budgets (no UI - advanced)
|
|
978
932
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -1148,15 +1102,6 @@ export interface SkillsSettings {
|
|
|
1148
1102
|
includeSkills?: string[];
|
|
1149
1103
|
}
|
|
1150
1104
|
|
|
1151
|
-
export interface CommitSettings {
|
|
1152
|
-
mapReduceEnabled: boolean;
|
|
1153
|
-
mapReduceMinFiles: number;
|
|
1154
|
-
mapReduceMaxFileTokens: number;
|
|
1155
|
-
mapReduceTimeoutMs: number;
|
|
1156
|
-
mapReduceMaxConcurrency: number;
|
|
1157
|
-
changelogMaxDiffChars: number;
|
|
1158
|
-
}
|
|
1159
|
-
|
|
1160
1105
|
export interface TtsrSettings {
|
|
1161
1106
|
enabled: boolean;
|
|
1162
1107
|
contextMode: "discard" | "keep";
|
|
@@ -1214,7 +1159,6 @@ export interface GroupTypeMap {
|
|
|
1214
1159
|
memories: MemoriesSettings;
|
|
1215
1160
|
branchSummary: BranchSummarySettings;
|
|
1216
1161
|
skills: SkillsSettings;
|
|
1217
|
-
commit: CommitSettings;
|
|
1218
1162
|
ttsr: TtsrSettings;
|
|
1219
1163
|
exa: ExaSettings;
|
|
1220
1164
|
statusLine: StatusLineSettings;
|
package/src/config/settings.ts
CHANGED
|
@@ -19,9 +19,9 @@ import { YAML } from "bun";
|
|
|
19
19
|
import { type Settings as SettingsCapabilityItem, settingsCapability } from "../capability/settings";
|
|
20
20
|
import type { ModelRole } from "../config/model-registry";
|
|
21
21
|
import { loadCapability } from "../discovery";
|
|
22
|
-
import { isLightTheme, setAutoThemeMapping, setColorBlindMode, setSymbolPreset } from "../modes/theme/theme";
|
|
23
22
|
import { type EditMode, normalizeEditMode } from "../patch";
|
|
24
23
|
import { AgentStorage } from "../session/agent-storage";
|
|
24
|
+
import { isLightTheme, setAutoThemeMapping, setColorBlindMode, setSymbolPreset } from "../theme/theme";
|
|
25
25
|
import { withFileLock } from "./file-lock";
|
|
26
26
|
import {
|
|
27
27
|
type BashInterceptorRule,
|
|
@@ -37,7 +37,6 @@ import {
|
|
|
37
37
|
export type {
|
|
38
38
|
BashInterceptorRule,
|
|
39
39
|
BranchSummarySettings,
|
|
40
|
-
CommitSettings,
|
|
41
40
|
CompactionSettings,
|
|
42
41
|
ContextPromotionSettings,
|
|
43
42
|
ExaSettings,
|
|
@@ -654,14 +653,14 @@ const SETTING_HOOKS: Partial<Record<SettingPath, SettingHook<any>>> = {
|
|
|
654
653
|
},
|
|
655
654
|
symbolPreset: value => {
|
|
656
655
|
if (typeof value === "string" && (value === "unicode" || value === "nerd" || value === "ascii")) {
|
|
657
|
-
setSymbolPreset(value).catch(err => {
|
|
656
|
+
setSymbolPreset(value).catch((err: unknown) => {
|
|
658
657
|
logger.warn("Settings: symbolPreset hook failed", { preset: value, error: String(err) });
|
|
659
658
|
});
|
|
660
659
|
}
|
|
661
660
|
},
|
|
662
661
|
colorBlindMode: value => {
|
|
663
662
|
if (typeof value === "boolean") {
|
|
664
|
-
setColorBlindMode(value).catch(err => {
|
|
663
|
+
setColorBlindMode(value).catch((err: unknown) => {
|
|
665
664
|
logger.warn("Settings: colorBlindMode hook failed", { enabled: value, error: String(err) });
|
|
666
665
|
});
|
|
667
666
|
}
|
package/src/debug/index.ts
CHANGED
|
@@ -9,8 +9,8 @@ import { getWorkProfile } from "@nghyane/arcane-natives";
|
|
|
9
9
|
import { Container, Loader, type SelectItem, SelectList, Spacer, Text } from "@nghyane/arcane-tui";
|
|
10
10
|
import { getSessionsDir } from "@nghyane/arcane-utils/dirs";
|
|
11
11
|
import { DynamicBorder } from "../modes/components/dynamic-border";
|
|
12
|
-
import { getSelectListTheme, getSymbolTheme, theme } from "../modes/theme/theme";
|
|
13
12
|
import type { InteractiveModeContext } from "../modes/types";
|
|
13
|
+
import { getSelectListTheme, getSymbolTheme, theme } from "../theme/theme";
|
|
14
14
|
import { openPath } from "../utils/open";
|
|
15
15
|
import { DebugLogViewerComponent } from "./log-viewer";
|
|
16
16
|
import { generateHeapSnapshotData, type ProfilerSession, startCpuProfile } from "./profiler";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sanitizeText } from "@nghyane/arcane-natives";
|
|
2
|
-
import { replaceTabs, truncateToWidth } from "../
|
|
2
|
+
import { replaceTabs, truncateToWidth } from "../ui/render-utils";
|
|
3
3
|
|
|
4
4
|
export function formatDebugLogLine(line: string, maxWidth: number): string {
|
|
5
5
|
const sanitized = sanitizeText(line);
|
package/src/debug/log-viewer.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { copyToClipboard, sanitizeText } from "@nghyane/arcane-natives";
|
|
2
2
|
import { type Component, matchesKey, padding, truncateToWidth, visibleWidth } from "@nghyane/arcane-tui";
|
|
3
|
-
import { theme } from "../
|
|
4
|
-
import { replaceTabs } from "../
|
|
3
|
+
import { theme } from "../theme/theme";
|
|
4
|
+
import { replaceTabs } from "../ui/render-utils";
|
|
5
5
|
import {
|
|
6
6
|
formatDebugLogExpandedLines,
|
|
7
7
|
formatDebugLogLine,
|
package/src/discovery/helpers.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { readFile } from "../capability/fs";
|
|
|
10
10
|
import { parseRuleConditionAndScope, type Rule, type RuleFrontmatter } from "../capability/rule";
|
|
11
11
|
import type { Skill, SkillFrontmatter } from "../capability/skill";
|
|
12
12
|
import type { LoadContext, LoadResult, SourceMeta } from "../capability/types";
|
|
13
|
+
import type { AgentKind } from "../task/types";
|
|
13
14
|
import { parseFrontmatter } from "../utils/frontmatter";
|
|
14
15
|
import type { IgnoreMatcher } from "../utils/ignore-files";
|
|
15
16
|
|
|
@@ -215,9 +216,17 @@ export function parseModelList(value: unknown): string[] | undefined {
|
|
|
215
216
|
export interface ParsedAgentFields {
|
|
216
217
|
name: string;
|
|
217
218
|
description: string;
|
|
218
|
-
tools
|
|
219
|
+
tools: string[];
|
|
219
220
|
model?: string[];
|
|
220
221
|
thinkingLevel?: ThinkingLevel;
|
|
222
|
+
kind?: AgentKind;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
const VALID_AGENT_KINDS: readonly string[] = ["local", "remote", "hybrid", "reasoning"];
|
|
226
|
+
|
|
227
|
+
function parseAgentKind(value: unknown): AgentKind | undefined {
|
|
228
|
+
if (typeof value === "string" && VALID_AGENT_KINDS.includes(value)) return value as AgentKind;
|
|
229
|
+
return undefined;
|
|
221
230
|
}
|
|
222
231
|
|
|
223
232
|
/**
|
|
@@ -232,12 +241,13 @@ export function parseAgentFields(frontmatter: Record<string, unknown>): ParsedAg
|
|
|
232
241
|
return null;
|
|
233
242
|
}
|
|
234
243
|
|
|
235
|
-
const tools = parseArrayOrCSV(frontmatter.tools);
|
|
244
|
+
const tools = parseArrayOrCSV(frontmatter.tools) ?? [];
|
|
236
245
|
|
|
237
246
|
const model = parseModelList(frontmatter.model);
|
|
238
247
|
const thinkingLevel = parseThinkingLevel(frontmatter);
|
|
248
|
+
const kind = parseAgentKind(frontmatter.kind);
|
|
239
249
|
|
|
240
|
-
return { name, description, tools, model, thinkingLevel };
|
|
250
|
+
return { name, description, tools, model, thinkingLevel, kind };
|
|
241
251
|
}
|
|
242
252
|
|
|
243
253
|
async function globIf(
|
package/src/exa/index.ts
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Exa MCP Tools
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - 4 search tools (search, deep, code, crawl)
|
|
6
|
-
* - 1 LinkedIn search tool
|
|
7
|
-
* - 1 company research tool
|
|
8
|
-
* - 2 researcher tools (start, poll)
|
|
9
|
-
* - 14 websets tools (CRUD, items, search, enrichment, monitor)
|
|
4
|
+
* Provides Exa tools filtered by user settings.
|
|
10
5
|
*/
|
|
11
6
|
import type { ExaSettings } from "../config/settings";
|
|
12
7
|
import type { CustomTool } from "../extensibility/custom-tools/types";
|
|
@@ -17,15 +12,6 @@ import { searchTools } from "./search";
|
|
|
17
12
|
import type { ExaRenderDetails } from "./types";
|
|
18
13
|
import { websetsTools } from "./websets";
|
|
19
14
|
|
|
20
|
-
/** All Exa tools (22 total) - static export for backward compatibility */
|
|
21
|
-
export const exaTools: CustomTool<any, ExaRenderDetails>[] = [
|
|
22
|
-
...searchTools,
|
|
23
|
-
linkedinTool,
|
|
24
|
-
companyTool,
|
|
25
|
-
...researcherTools,
|
|
26
|
-
...websetsTools,
|
|
27
|
-
];
|
|
28
|
-
|
|
29
15
|
/** Get Exa tools filtered by settings */
|
|
30
16
|
export function getExaTools(settings: Required<ExaSettings>): CustomTool<any, ExaRenderDetails>[] {
|
|
31
17
|
if (!settings.enabled) return [];
|
|
@@ -40,23 +26,3 @@ export function getExaTools(settings: Required<ExaSettings>): CustomTool<any, Ex
|
|
|
40
26
|
|
|
41
27
|
return tools;
|
|
42
28
|
}
|
|
43
|
-
|
|
44
|
-
export { companyTool } from "./company";
|
|
45
|
-
export { linkedinTool } from "./linkedin";
|
|
46
|
-
export {
|
|
47
|
-
callExaTool,
|
|
48
|
-
callWebsetsTool,
|
|
49
|
-
createMCPToolFromServer,
|
|
50
|
-
fetchMCPToolSchema,
|
|
51
|
-
findApiKey,
|
|
52
|
-
formatSearchResults,
|
|
53
|
-
isSearchResponse,
|
|
54
|
-
MCPWrappedTool,
|
|
55
|
-
} from "./mcp-client";
|
|
56
|
-
export { renderExaCall, renderExaResult } from "./render";
|
|
57
|
-
export { researcherTools } from "./researcher";
|
|
58
|
-
// Re-export individual modules for selective importing
|
|
59
|
-
export { searchTools } from "./search";
|
|
60
|
-
// Re-export types and utilities
|
|
61
|
-
export type { ExaRenderDetails, ExaSearchResponse, ExaSearchResult, MCPToolWrapperConfig } from "./types";
|
|
62
|
-
export { websetsTools } from "./websets";
|
package/src/exa/render.ts
CHANGED
|
@@ -5,41 +5,13 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { Component } from "@nghyane/arcane-tui";
|
|
7
7
|
import { Text } from "@nghyane/arcane-tui";
|
|
8
|
-
import { logger } from "@nghyane/arcane-utils";
|
|
9
8
|
import type { RenderResultOptions } from "../extensibility/custom-tools/types";
|
|
10
|
-
import type { Theme } from "../
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
formatExpandHint,
|
|
14
|
-
formatMoreItems,
|
|
15
|
-
formatStatusIcon,
|
|
16
|
-
getDomain,
|
|
17
|
-
getPreviewLines,
|
|
18
|
-
PREVIEW_LIMITS,
|
|
19
|
-
TRUNCATE_LENGTHS,
|
|
20
|
-
truncateToWidth,
|
|
21
|
-
} from "../tools/render-utils";
|
|
9
|
+
import type { Theme } from "../theme/theme";
|
|
10
|
+
import { renderStatusLine } from "../tui";
|
|
11
|
+
import { formatCount, formatMoreItems, getDomain, truncateToWidth } from "../ui/render-utils";
|
|
22
12
|
import type { ExaRenderDetails } from "./types";
|
|
23
13
|
|
|
24
|
-
const
|
|
25
|
-
const COLLAPSED_PREVIEW_LINE_LEN = TRUNCATE_LENGTHS.LONG;
|
|
26
|
-
const EXPANDED_TEXT_LINES = 5;
|
|
27
|
-
const EXPANDED_TEXT_LINE_LEN = 90;
|
|
28
|
-
const MAX_TITLE_LEN = TRUNCATE_LENGTHS.TITLE;
|
|
29
|
-
const MAX_HIGHLIGHT_LEN = TRUNCATE_LENGTHS.CONTENT;
|
|
30
|
-
|
|
31
|
-
function renderErrorMessage(message: string, theme: Theme): Text {
|
|
32
|
-
const clean = message.replace(/^Error:\s*/, "").trim();
|
|
33
|
-
return new Text(
|
|
34
|
-
`${formatStatusIcon("error", theme)} ${theme.fg("error", `Error: ${clean || "Unknown error"}`)}`,
|
|
35
|
-
0,
|
|
36
|
-
0,
|
|
37
|
-
);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
function renderEmptyMessage(message: string, theme: Theme): Text {
|
|
41
|
-
return new Text(`${formatStatusIcon("warning", theme)} ${theme.fg("muted", message)}`, 0, 0);
|
|
42
|
-
}
|
|
14
|
+
const MAX_COLLAPSED_RESULTS = 5;
|
|
43
15
|
|
|
44
16
|
/** Render Exa result with tree-based layout */
|
|
45
17
|
export function renderExaResult(
|
|
@@ -47,183 +19,51 @@ export function renderExaResult(
|
|
|
47
19
|
options: RenderResultOptions,
|
|
48
20
|
uiTheme: Theme,
|
|
49
21
|
): Component {
|
|
50
|
-
const { expanded } = options;
|
|
51
22
|
const details = result.details;
|
|
52
|
-
|
|
53
|
-
if (details?.error) {
|
|
54
|
-
logger.error("Exa render error", { error: details.error, toolName: details.toolName });
|
|
55
|
-
return renderErrorMessage(details.error, uiTheme);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
23
|
const response = details?.response;
|
|
59
|
-
|
|
60
|
-
if (details?.raw) {
|
|
61
|
-
const rawText = typeof details.raw === "string" ? details.raw : JSON.stringify(details.raw, null, 2);
|
|
62
|
-
const rawLines = rawText.split("\n").filter(l => l.trim());
|
|
63
|
-
const maxLines = expanded ? rawLines.length : Math.min(rawLines.length, COLLAPSED_PREVIEW_LINES);
|
|
64
|
-
const displayLines = rawLines.slice(0, maxLines);
|
|
65
|
-
const remaining = rawLines.length - maxLines;
|
|
66
|
-
const expandHint = formatExpandHint(uiTheme, expanded, remaining > 0);
|
|
67
|
-
|
|
68
|
-
let text = `${formatStatusIcon("info", uiTheme)} ${uiTheme.fg("dim", "Raw response")}${expandHint}`;
|
|
69
|
-
|
|
70
|
-
for (let i = 0; i < displayLines.length; i++) {
|
|
71
|
-
const isLast = i === displayLines.length - 1 && remaining === 0;
|
|
72
|
-
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
73
|
-
text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(
|
|
74
|
-
"toolOutput",
|
|
75
|
-
truncateToWidth(displayLines[i], COLLAPSED_PREVIEW_LINE_LEN),
|
|
76
|
-
)}`;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
if (remaining > 0) {
|
|
80
|
-
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg(
|
|
81
|
-
"muted",
|
|
82
|
-
formatMoreItems(remaining, "line"),
|
|
83
|
-
)}`;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return new Text(text, 0, 0);
|
|
87
|
-
}
|
|
88
|
-
return renderEmptyMessage("No response data", uiTheme);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const results = response.results ?? [];
|
|
24
|
+
const results = response?.results ?? [];
|
|
92
25
|
const resultCount = results.length;
|
|
93
|
-
const cost = response.costDollars?.total;
|
|
94
|
-
const time = response.searchTime;
|
|
95
|
-
|
|
96
|
-
const icon = formatStatusIcon(resultCount > 0 ? "success" : "warning", uiTheme);
|
|
97
26
|
|
|
98
|
-
const
|
|
99
|
-
if (cost !== undefined) metaParts.push(`cost:$${cost.toFixed(4)}`);
|
|
100
|
-
if (time !== undefined) metaParts.push(`time:${time.toFixed(2)}s`);
|
|
101
|
-
const summaryText = metaParts.join(uiTheme.sep.dot);
|
|
27
|
+
const icon = details?.error ? "error" : resultCount > 0 ? "success" : "warning";
|
|
102
28
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
let text = `${icon} ${uiTheme.fg("dim", summaryText)}${expandHint}`;
|
|
112
|
-
|
|
113
|
-
if (!expanded) {
|
|
114
|
-
if (resultCount === 0) {
|
|
115
|
-
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
|
|
116
|
-
return new Text(text, 0, 0);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const first = results[0];
|
|
120
|
-
const previewText = first.text ?? first.title ?? "";
|
|
121
|
-
const previewLines = previewText
|
|
122
|
-
? getPreviewLines(previewText, COLLAPSED_PREVIEW_LINES, COLLAPSED_PREVIEW_LINE_LEN)
|
|
123
|
-
: [];
|
|
124
|
-
const safePreviewLines = previewLines.length > 0 ? previewLines : ["No preview text"];
|
|
125
|
-
const totalLines = previewText.split("\n").filter(l => l.trim()).length;
|
|
126
|
-
const remainingLines = Math.max(0, totalLines - previewLines.length);
|
|
127
|
-
const extraItems: string[] = [];
|
|
128
|
-
if (remainingLines > 0) {
|
|
129
|
-
extraItems.push(formatMoreItems(remainingLines, "line"));
|
|
130
|
-
}
|
|
131
|
-
if (resultCount > 1) {
|
|
132
|
-
extraItems.push(formatMoreItems(resultCount - 1, "result"));
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
for (let i = 0; i < safePreviewLines.length; i++) {
|
|
136
|
-
const isLast = i === safePreviewLines.length - 1 && extraItems.length === 0;
|
|
137
|
-
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
138
|
-
const line = safePreviewLines[i];
|
|
139
|
-
const color = line === "No preview text" ? "muted" : "toolOutput";
|
|
140
|
-
text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg(color, line)}`;
|
|
141
|
-
}
|
|
29
|
+
const header = renderStatusLine(
|
|
30
|
+
{
|
|
31
|
+
icon,
|
|
32
|
+
title: "Exa Search",
|
|
33
|
+
meta: [formatCount("result", resultCount)],
|
|
34
|
+
},
|
|
35
|
+
uiTheme,
|
|
36
|
+
);
|
|
142
37
|
|
|
143
|
-
|
|
144
|
-
const isLast = i === extraItems.length - 1;
|
|
145
|
-
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
146
|
-
text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("muted", extraItems[i])}`;
|
|
147
|
-
}
|
|
38
|
+
let text = header;
|
|
148
39
|
|
|
40
|
+
if (details?.error) {
|
|
41
|
+
const clean = details.error.replace(/^Error:\s*/, "").trim();
|
|
42
|
+
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("error", clean || "Unknown error")}`;
|
|
149
43
|
return new Text(text, 0, 0);
|
|
150
44
|
}
|
|
151
45
|
|
|
152
|
-
if (resultCount === 0) {
|
|
46
|
+
if (!response || resultCount === 0) {
|
|
153
47
|
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", "No results")}`;
|
|
154
48
|
return new Text(text, 0, 0);
|
|
155
49
|
}
|
|
156
50
|
|
|
157
|
-
|
|
51
|
+
const { expanded } = options;
|
|
52
|
+
const maxItems = expanded ? results.length : Math.min(results.length, MAX_COLLAPSED_RESULTS);
|
|
53
|
+
const remaining = results.length - maxItems;
|
|
54
|
+
|
|
55
|
+
for (let i = 0; i < maxItems; i++) {
|
|
158
56
|
const res = results[i];
|
|
159
|
-
const isLast = i ===
|
|
57
|
+
const isLast = i === maxItems - 1 && remaining === 0;
|
|
160
58
|
const branch = isLast ? uiTheme.tree.last : uiTheme.tree.branch;
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
const title = truncateToWidth(res.title ?? "Untitled", MAX_TITLE_LEN);
|
|
59
|
+
const title = truncateToWidth(res.title ?? "Untitled", 70);
|
|
164
60
|
const domain = res.url ? getDomain(res.url) : "";
|
|
165
|
-
const domainPart = domain ? uiTheme.fg("dim", `
|
|
166
|
-
|
|
61
|
+
const domainPart = domain ? ` ${uiTheme.fg("dim", `(${domain})`)}` : "";
|
|
167
62
|
text += `\n ${uiTheme.fg("dim", branch)} ${uiTheme.fg("accent", title)}${domainPart}`;
|
|
63
|
+
}
|
|
168
64
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"mdLinkUrl",
|
|
172
|
-
res.url,
|
|
173
|
-
)}`;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
if (res.author) {
|
|
177
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
178
|
-
"muted",
|
|
179
|
-
`Author: ${res.author}`,
|
|
180
|
-
)}`;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (res.publishedDate) {
|
|
184
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
185
|
-
"muted",
|
|
186
|
-
`Published: ${res.publishedDate}`,
|
|
187
|
-
)}`;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
if (res.text) {
|
|
191
|
-
const textLines = res.text.split("\n").filter(l => l.trim());
|
|
192
|
-
const displayLines = textLines.slice(0, EXPANDED_TEXT_LINES);
|
|
193
|
-
for (const line of displayLines) {
|
|
194
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
195
|
-
"toolOutput",
|
|
196
|
-
truncateToWidth(line.trim(), EXPANDED_TEXT_LINE_LEN),
|
|
197
|
-
)}`;
|
|
198
|
-
}
|
|
199
|
-
if (textLines.length > EXPANDED_TEXT_LINES) {
|
|
200
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
201
|
-
"muted",
|
|
202
|
-
formatMoreItems(textLines.length - EXPANDED_TEXT_LINES, "line"),
|
|
203
|
-
)}`;
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
if (res.highlights?.length) {
|
|
208
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
209
|
-
"accent",
|
|
210
|
-
"Highlights",
|
|
211
|
-
)}`;
|
|
212
|
-
const maxHighlights = Math.min(res.highlights.length, 3);
|
|
213
|
-
for (let j = 0; j < maxHighlights; j++) {
|
|
214
|
-
const h = res.highlights[j];
|
|
215
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
216
|
-
"muted",
|
|
217
|
-
`${uiTheme.format.dash} ${truncateToWidth(h, MAX_HIGHLIGHT_LEN)}`,
|
|
218
|
-
)}`;
|
|
219
|
-
}
|
|
220
|
-
if (res.highlights.length > maxHighlights) {
|
|
221
|
-
text += `\n ${uiTheme.fg("dim", cont)} ${uiTheme.fg("dim", uiTheme.tree.hook)} ${uiTheme.fg(
|
|
222
|
-
"muted",
|
|
223
|
-
formatMoreItems(res.highlights.length - maxHighlights, "highlight"),
|
|
224
|
-
)}`;
|
|
225
|
-
}
|
|
226
|
-
}
|
|
65
|
+
if (remaining > 0) {
|
|
66
|
+
text += `\n ${uiTheme.fg("dim", uiTheme.tree.last)} ${uiTheme.fg("muted", formatMoreItems(remaining, "result"))}`;
|
|
227
67
|
}
|
|
228
68
|
|
|
229
69
|
return new Text(text, 0, 0);
|
package/src/export/html/index.ts
CHANGED
|
@@ -2,8 +2,8 @@ import * as path from "node:path";
|
|
|
2
2
|
import type { AgentState } from "@nghyane/arcane-agent";
|
|
3
3
|
import { isEnoent } from "@nghyane/arcane-utils";
|
|
4
4
|
import { APP_NAME } from "@nghyane/arcane-utils/dirs";
|
|
5
|
-
import { getResolvedThemeColors, getThemeExportColors } from "../../modes/theme/theme";
|
|
6
5
|
import { type SessionEntry, type SessionHeader, SessionManager } from "../../session/session-manager";
|
|
6
|
+
import { getResolvedThemeColors, getThemeExportColors } from "../../theme/theme";
|
|
7
7
|
// Pre-generated template (created by scripts/generate-template.ts at publish time)
|
|
8
8
|
import { TEMPLATE } from "./template.generated";
|
|
9
9
|
|
|
@@ -15,7 +15,7 @@ import type { ExecOptions } from "../../exec/exec";
|
|
|
15
15
|
import { execCommand } from "../../exec/exec";
|
|
16
16
|
import type { HookUIContext } from "../../extensibility/hooks/types";
|
|
17
17
|
import { getAllPluginToolPaths } from "../../extensibility/plugins/loader";
|
|
18
|
-
import { theme } from "../../
|
|
18
|
+
import { theme } from "../../theme/theme";
|
|
19
19
|
import type { CustomToolAPI, CustomToolFactory, LoadedCustomTool, ToolLoadError } from "./types";
|
|
20
20
|
|
|
21
21
|
/**
|
|
@@ -12,9 +12,9 @@ import type { Rule } from "../../capability/rule";
|
|
|
12
12
|
import type { ModelRegistry } from "../../config/model-registry";
|
|
13
13
|
import type { ExecOptions, ExecResult } from "../../exec/exec";
|
|
14
14
|
import type { HookUIContext } from "../../extensibility/hooks/types";
|
|
15
|
-
import type { Theme } from "../../modes/theme/theme";
|
|
16
15
|
import type { CompactionResult } from "../../session/compaction";
|
|
17
16
|
import type { ReadonlySessionManager } from "../../session/session-manager";
|
|
17
|
+
import type { Theme } from "../../theme/theme";
|
|
18
18
|
import type { TodoItem } from "../../tools/todo-write";
|
|
19
19
|
|
|
20
20
|
/** Alias for clarity */
|
|
@@ -114,6 +114,10 @@ export interface RenderResultOptions {
|
|
|
114
114
|
isPartial: boolean;
|
|
115
115
|
/** Current spinner frame index for animated elements (0-9, only provided during partial results) */
|
|
116
116
|
spinnerFrame?: number;
|
|
117
|
+
/** Tool display label (used by default renderer) */
|
|
118
|
+
label?: string;
|
|
119
|
+
/** Extra rendering context from ToolExecutionComponent (bash output, edit diff, etc.) */
|
|
120
|
+
renderContext?: Record<string, unknown>;
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
export type CustomToolResult<TDetails = any> = AgentToolResult<TDetails>;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import type { AgentTool, AgentToolUpdateCallback } from "@nghyane/arcane-agent";
|
|
5
5
|
import type { Static, TSchema } from "@sinclair/typebox";
|
|
6
|
-
import type { Theme } from "../../
|
|
6
|
+
import type { Theme } from "../../theme/theme";
|
|
7
7
|
import { applyToolProxy } from "../tool-proxy";
|
|
8
8
|
import type { CustomTool, CustomToolContext } from "./types";
|
|
9
9
|
|
|
@@ -6,8 +6,8 @@ import type { ImageContent, Model } from "@nghyane/arcane-ai";
|
|
|
6
6
|
import type { KeyId } from "@nghyane/arcane-tui";
|
|
7
7
|
import { logger } from "@nghyane/arcane-utils";
|
|
8
8
|
import type { ModelRegistry } from "../../config/model-registry";
|
|
9
|
-
import { type Theme, theme } from "../../modes/theme/theme";
|
|
10
9
|
import type { SessionManager } from "../../session/session-manager";
|
|
10
|
+
import { type Theme, theme } from "../../theme/theme";
|
|
11
11
|
import type {
|
|
12
12
|
BeforeAgentStartEvent,
|
|
13
13
|
BeforeAgentStartEventResult,
|