|
5 | 5 | {"_type":"issue","id":"dirge-86e","title":"ANSI injection in permission ALERT prompt","description":"ask_req.tool / ask_req.input rendered un-sanitized at mod.rs:2584-2585. Reopen path already sanitizes — asymmetric. Sec impl: ANSI at the permission-decision moment.","status":"closed","priority":1,"issue_type":"bug","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-21T22:17:34Z","created_by":"Yogthos","updated_at":"2026-05-21T22:26:37Z","started_at":"2026-05-21T22:17:42Z","closed_at":"2026-05-21T22:26:37Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} |
6 | 6 | {"_type":"issue","id":"dirge-9f1","title":"Chat history ignores 120-col content_width cap","description":"max_line_width and wrap_line use raw content_cols, so on wide terminals scrollback overflows the centered band into divider/panel margin.","status":"closed","priority":1,"issue_type":"bug","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-21T22:17:33Z","created_by":"Yogthos","updated_at":"2026-05-21T22:26:36Z","started_at":"2026-05-21T22:17:42Z","closed_at":"2026-05-21T22:26:36Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} |
7 | 7 | {"_type":"issue","id":"dirge-woq","title":"R1: fix 3 critical plugin bugs (FFI panic, dialog deadlock, init hang)","description":"From the plugin subsystem audit: (1) wrap JanetCFunctions in catch_unwind so Rust panics don't unwind across the C-FFI boundary into Janet; (2) cancel send_dialog's reply_rx.recv() on worker shutdown so the worker thread doesn't block forever when the UI exits mid-dialog; (3) add timeout to the init handshake so a worker panic before init_tx.send() doesn't hang the main thread. Also: (4) bounds-assert wrap_string's i32 cast for the unlikely \u003e2GB case, (5) make take_string_slot atomic to close the race window, (6) don't eat unrelated user events in the dialog arm.","status":"closed","priority":1,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-05-20T14:59:57Z","created_by":"Yogthos","updated_at":"2026-05-20T15:30:28Z","started_at":"2026-05-20T15:00:10Z","closed_at":"2026-05-20T15:30:28Z","dependency_count":0,"dependent_count":1,"comment_count":0} |
| 8 | +{"_type":"issue","id":"dirge-6mx","title":"H-R1: try_lock at loop-top PM acquisitions to avoid UI freeze during plugin tools","description":"ui/mod.rs event-loop top does std::sync::Mutex::lock() multiple times per iteration (list_shortcuts, drain_notifications, drain_entries, drain_tree_ops). During a plugin tool execution inside spawn_blocking holding the same mutex, these acquisitions block the runtime worker thread — UI freezes. Switch all four to try_lock; on contention, skip the refresh this iteration. drain_* semantics tolerate the one-tick delay; list_shortcuts gets refreshed on the next idle tick after the tool returns.","status":"closed","priority":2,"issue_type":"bug","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T02:15:30Z","created_by":"Yogthos","updated_at":"2026-05-23T02:17:15Z","started_at":"2026-05-23T02:15:36Z","closed_at":"2026-05-23T02:17:15Z","close_reason":"Closed","dependency_count":0,"dependent_count":0,"comment_count":0} |
8 | 9 | {"_type":"issue","id":"dirge-pp8","title":"H3: expose prepareArguments on harness/register-tool","description":"LoopTool::prepare_arguments default no-op; JanetLoopTool doesn't override. Plugin authors wanting to normalize args before schema validation (pi's prepareEditArguments is the canonical example) have no surface.\\n\\nPi: prepareArguments?: (args: unknown) =\u003e Static\u003cTParams\u003e on ToolDefinition (types.ts:443); pi forwards through the wrapper.\\n\\nFix: optional prepare-arguments field on harness/register-tool (Janet fn name). Host calls it before parsing args into the loop's typed shape. Mutate result back into Value and feed to handler.","status":"closed","priority":2,"issue_type":"feature","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T01:10:13Z","created_by":"Yogthos","updated_at":"2026-05-23T01:30:48Z","started_at":"2026-05-23T01:26:07Z","closed_at":"2026-05-23T01:30:48Z","close_reason":"Closed","dependencies":[{"issue_id":"dirge-pp8","depends_on_id":"dirge-0iy","type":"blocks","created_at":"2026-05-22T21:10:21Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} |
9 | 10 | {"_type":"issue","id":"dirge-bqs","title":"H4: dedup plugin-tool names + emit diagnostic on shortcut/renderer collisions","description":"harness/register-tool appends to harness-tools-list unconditionally. Two plugins (or one plugin reload pattern) registering the same name produce two entries; both are wrapped as JanetLoopTool and the agent loop has two same-name tools with undefined dispatch order.\\n\\nPi: extension.tools is Map\u003cname, RegisteredTool\u003e (loader.ts:219) — second set replaces first. Across extensions runner.ts:378 uses first-extension-wins.\\n\\nFix: dedup in list_plugin_tools (last-load-wins per name, matching the Map semantics) with tracing::warn on duplicate. Same for list_shortcuts; pi emits a diagnostic per duplicate (runner.ts:451). list_message_renderers already first-match-wins via .find().","status":"closed","priority":2,"issue_type":"task","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T01:09:54Z","created_by":"Yogthos","updated_at":"2026-05-23T01:26:05Z","started_at":"2026-05-23T01:21:12Z","closed_at":"2026-05-23T01:26:05Z","close_reason":"Closed","dependencies":[{"issue_id":"dirge-bqs","depends_on_id":"dirge-0iy","type":"blocks","created_at":"2026-05-22T21:10:20Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} |
10 | 11 | {"_type":"issue","id":"dirge-io6","title":"H5: surface plugin shortcut handler errors instead of swallowing","description":"UI shortcut dispatch goes through invoke_command which catches Janet errors to Ok(None). UI only displays on Ok(Some(msg)). A handler raising an exception is indistinguishable from one returning nil — no chat notification, no tracing::warn, plugin authors get zero feedback.\\n\\nPi parallel: Promise.resolve(...).catch(err =\u003e this.showError(...)) (interactive-mode.ts:1666).\\n\\nFix: use the same DIRGE_HOOK_ERR catch wrapper that dispatch() uses (mod.rs:1956) — tracing::warn + harness/push-hook-err notification. Either inline in invoke_command (with backward-compat), or add a new invoke_command_traced variant.","status":"closed","priority":2,"issue_type":"bug","owner":"yogthos@gmail.com","created_at":"2026-05-23T01:09:54Z","created_by":"Yogthos","updated_at":"2026-05-23T01:26:06Z","closed_at":"2026-05-23T01:26:06Z","close_reason":"Closed","dependencies":[{"issue_id":"dirge-io6","depends_on_id":"dirge-0iy","type":"blocks","created_at":"2026-05-22T21:10:21Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} |
|
58 | 59 | {"_type":"issue","id":"dirge-ny0","title":"Phase 3: right-side info panel (cwd, MCP, LSP, todos, modified files)","description":"Carve right ~32 cols (auto-hide when terminal narrower than ~100). Sources: cwd from env, MCP from McpClientManager.handles, LSP via new public accessor on LspManager, todos from TODO_LIST mutex, modified files via new shared Arc\u003cMutex\u003cIndexSet\u003cPathBuf\u003e\u003e\u003e populated by Write/Edit/ApplyPatch tools. New /panel on|off toggle. Default on when wide enough.","status":"closed","priority":2,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-05-20T03:40:08Z","created_by":"Yogthos","updated_at":"2026-05-20T04:21:53Z","started_at":"2026-05-20T04:11:20Z","closed_at":"2026-05-20T04:21:53Z","close_reason":"Closed","dependency_count":0,"dependent_count":1,"comment_count":0} |
59 | 60 | {"_type":"issue","id":"dirge-r2u","title":"Phase 2A: queue user input while agent is running","description":"Remove 'agent is busy' guard at src/ui/mod.rs:663 and :720 for plain text. Push to VecDeque\u003cString\u003e interjection_queue. Show queue count + dim preview above input. Esc/Ctrl-X drops most recent. Ctrl-C still aborts. Slash commands stay gated to current allow-list. On AgentEvent::Done, drain queue and run as next turn.","status":"closed","priority":2,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-05-20T03:40:07Z","created_by":"Yogthos","updated_at":"2026-05-20T04:04:50Z","started_at":"2026-05-20T03:58:39Z","closed_at":"2026-05-20T04:04:50Z","close_reason":"Closed","dependency_count":0,"dependent_count":1,"comment_count":0} |
60 | 61 | {"_type":"issue","id":"dirge-sxt","title":"Phase 1: soft-wrap input box instead of horizontal scroll","description":"Replace horizontal scroll logic in src/ui/renderer.rs::draw_bottom (lines ~500-660) with display-column wrap. Drop input_scroll_offset; compute visual rows from logical lines wrapped to visible_width; keep MAX_INPUT_VISIBLE_LINES cap with vertical scroll keeping cursor visible. Move or guard the token counter so it doesn't collide with wrapped text. Add a unit test for cursor (logical -\u003e visual) mapping.","status":"closed","priority":2,"issue_type":"feature","owner":"yogthos@gmail.com","created_at":"2026-05-20T03:40:06Z","created_by":"Yogthos","updated_at":"2026-05-20T03:58:35Z","started_at":"2026-05-20T03:52:14Z","closed_at":"2026-05-20T03:58:35Z","close_reason":"Closed","dependency_count":0,"dependent_count":1,"comment_count":0} |
| 62 | +{"_type":"issue","id":"dirge-64e","title":"doc + buffer_pos_at fix: M-R3, H-R2, L-R3, L-R4","description":"Four doc-leaning items + one small code fix from review-2:\\n- M-R3: PLUGINS.md note that dirge's display=false is suppression-only (no plugin-observable transcript yet)\\n- H-R2: PLUGINS.md note that prepare-arguments blocks the executor synchronously; keep handlers light\\n- L-R3: buffer_pos_at uses entry.text.chars().count() which includes escape bytes. Switch to strip_ansi-aware count so column clamping reflects visible chars.\\n- L-R4: one-line code comment in JanetLoopTool::execute explaining post-handler batch replay semantics for emit-tool-progress","status":"open","priority":3,"issue_type":"task","owner":"yogthos@gmail.com","created_at":"2026-05-23T02:15:32Z","created_by":"Yogthos","updated_at":"2026-05-23T02:15:32Z","dependency_count":0,"dependent_count":0,"comment_count":0} |
| 63 | +{"_type":"issue","id":"dirge-5km","title":"cleanup batch: L-R1 dead binding, L-R2 cfg salad, M-R1 dead filter, M-R2 double-lock","description":"Four cosmetic fixes from review-2:\\n- L-R1: drop unused name_owned capture in JanetLoopTool::execute\\n- L-R2: simplify the four-#[cfg] block around CustomMessage arm in ui/mod.rs — gate the whole arm under cfg(feature=plugin) since AgentEvent::CustomMessage can't be produced without it\\n- M-R1: remove dead filter in drain_tool_progress call (filter for matching tcid only — invariant says all entries match, dead-code defensive)\\n- M-R2: fold resolve_custom_message_render to one PM acquisition instead of two","status":"in_progress","priority":3,"issue_type":"task","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T02:15:31Z","created_by":"Yogthos","updated_at":"2026-05-23T02:17:16Z","started_at":"2026-05-23T02:17:16Z","dependency_count":0,"dependent_count":0,"comment_count":0} |
61 | 64 | {"_type":"issue","id":"dirge-3s1","title":"L*: phase-9 polish (key spec strictness, modifier matching, registration validation, unregister symmetry)","description":"Five low-severity items from phase-9 review:\\n\\nL1: parse_key_spec accepts 'f01' as F(1); s[1..].parse::\u003cu8\u003e() reads leading zeros. Add strict-digits check.\\n\\nL2: match_shortcut does exact modifier equality. ctrl-x binding doesn't match Ctrl+Shift+X. Documented behavior in PLUGINS.md so plugin authors know to bind shift- explicitly when wanted.\\n\\nL3: no unregister-* counterparts. Pi has unregisterProvider. Defer unless a plugin author asks; pi's symmetry is also partial.\\n\\nL4: smoke test depends on plugins/example_*.janet disk state. Convention matches existing test_plugin.janet; document as load-bearing.\\n\\nL5: harness/register-tool doesn't validate name charset. LLM tool-call mechanism may break on names with spaces or special chars. Add regex match [a-zA-Z0-9_-]+ in the Janet helper.","status":"closed","priority":3,"issue_type":"task","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T01:10:15Z","created_by":"Yogthos","updated_at":"2026-05-23T01:38:24Z","started_at":"2026-05-23T01:36:09Z","closed_at":"2026-05-23T01:38:24Z","close_reason":"Closed","dependencies":[{"issue_id":"dirge-3s1","depends_on_id":"dirge-0iy","type":"blocks","created_at":"2026-05-22T21:10:23Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} |
62 | 65 | {"_type":"issue","id":"dirge-hjz","title":"H2/M1/M2: handler arg expansion (tool_call_id, display flag, dynamic shortcut refresh)","description":"Three gap-fillers, batched because they share the harness-API expansion theme.\\n\\nH2: JanetLoopTool::execute discards tool_call_id and on_update. Pi forwards both (toolCallId for LLM correlation, onUpdate for streaming progress). Add tool-call-id as second handler arg; expose (harness/emit-tool-progress text) helper bridged via thread-local to on_update.\\n\\nM1: Pi CustomMessage has display: boolean (messages.ts:50) — when false the message is in transcript but not rendered. Dirge always renders. Add display to the wrapper (lands with C1's customType change).\\n\\nM2: plugin_shortcuts snapshotted once at UI startup. Pi rebuilds the shortcut map on demand (interactive-mode.ts:1625, 5324). Re-snapshot when a new registration happens (or on each keystroke — cost is one Janet eval).","status":"closed","priority":3,"issue_type":"feature","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T01:10:14Z","created_by":"Yogthos","updated_at":"2026-05-23T01:36:08Z","started_at":"2026-05-23T01:30:49Z","closed_at":"2026-05-23T01:36:08Z","close_reason":"Closed","dependencies":[{"issue_id":"dirge-hjz","depends_on_id":"dirge-0iy","type":"blocks","created_at":"2026-05-22T21:10:22Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":1,"dependent_count":0,"comment_count":0} |
63 | 66 | {"_type":"issue","id":"dirge-btb","title":"9e: docs + integration test + plugin example for phase 9","description":"Update docs/plugins.md (or create if missing) covering the new ExtensionApi surface. Add an end-to-end integration test that loads a Janet plugin which registers all 5 things (tool, command, provider, shortcut, message-renderer) and verifies each path. Add an example plugin under examples/ or test fixtures.","status":"closed","priority":3,"issue_type":"task","assignee":"Yogthos","owner":"yogthos@gmail.com","created_at":"2026-05-23T00:19:25Z","created_by":"Yogthos","updated_at":"2026-05-23T00:48:59Z","started_at":"2026-05-23T00:43:45Z","closed_at":"2026-05-23T00:48:59Z","close_reason":"9b deferred separately; 9a/9c/9d complete with docs + examples + smoke test","dependencies":[{"issue_id":"dirge-btb","depends_on_id":"dirge-gfs","type":"blocks","created_at":"2026-05-22T20:19:32Z","created_by":"Yogthos","metadata":"{}"},{"issue_id":"dirge-btb","depends_on_id":"dirge-l95","type":"blocks","created_at":"2026-05-22T20:19:33Z","created_by":"Yogthos","metadata":"{}"},{"issue_id":"dirge-btb","depends_on_id":"dirge-sw8","type":"blocks","created_at":"2026-05-22T20:19:32Z","created_by":"Yogthos","metadata":"{}"}],"dependency_count":3,"dependent_count":0,"comment_count":0} |
|
0 commit comments