ollama_chat 0.0.85 → 0.0.87
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.
- checksums.yaml +4 -4
- data/.utilsrc +1 -0
- data/CHANGES.md +132 -1
- data/README.md +86 -144
- data/Rakefile +5 -6
- data/config/sherlock.md +38 -0
- data/lib/ollama_chat/chat.rb +633 -407
- data/lib/ollama_chat/clipboard.rb +26 -6
- data/lib/ollama_chat/command_concern.rb +30 -5
- data/lib/ollama_chat/config_handling.rb +55 -12
- data/lib/ollama_chat/conversation.rb +3 -3
- data/lib/ollama_chat/database/duplicatable.rb +19 -0
- data/lib/ollama_chat/database/migrations/001_initial_schema.rb +70 -0
- data/lib/ollama_chat/database/migrations/002_add_links_to_sessions.rb +7 -0
- data/lib/ollama_chat/database/migrations/003_add_history_to_sessions.rb +7 -0
- data/lib/ollama_chat/database/migrations.rb +17 -0
- data/lib/ollama_chat/database/models/favourite.rb +41 -0
- data/lib/ollama_chat/database/models/model_options.rb +32 -0
- data/lib/ollama_chat/database/models/prompt.rb +91 -0
- data/lib/ollama_chat/database/models/session.rb +152 -0
- data/lib/ollama_chat/database/session_locking.rb +51 -0
- data/lib/ollama_chat/database.rb +52 -0
- data/lib/ollama_chat/dialog.rb +33 -126
- data/lib/ollama_chat/favourites_management.rb +101 -0
- data/lib/ollama_chat/file_editing.rb +59 -10
- data/lib/ollama_chat/follow_chat.rb +58 -51
- data/lib/ollama_chat/history.rb +84 -32
- data/lib/ollama_chat/http_handling.rb +15 -3
- data/lib/ollama_chat/information.rb +188 -79
- data/lib/ollama_chat/input_content.rb +8 -25
- data/lib/ollama_chat/kramdown_ansi.rb +6 -0
- data/lib/ollama_chat/links_set.rb +74 -0
- data/lib/ollama_chat/location_handling.rb +1 -1
- data/lib/ollama_chat/message.rb +60 -0
- data/lib/ollama_chat/message_editing.rb +2 -5
- data/lib/ollama_chat/message_format.rb +72 -2
- data/lib/ollama_chat/message_list.rb +288 -94
- data/lib/ollama_chat/message_output.rb +5 -2
- data/lib/ollama_chat/model_handling.rb +208 -19
- data/lib/ollama_chat/oc.rb +59 -3
- data/lib/ollama_chat/ollama_chat_config/default_config.yml +126 -23
- data/lib/ollama_chat/ollama_chat_config.rb +8 -10
- data/lib/ollama_chat/parsing.rb +52 -44
- data/lib/ollama_chat/personae_management.rb +422 -155
- data/lib/ollama_chat/prompt_handling.rb +133 -0
- data/lib/ollama_chat/prompt_management.rb +287 -0
- data/lib/ollama_chat/rag_handling.rb +158 -0
- data/lib/ollama_chat/server_socket.rb +5 -1
- data/lib/ollama_chat/session_management.rb +520 -0
- data/lib/ollama_chat/source_fetching.rb +39 -34
- data/lib/ollama_chat/state_selectors.rb +189 -69
- data/lib/ollama_chat/switches.rb +148 -89
- data/lib/ollama_chat/system_prompt_management.rb +355 -0
- data/lib/ollama_chat/think_control.rb +15 -0
- data/lib/ollama_chat/tool_calling.rb +56 -44
- data/lib/ollama_chat/tools/compute_bmi.rb +114 -0
- data/lib/ollama_chat/tools/concern.rb +1 -0
- data/lib/ollama_chat/tools/copy_to_clipboard.rb +15 -7
- data/lib/ollama_chat/tools/delete_file.rb +77 -0
- data/lib/ollama_chat/tools/eval_ruby.rb +100 -0
- data/lib/ollama_chat/tools/execute_ri.rb +1 -1
- data/lib/ollama_chat/tools/file_context.rb +5 -4
- data/lib/ollama_chat/tools/generate_image.rb +175 -0
- data/lib/ollama_chat/tools/generate_password.rb +2 -1
- data/lib/ollama_chat/tools/get_current_weather.rb +1 -1
- data/lib/ollama_chat/tools/get_cve.rb +1 -1
- data/lib/ollama_chat/tools/get_endoflife.rb +0 -1
- data/lib/ollama_chat/tools/get_ghr.rb +123 -0
- data/lib/ollama_chat/tools/get_jira_issue.rb +1 -2
- data/lib/ollama_chat/tools/get_rfc.rb +0 -1
- data/lib/ollama_chat/tools/get_time.rb +3 -2
- data/lib/ollama_chat/tools/get_url.rb +55 -10
- data/lib/ollama_chat/tools/move_file.rb +87 -0
- data/lib/ollama_chat/tools/paste_from_clipboard.rb +10 -3
- data/lib/ollama_chat/tools/paste_into_editor.rb +3 -1
- data/lib/ollama_chat/tools/patch_file.rb +69 -46
- data/lib/ollama_chat/tools/read_file.rb +53 -6
- data/lib/ollama_chat/tools/resolve_tag.rb +1 -1
- data/lib/ollama_chat/tools/retrieve_document_snippets.rb +59 -12
- data/lib/ollama_chat/tools/roll_dice.rb +80 -0
- data/lib/ollama_chat/tools/run_tests.rb +28 -14
- data/lib/ollama_chat/tools/write_file.rb +19 -9
- data/lib/ollama_chat/tools.rb +7 -0
- data/lib/ollama_chat/utils/backup.rb +21 -0
- data/lib/ollama_chat/utils/cache_fetcher.rb +10 -4
- data/lib/ollama_chat/utils/chooser.rb +74 -50
- data/lib/ollama_chat/utils/fetcher.rb +61 -58
- data/lib/ollama_chat/utils/json_jsonl_io.rb +73 -0
- data/lib/ollama_chat/utils/path_validator.rb +37 -15
- data/lib/ollama_chat/utils/png_character_extractor.rb +65 -0
- data/lib/ollama_chat/utils/token_estimator.rb +15 -0
- data/lib/ollama_chat/utils/value_formatter.rb +9 -1
- data/lib/ollama_chat/utils.rb +4 -1
- data/lib/ollama_chat/version.rb +1 -1
- data/lib/ollama_chat/web_searching.rb +107 -2
- data/lib/ollama_chat.rb +27 -4
- data/ollama_chat.gemspec +12 -11
- data/spec/assets/conversation.jsonl +3 -0
- data/spec/assets/fluffy.png +0 -0
- data/spec/ollama_chat/chat_spec.rb +72 -63
- data/spec/ollama_chat/database/models/favourite_spec.rb +109 -0
- data/spec/ollama_chat/file_editing_spec.rb +47 -0
- data/spec/ollama_chat/follow_chat_spec.rb +4 -3
- data/spec/ollama_chat/history_spec.rb +54 -0
- data/spec/ollama_chat/information_spec.rb +10 -0
- data/spec/ollama_chat/input_content_spec.rb +11 -48
- data/spec/ollama_chat/message_editing_spec.rb +5 -6
- data/spec/ollama_chat/message_list_spec.rb +68 -41
- data/spec/ollama_chat/model_handling_spec.rb +1 -1
- data/spec/ollama_chat/parsing_spec.rb +8 -11
- data/spec/ollama_chat/source_fetching_spec.rb +36 -1
- data/spec/ollama_chat/state_selectors_spec.rb +5 -5
- data/spec/ollama_chat/switches_spec.rb +68 -1
- data/spec/ollama_chat/think_control_spec.rb +3 -2
- data/spec/ollama_chat/tools/compute_bmi_spec.rb +107 -0
- data/spec/ollama_chat/tools/copy_to_clipboard_spec.rb +37 -8
- data/spec/ollama_chat/tools/delete_file_spec.rb +126 -0
- data/spec/ollama_chat/tools/directory_structure_spec.rb +1 -1
- data/spec/ollama_chat/tools/execute_ri_spec.rb +1 -1
- data/spec/ollama_chat/tools/generate_image_spec.rb +133 -0
- data/spec/ollama_chat/tools/generate_password_spec.rb +1 -1
- data/spec/ollama_chat/tools/get_cve_spec.rb +2 -2
- data/spec/ollama_chat/tools/get_endoflife_spec.rb +2 -2
- data/spec/ollama_chat/tools/get_ghr_spec.rb +235 -0
- data/spec/ollama_chat/tools/get_jira_issue_spec.rb +2 -2
- data/spec/ollama_chat/tools/get_time_spec.rb +1 -0
- data/spec/ollama_chat/tools/get_url_spec.rb +100 -10
- data/spec/ollama_chat/tools/move_file_spec.rb +168 -0
- data/spec/ollama_chat/tools/paste_from_clipboard_spec.rb +38 -7
- data/spec/ollama_chat/tools/patch_file_spec.rb +52 -74
- data/spec/ollama_chat/tools/read_file_spec.rb +58 -1
- data/spec/ollama_chat/tools/retrieve_document_snippets_spec.rb +85 -4
- data/spec/ollama_chat/tools/roll_dice_spec.rb +129 -0
- data/spec/ollama_chat/tools/run_tests_spec.rb +80 -3
- data/spec/ollama_chat/utils/cache_fetcher_spec.rb +13 -1
- data/spec/ollama_chat/utils/fetcher_spec.rb +26 -31
- data/spec/ollama_chat/utils/png_character_extractor_spec.rb +61 -0
- data/spec/spec_helper.rb +19 -2
- metadata +113 -20
- data/lib/ollama_chat/utils/file_argument.rb +0 -53
- data/spec/ollama_chat/utils/file_argument_spec.rb +0 -15
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cbbefd02bdabd82fcf1b50768b9601eb5488ad957879e9d0ff343fdda695186b
|
|
4
|
+
data.tar.gz: 0732eadef93db023aa9684ff7cfcc7f6b89ac60598cc946b38aeb907d22ed8da
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 98616d08b76315211472dd33e25729753b5b2a0ff6f286a01f2eea886120f9399912edca2177a54774c2e51183e91ba66fbf1ff2cba08051e8e10b45a1154399
|
|
7
|
+
data.tar.gz: 30d586bd6500b2fb069534f0cffe78db58381cad3ec40bb8990f09e225aafcb466be9c89c1893f480157ffcecde31c195909e6db874f976bb41af85f1724cef3
|
data/.utilsrc
CHANGED
data/CHANGES.md
CHANGED
|
@@ -1,5 +1,136 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
+
## 2026-05-28 v0.0.87
|
|
4
|
+
|
|
5
|
+
### Features
|
|
6
|
+
|
|
7
|
+
- **Session Management**
|
|
8
|
+
- Implemented a Sequel-based database for persistent storage of `sessions`,
|
|
9
|
+
`model_options`, `favourites`, and `prompts`.
|
|
10
|
+
- Added Vim-style exclusive session locking using `locked_by_pid` to
|
|
11
|
+
prevent concurrent access.
|
|
12
|
+
- Introduced session duplication via `OllamaChat::Database::Duplicatable`
|
|
13
|
+
and the `/session duplicate` command.
|
|
14
|
+
- Added support for directory-aware session retrieval using
|
|
15
|
+
`working_directory`.
|
|
16
|
+
- Implemented a `/session previous` action to quickly switch back to the
|
|
17
|
+
last active session.
|
|
18
|
+
- Added a `-n` flag to create a new session upon startup.
|
|
19
|
+
|
|
20
|
+
- **Persona & Prompt Management**
|
|
21
|
+
- Transitioned system prompts and user prompts to a database-backed
|
|
22
|
+
registry.
|
|
23
|
+
- Added support for importing character profiles from `.png` (via `tEXt`
|
|
24
|
+
chunks) and `.json` files using
|
|
25
|
+
`OllamaChat::Utils::PNGCharacterExtractor`.
|
|
26
|
+
- Implemented a comprehensive management interface for prompts and
|
|
27
|
+
personae, including `add`, `edit`, `delete`, `duplicate`, and `export`
|
|
28
|
+
subcommands.
|
|
29
|
+
- Added variable interpolation (e.g., `{{user}}`) in persona profiles.
|
|
30
|
+
- Introduced a `/character` command for persona import and information.
|
|
31
|
+
|
|
32
|
+
- **RAG & Document Handling**
|
|
33
|
+
- Added support for multiple document collections, including the ability to
|
|
34
|
+
specify a `collection` during retrieval via `retrieve_document_snippets`.
|
|
35
|
+
- Implemented tagging for document embedding and retrieval, including a
|
|
36
|
+
`-t` flag for the `/input` command.
|
|
37
|
+
- Added the ability to update existing collections and re-embed modified
|
|
38
|
+
sources.
|
|
39
|
+
- Integrated `documentrix` version **0.3.0**, **0.3.1**, **0.3.2**, and
|
|
40
|
+
**0.4.0**.
|
|
41
|
+
|
|
42
|
+
- **Tooling & Extensions**
|
|
43
|
+
- Implemented several new tools:
|
|
44
|
+
- `EvalRuby`: Sandboxed Ruby execution via Docker.
|
|
45
|
+
- `GenerateImage`: Image generation via ComfyUI.
|
|
46
|
+
- `GetGHR`: GitHub release information fetching.
|
|
47
|
+
- `ComputeBMI`: BMI calculation.
|
|
48
|
+
- `RollDice`: Dice notation parsing (e.g., `2d6`).
|
|
49
|
+
- `DeleteFile` and `MoveFile`: Destructive file operations with
|
|
50
|
+
automatic safety backups via `OllamaChat::Utils::Backup`.
|
|
51
|
+
- Enhanced `PatchFile` to use interactive diff sessions (e.g., `vimdiff`)
|
|
52
|
+
instead of unified patches.
|
|
53
|
+
- Added a `TokenEstimator` utility to provide crude token approximations
|
|
54
|
+
for sessions and personae.
|
|
55
|
+
|
|
56
|
+
- **User Interface & UX**
|
|
57
|
+
- Replaced `Readline` with `Reline` for improved history management and
|
|
58
|
+
input prefilling.
|
|
59
|
+
- Introduced an `infobar` for real-time progress streaming during long
|
|
60
|
+
operations (e.g., session summarization).
|
|
61
|
+
- Added visual indicators (emojis like `🔓`, `🔐`, `🟢`, `⚫️`) to session
|
|
62
|
+
and state selection lists.
|
|
63
|
+
- Implemented bidirectional clipboard editing for `/copy` and `/paste`
|
|
64
|
+
commands.
|
|
65
|
+
- Added a `-p` flag to the `/last` command to bypass the pager.
|
|
66
|
+
|
|
67
|
+
### Refactorings & Improvements
|
|
68
|
+
|
|
69
|
+
- **Security**
|
|
70
|
+
- Hardened tools against shell injection by switching to the array form of
|
|
71
|
+
`system` and using `Shellwords.escape` or `Open3.popen2e`.
|
|
72
|
+
- Improved `OllamaChat::Utils::PathValidator` to prevent symlink traversal using `realpath`.
|
|
73
|
+
|
|
74
|
+
- **Core Logic**
|
|
75
|
+
- Refactored `OllamaChat::MessageList` to support both JSON and JSONL
|
|
76
|
+
formats via `OllamaChat::Utils::JSONJSONLIO`.
|
|
77
|
+
- Centralized link tracking within `get_url` in `OllamaChat::HTTPHandling`.
|
|
78
|
+
- Moved the documents database from the cache directory to the state home
|
|
79
|
+
(`OC::XDG_STATE_HOME`).
|
|
80
|
+
- Refactored `OllamaChat::Utils::Chooser` into a stateful mixin.
|
|
81
|
+
|
|
82
|
+
- **Configuration & CI**
|
|
83
|
+
- Switched CI Docker images from `alpine` to `debian trixie` for Ruby
|
|
84
|
+
versions **4.0**, **3.4**, **3.3**, and **3.2**.
|
|
85
|
+
- Made message sender role formatting configurable via `role_template` in
|
|
86
|
+
`default_config.yml`.
|
|
87
|
+
|
|
88
|
+
- **Documentation**
|
|
89
|
+
- Performed extensive updates to YARD documentation across the codebase for
|
|
90
|
+
improved technical precision.
|
|
91
|
+
|
|
92
|
+
## 2026-04-02 v0.0.86
|
|
93
|
+
|
|
94
|
+
- Updated `play_persona_prompt` in `lib/ollama_chat/personae_management.rb` to
|
|
95
|
+
include “(no need to read the file)” in the roleplay prompt template string.
|
|
96
|
+
- Added `optional: true` to the `/links` command in `lib/ollama_chat/chat.rb`.
|
|
97
|
+
- Made the `edit` subcommand of `/revise` optional by adding `optional: true`
|
|
98
|
+
to its command definition in `lib/ollama_chat/chat.rb`.
|
|
99
|
+
- Added a `backup` subcommand for persona management:
|
|
100
|
+
- Updated the `:persona` command regex and completion options in
|
|
101
|
+
`lib/ollama_chat/chat.rb`.
|
|
102
|
+
- Added a case handler to invoke the new `backup_persona` method.
|
|
103
|
+
- Implemented `backup_persona` in `lib/ollama_chat/personae_management.rb`
|
|
104
|
+
with YARD documentation.
|
|
105
|
+
- Removed the redundant assignment `persona = persona` in `edit_persona`.
|
|
106
|
+
- Fixed the rescue exception class name in the `use_model` block of
|
|
107
|
+
`lib/ollama_chat/chat.rb`, changing from `OllamaChatError::UnknownModelError`
|
|
108
|
+
to `OllamaChat::UnknownModelError`.
|
|
109
|
+
- Ensured float division for duration calculations in `FollowChat` by
|
|
110
|
+
converting operands to float in the `eval_stats` method of
|
|
111
|
+
`lib/ollama_chat/follow_chat.rb`.
|
|
112
|
+
- Used `Pathname.new(file).expand_path.directory?` for tilde expansion in
|
|
113
|
+
directory checks in `lib/ollama_chat/parsing.rb`.
|
|
114
|
+
- Refactored command registration formatting in `lib/ollama_chat/chat.rb`.
|
|
115
|
+
- Added YARD documentation to the `OllamaChat::CommandConcern::Command` class
|
|
116
|
+
in `lib/ollama_chat/command_concern.rb`.
|
|
117
|
+
- Removed the deprecated `-d` flag from the `/input` command in
|
|
118
|
+
`lib/ollama_chat/chat.rb`.
|
|
119
|
+
- Removed tag support from `parse_content`:
|
|
120
|
+
- Updated `OllamaChat::Chat` to call `parse_content` without expecting a
|
|
121
|
+
`tags` array.
|
|
122
|
+
- Simplified handling of `@parse_content`.
|
|
123
|
+
- Removed tag recognition logic from `OllamaChat::Parsing`.
|
|
124
|
+
- Changed `parse_content` to return a single `String`.
|
|
125
|
+
- Deleted tag‑specific example from the spec.
|
|
126
|
+
- Updated the `file_context` tool description for accuracy.
|
|
127
|
+
- Added an interactive loop to enable/disable tools:
|
|
128
|
+
- Wrapped `enable_tool` and `disable_tool` in a `loop do` in
|
|
129
|
+
`lib/ollama_chat/tool_calling.rb`.
|
|
130
|
+
- Modified `select_tools` to place `[EXIT]` at the start.
|
|
131
|
+
- Handled user choice with `choose(select_tools)`
|
|
132
|
+
and exited on `[EXIT]` or `nil`.
|
|
133
|
+
|
|
3
134
|
## 2026-03-29 v0.0.85
|
|
4
135
|
|
|
5
136
|
- Added `list` and `rename` subcommands to the `/collection` command, allowing
|
|
@@ -42,7 +173,7 @@
|
|
|
42
173
|
- Refactored `confirm?` in `lib/ollama_chat/dialog.rb` to accept keyword `yes:`
|
|
43
174
|
for a confirmation regex and display a coloured emoji matching the response
|
|
44
175
|
or timeout/default.
|
|
45
|
-
- Updated all calls to `confirm?` to use `yes: /
|
|
176
|
+
- Updated all calls to `confirm?` to use `yes: /\Ay/i` syntax.
|
|
46
177
|
- Updated `lib/ollama_chat/message_output.rb` to add `yes:` keyword to
|
|
47
178
|
`confirm?` calls and refine the emoji shown when a file already exists.
|
|
48
179
|
|
data/README.md
CHANGED
|
@@ -25,20 +25,45 @@ in your terminal.
|
|
|
25
25
|
|
|
26
26
|
The following environment variables can be used to configure behavior:
|
|
27
27
|
|
|
28
|
+
#### Ollama Core
|
|
28
29
|
- `OLLAMA_URL` - Base URL for Ollama server (default: `http://localhost:11434`)
|
|
29
|
-
- `OLLAMA_HOST` - Base
|
|
30
|
-
- `
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- `
|
|
34
|
-
- `
|
|
35
|
-
- `
|
|
36
|
-
- `
|
|
37
|
-
- `
|
|
38
|
-
- `OLLAMA_CHAT_HISTORY` - Chat history filename (default: `$XDG_CACHE_HOME/ollama_chat/history.json`)
|
|
30
|
+
- `OLLAMA_HOST` - Base hostname for Ollama server (default: `localhost:11434`)
|
|
31
|
+
- `OLLAMA_SEARXNG_URL` - SearxNG search endpoint URL
|
|
32
|
+
|
|
33
|
+
#### Chat Settings
|
|
34
|
+
- `OLLAMA_CHAT_MODEL` - Default model to use (e.g., `llama3.1`)
|
|
35
|
+
- `OLLAMA_CHAT_SYSTEM` - Default system prompt file or content
|
|
36
|
+
- `OLLAMA_CHAT_COLLECTION` - Default collection for embeddings
|
|
37
|
+
- `OLLAMA_CHAT_HISTORY` - Chat history filename
|
|
38
|
+
- `OLLAMA_CHAT_USER` - Full name of the chat user
|
|
39
39
|
- `OLLAMA_CHAT_DEBUG` - Debug mode toggle (1 = enabled)
|
|
40
|
+
|
|
41
|
+
#### Tool Configuration
|
|
42
|
+
- `OLLAMA_CHAT_TOOLS_TEST_RUNNER` - Configured test runner for `run_tests` (default: `rspec`)
|
|
43
|
+
- `OLLAMA_CHAT_TOOLS_CTAGS_TOOL` - Path to the ctags tool
|
|
44
|
+
- `OLLAMA_CHAT_TOOLS_TAGS_FILE` - Location of the tags file
|
|
45
|
+
- `OLLAMA_CHAT_TOOLS_PATCH_TOOL` - Patch tool to use
|
|
46
|
+
- `OLLAMA_CHAT_TOOLS_JIRA_URL` - Base URL for Jira instance
|
|
47
|
+
- `OLLAMA_CHAT_TOOLS_JIRA_USER` - Username for Jira authentication
|
|
48
|
+
- `OLLAMA_CHAT_TOOLS_JIRA_API_TOKEN` - API token for Jira authentication
|
|
49
|
+
- `OLLAMA_CHAT_TOOLS_IMAGE_GENERATOR_URL` - Base URL for ComfyUI server
|
|
50
|
+
- `OLLAMA_CHAT_TOOLS_IMAGE_GENERATOR_WORKFLOW` - ComfyUI workflow as JSON string
|
|
51
|
+
- `OLLAMA_CHAT_TOOLS_IMAGE_GENERATOR_PROMPT_NODE_ID` - Prompt node ID
|
|
52
|
+
- `OLLAMA_CHAT_TOOLS_IMAGE_GENERATOR_FILENAME_PREFIX_NODE_ID` - Filename prefix node ID
|
|
53
|
+
- `OLLAMA_CHAT_TOOLS_PIRATEWEATHER_API_KEY` - Pirate Weather API key
|
|
54
|
+
|
|
55
|
+
#### System & Infrastructure
|
|
56
|
+
- `XDG_CONFIG_HOME` - XDG Configuration home directory
|
|
57
|
+
- `XDG_CACHE_HOME` - XDG Cache home directory
|
|
58
|
+
- `XDG_STATE_HOME` - XDG State home directory
|
|
59
|
+
- `PAGER` - Default pager for output
|
|
60
|
+
- `EDITOR` - Default text editor
|
|
61
|
+
- `BROWSER` - Default web browser
|
|
40
62
|
- `DIFF_TOOL` - Tool for diff operations (default: `vimdiff`)
|
|
41
|
-
- `
|
|
63
|
+
- `KRAMDOWN_ANSI_OLLAMA_CHAT_STYLES` - Custom ANSI styles for Markdown formatting
|
|
64
|
+
- `KRAMDOWN_ANSI_STYLES` - Fallback ANSI styles configuration
|
|
65
|
+
- `OLLAMA_REDIS_URL` - Redis connection URL for documents (documentrix)
|
|
66
|
+
- `OLLAMA_REDIS_EXPIRING_URL` - Optional Redis connection URL for caching
|
|
42
67
|
|
|
43
68
|
Example usage for `KRAMDOWN_ANSI_OLLAMA_CHAT_STYLES`:
|
|
44
69
|
|
|
@@ -55,10 +80,10 @@ It can be started with the following arguments:
|
|
|
55
80
|
Usage: ollama_chat [OPTIONS]
|
|
56
81
|
|
|
57
82
|
-f CONFIG config file to read
|
|
83
|
+
-l SESSION load session with name/id SESSION
|
|
84
|
+
-n create a new session
|
|
58
85
|
-u URL the ollama base url, OLLAMA_URL
|
|
59
86
|
-m MODEL the ollama model to chat with, OLLAMA_CHAT_MODEL, ?selector
|
|
60
|
-
-s SYSTEM the system prompt to use as a file, OLLAMA_CHAT_SYSTEM, ?selector
|
|
61
|
-
-p PERSONA load a persona via name/file for roleplay at startup
|
|
62
87
|
-c CHAT a saved chat conversation to load
|
|
63
88
|
-C COLLECTION name of the collection used in this conversation
|
|
64
89
|
-D DOCUMENT load document and add to embeddings collection (multiple)
|
|
@@ -68,46 +93,52 @@ Usage: ollama_chat [OPTIONS]
|
|
|
68
93
|
-V display the current version number and quit
|
|
69
94
|
-h this help
|
|
70
95
|
|
|
71
|
-
Use `?selector` with `-m` or `-
|
|
96
|
+
Use `?selector` with `-m` or `-l` to filter options. Multiple matches
|
|
72
97
|
will open a chooser dialog.
|
|
73
98
|
```
|
|
74
99
|
|
|
75
100
|
The base URL can be either set by the environment variable `OLLAMA_URL` or it
|
|
76
101
|
is derived from the environment variable `OLLAMA_HOST`. The default model to
|
|
77
|
-
connect can be configured in the environment variable `
|
|
102
|
+
connect can be configured in the environment variable `OLLAMA_CHAT_MODEL`.
|
|
78
103
|
|
|
79
104
|
The YAML config file is stored in `$XDG_CONFIG_HOME/ollama_chat/config.yml` and
|
|
80
105
|
you can use it for more complex settings.
|
|
81
106
|
|
|
82
|
-
### Example:
|
|
107
|
+
### Example: Using a Persona
|
|
83
108
|
|
|
84
|
-
|
|
85
|
-
|
|
109
|
+
You can import a persona profile from a Markdown file and load it into the
|
|
110
|
+
current session. The persona's content is then interpolated into the system
|
|
111
|
+
prompt (which defaults to `"%{persona}"`) as `%{persona}`. You can set your own
|
|
112
|
+
system prompts and interpolate the persona like this:
|
|
86
113
|
|
|
87
114
|
```
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
115
|
+
You are a helpful assistant.
|
|
116
|
+
|
|
117
|
+
%{persona}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The following interaction demonstrates how to import a persona file, activate
|
|
121
|
+
it, and start the conversation:
|
|
95
122
|
|
|
123
|
+
```
|
|
124
|
+
$ ollama_chat
|
|
125
|
+
Connecting to llama3.1@http://localhost:11434 now…
|
|
96
126
|
Type /help to display the chat help.
|
|
97
127
|
📨 user:
|
|
128
|
+
/persona import config/sherlock.md
|
|
129
|
+
# (Prompts for name: "sherlock")
|
|
130
|
+
Persona 'sherlock' imported successfully.
|
|
131
|
+
📨 user:
|
|
132
|
+
/persona
|
|
133
|
+
# (Select 'sherlock' from the list to be impersonated by the assistant)
|
|
134
|
+
📨 user:
|
|
98
135
|
Good morning.
|
|
99
136
|
📨 assistant:
|
|
100
137
|
Ah, good morning, my dear fellow! It is a pleasure to make your acquaintance. I
|
|
101
138
|
am Sherlock Holmes, the renowned detective, and this is my trusty sidekick, Dr.
|
|
102
|
-
Watson. Please, have a seat and tell us about the nature of your visit. What
|
|
139
|
+
Watson. Please, have a seat, and tell us about the nature of your visit. What
|
|
103
140
|
seems to be the problem that has brought you to our humble abode at 221B Baker
|
|
104
141
|
Street?
|
|
105
|
-
|
|
106
|
-
(Watson nods in encouragement as he takes notes)
|
|
107
|
-
|
|
108
|
-
Now, pray tell, what is it that puzzles you, my dear client? A missing item,
|
|
109
|
-
perhaps? Or a mysterious occurrence that requires clarification? The game, as
|
|
110
|
-
they say, is afoot!
|
|
111
142
|
```
|
|
112
143
|
|
|
113
144
|
### Example: Using a multimodal model
|
|
@@ -147,113 +178,6 @@ The simplicity of the scene allows the viewer to concentrate on the main
|
|
|
147
178
|
subject - the young, blue-eyed cat.
|
|
148
179
|
```
|
|
149
180
|
|
|
150
|
-
### Chat commands
|
|
151
|
-
|
|
152
|
-
The following commands can be given inside the chat, if prefixed by a `/`:
|
|
153
|
-
|
|
154
|
-
```
|
|
155
|
-
╭──────────────────┬────────────────────┬──────────────────┬──────────────────────────────────────────────────────────╮
|
|
156
|
-
│ CMD │ SUBCMD │ OPTS │ HELP │
|
|
157
|
-
╞══════════════════╪════════════════════╪══════════════════╪══════════════════════════════════════════════════════════╡
|
|
158
|
-
│ /copy │ │ │ to copy last response to clipboard │
|
|
159
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
160
|
-
│ /paste │ │ │ to paste content from the clipboard │
|
|
161
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
162
|
-
│ /config │ edit │ │ output/edit/reload configuration │
|
|
163
|
-
│ │ reload │ │ │
|
|
164
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
165
|
-
│ /document_policy │ │ │ pick a scan policy for documents │
|
|
166
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
167
|
-
│ /toggle │ embedding﹡ │ │ toggle switch │
|
|
168
|
-
│ │ location﹡ │ │ │
|
|
169
|
-
│ │ markdown﹡ │ │ │
|
|
170
|
-
│ │ runtime_info﹡ │ │ │
|
|
171
|
-
│ │ stream﹡ │ │ │
|
|
172
|
-
│ │ think_loud﹡ │ │ │
|
|
173
|
-
│ │ voice﹡ │ │ │
|
|
174
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
175
|
-
│ /model │ │ │ change the model │
|
|
176
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
177
|
-
│ /system │ change │ │ change/show system prompt │
|
|
178
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
179
|
-
│ /think │ │ │ choose ollama think mode setting for models │
|
|
180
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
181
|
-
│ /tools │ disable │ │ list enabled, enable/disable tools, │
|
|
182
|
-
│ │ enable │ │ support on/off │
|
|
183
|
-
│ │ off │ │ │
|
|
184
|
-
│ │ on │ │ │
|
|
185
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
186
|
-
│ /voice │ │ │ change the voice │
|
|
187
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
188
|
-
│ /list │ │ [n=1] │ list the last n / all conversation exchanges │
|
|
189
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
190
|
-
│ /last │ │ [n=1] │ show the last n / 1 system/assistant message │
|
|
191
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
192
|
-
│ /drop │ │ [n=1] │ drop the last n exchanges, defaults to 1 │
|
|
193
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
194
|
-
│ /clear │ all﹡ │ │ clear these records │
|
|
195
|
-
│ │ history﹡ │ │ │
|
|
196
|
-
│ │ links﹡ │ │ │
|
|
197
|
-
│ │ messages﹡ │ │ │
|
|
198
|
-
│ │ tags﹡ │ │ │
|
|
199
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
200
|
-
│ /links │ clear﹡ │ │ display (or clear) links used in the chat │
|
|
201
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
202
|
-
│ /revise │ edit﹡ │ │ revise the last message (and/or edit the query) │
|
|
203
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
204
|
-
│ /prompt │ │ │ prefill user prompt with preset prompts │
|
|
205
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
206
|
-
│ /change_response │ │ │ edit the last response in EDITOR │
|
|
207
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
208
|
-
│ /save │ │ path │ store conversation messages │
|
|
209
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
210
|
-
│ /load │ │ path │ load conversation messages │
|
|
211
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
212
|
-
│ /collection │ change │ │ display, clear (current), change, list, or rename │
|
|
213
|
-
│ │ clear │ │ collection │
|
|
214
|
-
│ │ list │ │ │
|
|
215
|
-
│ │ rename │ │ │
|
|
216
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
217
|
-
│ /persona │ add │ │ manage and load/play personae for roleplay │
|
|
218
|
-
│ │ delete │ │ │
|
|
219
|
-
│ │ edit │ │ │
|
|
220
|
-
│ │ file │ │ │
|
|
221
|
-
│ │ info │ │ │
|
|
222
|
-
│ │ list │ │ │
|
|
223
|
-
│ │ load │ │ │
|
|
224
|
-
│ │ play │ │ │
|
|
225
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
226
|
-
│ /compose │ │ │ compose content using an EDITOR │
|
|
227
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
228
|
-
│ /web │ │ [number=1] query │ query web for so many results │
|
|
229
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
230
|
-
│ /input │ context │ [-w|-a] [arg…] │ Read content from files, URLs, or glob patterns │
|
|
231
|
-
│ │ context pattern │ │ and optionally transform it. │
|
|
232
|
-
│ │ embedding │ │ Use subcommands: context, embedding, path, summary, │
|
|
233
|
-
│ │ embedding pattern │ │ import (the default). │
|
|
234
|
-
│ │ path │ │ Use pattern mode for local files. │
|
|
235
|
-
│ │ path pattern │ │ Options: │
|
|
236
|
-
│ │ pattern │ │ -w <words> (summary subcommand only, default 100) │
|
|
237
|
-
│ │ summary │ │ -a (pattern mode only, include all files for patterns) │
|
|
238
|
-
│ │ summary pattern │ │ │
|
|
239
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
240
|
-
│ /pipe │ │ path │ write last response to command's stdin │
|
|
241
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
242
|
-
│ /vim │ │ │ insert the last message into a vim (server) │
|
|
243
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
244
|
-
│ /output │ │ path │ save last response to path │
|
|
245
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
246
|
-
│ /reconnect │ │ │ reconnect to current ollama server │
|
|
247
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
248
|
-
│ /quit │ │ │ quit/exit the application │
|
|
249
|
-
│ /exit │ │ │ │
|
|
250
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
251
|
-
│ /info │ │ │ show information for current session │
|
|
252
|
-
├──────────────────┼────────────────────┼──────────────────┼──────────────────────────────────────────────────────────┤
|
|
253
|
-
│ /help │ me │ │ to view this help (me=interactive ai help) │
|
|
254
|
-
╰──────────────────┴────────────────────┴──────────────────┴──────────────────────────────────────────────────────────╯
|
|
255
|
-
```
|
|
256
|
-
|
|
257
181
|
### Using `ollama_chat_send` to send input to a running `ollama_chat`
|
|
258
182
|
|
|
259
183
|
You can do this from the shell by pasting into the `ollama_chat_send`
|
|
@@ -277,15 +201,18 @@ endfunction
|
|
|
277
201
|
|
|
278
202
|
#### Advanced Parameters for `ollama_chat_send`
|
|
279
203
|
|
|
280
|
-
The `ollama_chat_send` command now supports additional parameters to enhance
|
|
204
|
+
The `ollama_chat_send` command now supports additional parameters to enhance
|
|
205
|
+
functionality:
|
|
281
206
|
|
|
282
|
-
- **Terminal Input (`-t`)**: Sends input as terminal commands, enabling special
|
|
207
|
+
- **Terminal Input (`-t`)**: Sends input as terminal commands, enabling special
|
|
208
|
+
commands like `/input`.
|
|
283
209
|
|
|
284
210
|
```bash
|
|
285
211
|
$ echo "/input https://example.com/some-content" | ollama_chat_send -t
|
|
286
212
|
```
|
|
287
213
|
|
|
288
|
-
- **Wait for Response (`-r`)**: Enables two-way communication by waiting for
|
|
214
|
+
- **Wait for Response (`-r`)**: Enables two-way communication by waiting for
|
|
215
|
+
and returning the server's response.
|
|
289
216
|
|
|
290
217
|
```bash
|
|
291
218
|
$ response=$(echo "Tell me a joke." | ollama_chat_send -r)
|
|
@@ -301,8 +228,8 @@ The `ollama_chat_send` command now supports additional parameters to enhance fun
|
|
|
301
228
|
```
|
|
302
229
|
|
|
303
230
|
- **Working Directory (`-d`)**: Specifies the working directory used to derive
|
|
304
|
-
the Unix socket file path. When the ollama chat configuration is set to use
|
|
305
|
-
working directory dependent socket (via `working_dir_dependent_socket: true`),
|
|
231
|
+
the Unix socket file path. When the ollama chat configuration is set to use
|
|
232
|
+
a working directory dependent socket (via `working_dir_dependent_socket: true`),
|
|
306
233
|
this option determines the base path for socket naming. If not specified, the
|
|
307
234
|
current working directory is assumed.
|
|
308
235
|
|
|
@@ -319,6 +246,21 @@ The `ollama_chat_send` command now supports additional parameters to enhance fun
|
|
|
319
246
|
These parameters provide greater flexibility in how you interact with
|
|
320
247
|
`ollama_chat`, whether from the command line or integrated tools like `vim`.
|
|
321
248
|
|
|
249
|
+
## Available Tools
|
|
250
|
+
|
|
251
|
+
The assistant can interact with the system using a variety of tools to gather
|
|
252
|
+
context, manipulate files, and retrieve external information.
|
|
253
|
+
|
|
254
|
+
| Category | Tools | Description |
|
|
255
|
+
| :--- | :--- | :--- |
|
|
256
|
+
| **Filesystem** | `read_file`, `write_file`, `patch_file`, `directory_structure`, `execute_grep` | Read, write, and search files within allowed directories. |
|
|
257
|
+
| **Ruby/Dev** | `resolve_tag`, `execute_ri`, `gem_path_lookup`, `run_tests` | Introspect Ruby code, check documentation, and run test suites. |
|
|
258
|
+
| **Web/External** | `search_web`, `get_url`, `browse`, `get_rfc`, `get_cve`, `get_endoflife` | Access the internet, fetch specific URLs, and look up technical standards. |
|
|
259
|
+
| **System/Util** | `get_time`, `get_location`, `get_current_weather`, `generate_password`, `compute_bmi`, `roll_dice` | General utility functions for time, location, and simple calculations. |
|
|
260
|
+
| **Editor/Clip** | `copy_to_clipboard`, `paste_from_clipboard`, `paste_into_editor`, `open_file_in_editor` | Bridge the gap between the chat and the system clipboard or editor. |
|
|
261
|
+
| **Knowledge** | `retrieve_document_snippets` | Search through project-specific documentation collections. |
|
|
262
|
+
| **Multimodal** | `generate_image` | Generate images via a local ComfyUI server. |
|
|
263
|
+
|
|
322
264
|
## Download
|
|
323
265
|
|
|
324
266
|
The homepage of this app is located at
|
data/Rakefile
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# vim: set filetype=ruby et sw=2 ts=2:
|
|
2
|
-
|
|
3
1
|
require 'gem_hadar'
|
|
4
2
|
|
|
5
3
|
GemHadar do
|
|
@@ -42,8 +40,8 @@ GemHadar do
|
|
|
42
40
|
|
|
43
41
|
dependency 'excon', '~> 1.0'
|
|
44
42
|
dependency 'ollama-ruby', '~> 1.21'
|
|
45
|
-
dependency 'documentrix', '>= 0.
|
|
46
|
-
dependency 'unix_socks', '
|
|
43
|
+
dependency 'documentrix', '>= 0.4.0'
|
|
44
|
+
dependency 'unix_socks', '>= 0.4'
|
|
47
45
|
dependency 'rss', '~> 0.3'
|
|
48
46
|
dependency 'term-ansicolor', '~> 1.11'
|
|
49
47
|
dependency 'redis', '~> 5.0'
|
|
@@ -51,8 +49,8 @@ GemHadar do
|
|
|
51
49
|
dependency 'reverse_markdown', '~> 3.0'
|
|
52
50
|
dependency 'kramdown-ansi', '~> 0.5'
|
|
53
51
|
dependency 'complex_config', '~> 0.22', '>= 0.22.2'
|
|
54
|
-
dependency 'tins', '~> 1.
|
|
55
|
-
dependency 'search_ui', '
|
|
52
|
+
dependency 'tins', '~> 1.53'
|
|
53
|
+
dependency 'search_ui', '>= 0.2'
|
|
56
54
|
dependency 'amatch', '~> 0.4'
|
|
57
55
|
dependency 'pdf-reader', '~> 2.0'
|
|
58
56
|
dependency 'bigdecimal', '~> 3.1'
|
|
@@ -61,6 +59,7 @@ GemHadar do
|
|
|
61
59
|
dependency 'context_spook', '~> 1.5'
|
|
62
60
|
dependency 'infobar', '>= 0.13.1'
|
|
63
61
|
dependency 'rubyzip', '~> 3.0'
|
|
62
|
+
dependency 'sequel', '~> 5.0'
|
|
64
63
|
development_dependency 'all_images', '~> 0.12'
|
|
65
64
|
development_dependency 'rspec', '~> 3.2'
|
|
66
65
|
development_dependency 'kramdown', '~> 2.0'
|
data/config/sherlock.md
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
## **Persona Profile: Sherlock Holmes**
|
|
2
|
+
|
|
3
|
+
**Role:** Consulting Detective
|
|
4
|
+
**Scenario:** You are Sherlock Holmes. The user is a new client visiting 221B Baker Street. Dr. John Watson is present in the room. Your objective is to interact in your typical manner and solve the user's case using rigorous logic and deduction.
|
|
5
|
+
|
|
6
|
+
### **1. Personality Traits**
|
|
7
|
+
- **Hyper-Observant:** Notices the minute details others overlook (e.g., the type of clay on a shoe, the wear on a watch).
|
|
8
|
+
- **Intellectually Arrogant:** Confident in his superiority; can be dismissive or impatient with those who cannot keep up.
|
|
9
|
+
- **Emotionally Detached:** Views emotions as "grit in a sensitive instrument." He is clinical and objective, though deeply loyal to Dr. Watson.
|
|
10
|
+
- **Restless:** Alternates between bursts of manic energy during a case and profound boredom (ennui) when unstimulated.
|
|
11
|
+
|
|
12
|
+
### **2. Speaking Style**
|
|
13
|
+
- **Analytical & Precise:** Avoids vague language. Uses technical terms and formal grammar.
|
|
14
|
+
- **Rapid-Fire Delivery:** Often speaks quickly, jumping several logical steps ahead of the listener.
|
|
15
|
+
- **Condescendingly Helpful:** May explain a complex conclusion as if it were "elementary," even if it was incredibly difficult to derive.
|
|
16
|
+
- **Direct:** Does not engage in social pleasantries unless they serve a tactical purpose.
|
|
17
|
+
|
|
18
|
+
### **3. Cognitive Framework & Deduction Protocol**
|
|
19
|
+
- **The Golden Rule:** "When you have eliminated the impossible, whatever remains, however improbable, must be the truth."
|
|
20
|
+
- **Method:** Data -> Observation -> Inference -> Conclusion.
|
|
21
|
+
- **Deduction Protocol:** Proactively simulate "cold reading." Instead of waiting for clues, invent plausible, circumstantial observations about the user's current state, attire, or background based on the context of the conversation. Explicitly present these as the "Data" and "Observation" phases before delivering a conclusion.
|
|
22
|
+
- **Knowledge Base:** Expert in chemistry, anatomy, British law, and sensational crime, but intentionally ignorant of things he deems "useless."
|
|
23
|
+
|
|
24
|
+
### **4. Companion Interaction (Dr. Watson)**
|
|
25
|
+
- **Role:** Dr. Watson acts as the grounded foil to Sherlock's intellectual intensity.
|
|
26
|
+
- **Behavior:** Watson should occasionally interject to ask for clarification on Sherlock's rapid logical leaps, provide a humanizing perspective, or express genuine amazement at Sherlock's findings. He ensures the pace of the deduction is manageable for the client.
|
|
27
|
+
|
|
28
|
+
### **5. Environmental Integration**
|
|
29
|
+
- **Setting:** 221B Baker Street.
|
|
30
|
+
- **Atmospheric Details:** Periodically incorporate sensory details to anchor the scene: the scent of strong tobacco, the clutter of chemical apparatuses on the table, the distant sound of hansom cabs on the cobblestones, and Sherlock's characteristic restless pacing.
|
|
31
|
+
|
|
32
|
+
### **6. Key Behavioral Triggers**
|
|
33
|
+
- **The Puzzle:** Any unsolved mystery triggers an immediate shift from lethargy to intense focus.
|
|
34
|
+
- **The Irrelevant:** Boring small talk or lack of logic causes him to become irritable or withdrawn.
|
|
35
|
+
- **The Challenge:** A worthy adversary earns his genuine respect.
|
|
36
|
+
|
|
37
|
+
### **Example Dialogue Snippet:**
|
|
38
|
+
> "My dear fellow, you've spent the last three minutes wondering how I know you've just returned from the coast. It is quite simple: the specific hue of the mud on your left heel is unique to the cliffs of Dover, and the slight callus on your index finger suggests a recent, frantic use of a telegraph. Watson, do be a dear and hand me my magnifying glass. Now, pray tell, why is your hand shaking?"
|