Skip to content

Commit a27d6e9

Browse files
committed
feat(context): display cursor_data with the user prompt
1 parent 829be3a commit a27d6e9

File tree

5 files changed

+27
-6
lines changed

5 files changed

+27
-6
lines changed

lua/opencode/context.lua

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ function M.get_current_cursor_data(buf, win)
259259

260260
local cursor_pos = vim.fn.getcurpos(win)
261261
local cursor_content = vim.trim(vim.api.nvim_buf_get_lines(buf, cursor_pos[2] - 1, cursor_pos[2], false)[1] or '')
262-
return { line = cursor_pos[2], col = cursor_pos[3], line_content = cursor_content }
262+
return { line = cursor_pos[2], column = cursor_pos[3], line_content = cursor_content }
263263
end
264264

265265
function M.get_current_selection()
@@ -345,13 +345,15 @@ local function format_diagnostics_part(diagnostics)
345345
end
346346

347347
local function format_cursor_data_part(cursor_data)
348+
local buf = (M.get_current_buf() or 0) --[[@as integer]]
349+
local lang = util.get_markdown_filetype(vim.api.nvim_buf_get_name(buf)) or ''
348350
return {
349351
type = 'text',
350352
text = vim.json.encode({
351353
context_type = 'cursor-data',
352354
line = cursor_data.line,
353355
column = cursor_data.column,
354-
line_content = cursor_data.line_content,
356+
line_content = string.format('`````%s\n%s\n`````', lang, cursor_data.line_content),
355357
}),
356358
synthetic = true,
357359
}

lua/opencode/core.lua

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@ end
9595
--- @param prompt string The message prompt to send.
9696
--- @param opts? SendMessageOpts
9797
function M.send_message(prompt, opts)
98-
-- Check if prompt is allowed
99-
local context_module = require('opencode.context')
100-
local mentioned_files = context_module.context.mentioned_files or {}
98+
local mentioned_files = context.context.mentioned_files or {}
10199
local allowed, err_msg = util.check_prompt_allowed(config.prompt_guard, mentioned_files)
102100

103101
if not allowed then
@@ -123,8 +121,9 @@ function M.send_message(prompt, opts)
123121
state.current_mode = opts.agent
124122
end
125123

126-
params.parts = context.format_message(prompt, opts.context)
127124
state.current_context_config = opts.context
125+
context.load()
126+
params.parts = context.format_message(prompt, opts.context)
128127

129128
M.before_run(opts)
130129

lua/opencode/ui/formatter.lua

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,23 @@ function M._format_selection_context(output, part)
373373
M._add_vertical_border(output, start_line, end_line, 'OpencodeMessageRoleUser', -3)
374374
end
375375

376+
---@param output Output Output object to write to
377+
---@param part OpencodeMessagePart
378+
function M._format_cursor_data_context(output, part)
379+
local json = context_module.decode_json_context(part.text, 'cursor-data')
380+
if not json then
381+
return
382+
end
383+
local start_line = output:get_line_count()
384+
output:add_line('Line ' .. json.line .. ':')
385+
output:add_lines(vim.split(json.line_content or '', '\n'))
386+
output:add_empty_line()
387+
388+
local end_line = output:get_line_count()
389+
390+
M._add_vertical_border(output, start_line, end_line, 'OpencodeMessageRoleUser', -3)
391+
end
392+
376393
---Format and display the file path in the context
377394
---@param output Output Output object to write to
378395
---@param path string|nil File path
@@ -709,6 +726,7 @@ function M.format_part(part, message, is_last_part)
709726
if part.type == 'text' and part.text then
710727
if part.synthetic == true then
711728
M._format_selection_context(output, part)
729+
M._format_cursor_data_context(output, part)
712730
else
713731
M._format_user_prompt(output, vim.trim(part.text), message)
714732
content_added = true
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"extmarks":[[1,2,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":10,"virt_text":[["▌󰭻 ","OpencodeMessageRoleUser"],[" "],["USER","OpencodeMessageRoleUser"],["","OpencodeHint"],[" (2025-10-30 17:42:54)","OpencodeHint"],[" [msg_a3637244a001FDRDfoBYVPEGpd]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text_win_col":-3}],[2,3,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[3,4,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[4,5,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[5,6,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[6,7,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[7,8,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[8,9,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[9,10,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[10,11,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[11,12,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":4096,"virt_text":[["▌","OpencodeMessageRoleUser"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":true,"virt_text_win_col":-3}],[12,14,0,{"virt_text_hide":false,"ns_id":3,"right_gravity":true,"priority":10,"virt_text":[[" ","OpencodeMessageRoleAssistant"],[" "],["BUILD","OpencodeMessageRoleAssistant"],[" gpt-5-mini","OpencodeHint"],[" (2025-10-30 17:42:56)","OpencodeHint"],[" [msg_a36372b9a001M1lQEix4SK5QE5]","OpencodeHint"]],"virt_text_pos":"win_col","virt_text_repeat_linebreak":false,"virt_text_win_col":-3}]],"actions":[],"lines":["","----","","","what is this doing","","[lua/opencode/context.lua](lua/opencode/context.lua)","","Line 59:","`````lua","local is_enabled = vim.tbl_get(config, 'context', context_key, 'enabled')","`````","","----","","","**Explanation**","","- The line `local is_enabled = vim.tbl_get(config, 'context', context_key, 'enabled')` (in `lua/opencode/context.lua:58`) uses `vim.tbl_get` to safely read a nested field from a table.","- Concretely it attempts to read `config.context[context_key].enabled` but without throwing an error if `config.context` or `config.context[context_key]` is nil. If any intermediate key is missing it returns `nil`.","- In the surrounding function `M.is_context_enabled`, that value is the default config value for the given context key. The function then checks the state override:"," - If `state.current_context_config[context_key].enabled` is not `nil`, that state value (true/false) is returned."," - Otherwise the `is_enabled` value (from `config`) is returned.","- Example: if `config.context.selection.enabled == true` but `state.current_context_config.selection.enabled == false`, the function returns `false` (state overrides config). If the state value is `nil`, the config value is used.","- Why this matters: `vim.tbl_get` provides safe nested access; using it avoids runtime errors when some parts of the nested config are absent.",""],"timestamp":1761846231}

tests/data/cursor_data.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)