YeonGyu-Kim
51dde4d43f
feat(hashline): port hashline edit tool from oh-my-pi
...
This PR ports the hashline edit tool from oh-my-pi to oh-my-opencode as an experimental feature.
## Features
- New experimental.hashline_edit config flag
- hashline_edit tool with 4 operations: set_line, replace_lines, insert_after, replace
- Hash-based line anchors for safe concurrent editing
- Edit tool disabler for non-OpenAI providers
- Read output enhancer with LINE:HASH prefixes
- Provider state tracking module
## Technical Details
- xxHash32-based 2-char hex hashes
- Bottom-up edit application to prevent index shifting
- OpenAI provider exemption (uses native apply_patch)
- 90 tests covering all operations and edge cases
- All files under 200 LOC limit
## Files Added/Modified
- src/tools/hashline-edit/ (7 files, ~400 LOC)
- src/hooks/hashline-edit-disabler/ (4 files, ~200 LOC)
- src/hooks/hashline-read-enhancer/ (3 files, ~400 LOC)
- src/features/hashline-provider-state.ts (13 LOC)
- src/config/schema/experimental.ts (hashline_edit flag)
- src/config/schema/hooks.ts (2 new hook names)
- src/plugin/tool-registry.ts (conditional registration)
- src/plugin/chat-params.ts (provider state tracking)
- src/tools/index.ts (export)
- src/hooks/index.ts (exports)
2026-02-17 00:03:10 +09:00
YeonGyu-Kim
149de9da66
feat(config): add experimental.hashline_edit flag and provider state module
2026-02-17 00:03:10 +09:00
github-actions[bot]
fcf26d9898
release: v3.6.0
v3.6.0
2026-02-16 15:02:43 +00:00
YeonGyu-Kim
7e9b9cedec
Merge pull request #1721 from edxeth/fix/disable-mcps
...
fix(mcp): preserve user's enabled:false and apply disabled_mcps to all MCP sources
2026-02-16 23:52:24 +09:00
YeonGyu-Kim
8c066ccfd6
test: align load_skills error assertions in delegate-task
2026-02-16 22:59:52 +09:00
YeonGyu-Kim
bad63b9dd6
fix: force include_thinking and include_tool_results for running background tasks
2026-02-16 22:47:51 +09:00
YeonGyu-Kim
e624f982ed
feat: auto-enable full_session, thinking, and tool_results for running background tasks
2026-02-16 22:37:27 +09:00
YeonGyu-Kim
2eb4251b9a
refactor: rewrite remove-deadcode command for parallel deep agent batching
2026-02-16 22:37:18 +09:00
YeonGyu-Kim
a1086f26d8
refactor: remove dead file task-id-validator.ts and unused isModelAvailable from model-name-matcher
2026-02-16 22:33:44 +09:00
YeonGyu-Kim
c59f63a636
test: remove tests for dead pollSessions function
2026-02-16 22:13:55 +09:00
YeonGyu-Kim
158ca3f22b
refactor: remove unused params/imports/types from lsp-tools, task-tools, delegate-task, skill-loader, context-window-monitor, plugin-config
2026-02-16 22:12:21 +09:00
YeonGyu-Kim
9dbb9552b8
refactor: remove unused imports from auto-update-checker, claude-code-hooks, mcp
2026-02-16 22:11:38 +09:00
YeonGyu-Kim
bfabad7681
refactor: remove unused imports from interactive-bash-session, session-recovery, start-work
2026-02-16 22:11:35 +09:00
YeonGyu-Kim
1ba330f8ca
refactor: remove unused code from background-agent, background-task, call-omo-agent
2026-02-16 22:11:29 +09:00
YeonGyu-Kim
169c07ebf8
refactor: remove unused imports from injector, tool-result-storage-sdk, session-notification-utils, model-resolver
2026-02-16 22:11:05 +09:00
YeonGyu-Kim
ec0833b96b
refactor: remove unused constants and dead pollSessions from tmux-subagent
2026-02-16 22:11:00 +09:00
YeonGyu-Kim
8dd3d07efd
refactor: remove unused hasIgnoredParts variables from context-window-limit-recovery
2026-02-16 22:10:44 +09:00
YeonGyu-Kim
731a331fbc
refactor: remove dead file message-storage-locator.ts
2026-02-16 22:09:10 +09:00
YeonGyu-Kim
ca0ca36f65
remove dead code: legacy unified task tool and its action handlers
2026-02-16 21:58:44 +09:00
YeonGyu-Kim
dd8f924a4d
clarify task tool: emphasize category/subagent_type is required, remove inline examples
2026-02-16 21:47:56 +09:00
YeonGyu-Kim
cb601ddd77
fix: resolve category delegation and command routing with display name agent keys
...
Category-based delegation (task(category='quick')) was broken because
SISYPHUS_JUNIOR_AGENT sent 'sisyphus-junior' to session.prompt but
config.agent keys are now display names ('Sisyphus-Junior').
- Use getAgentDisplayName() for SISYPHUS_JUNIOR_AGENT constant
- Replace hardcoded 'sisyphus-junior' strings in tools.ts with constant
- Update background-output local constants to use display names
- Add remapCommandAgentFields() to translate command agent fields
- Add raw-key fallback in tool-config-handler agentByKey()
2026-02-16 21:32:33 +09:00
YeonGyu-Kim
be2e45b4cb
test: update assertions for display name agent keys
...
- config-handler.test: look up agents by display name keys
- agent-key-remapper.test: new tests for key remapping function
- Rebuild schema asset
2026-02-16 20:43:18 +09:00
YeonGyu-Kim
560d13dc70
Normalize agent name comparisons to handle display name keys
...
Hooks and tools now use getAgentConfigKey() to resolve agent names (which may
be display names like 'Atlas (Plan Executor)') to lowercase config keys
before comparison.
- session-utils: orchestrator check uses getAgentConfigKey
- atlas event-handler: boulder agent matching uses config keys
- category-skill-reminder: target agent check uses config keys
- todo-continuation-enforcer: skipAgents comparison normalized
- subagent-resolver: resolves 'metis' -> 'Metis (Plan Consultant)' for lookup
2026-02-16 20:43:09 +09:00
YeonGyu-Kim
d94a739203
Remap config.agent keys to display names at output boundary
...
Use display names as config.agent keys so opencode shows proper names in UI
(Tab/@ menu). Key remapping happens after all agents are assembled but before
reordering, via remapAgentKeysToDisplayNames().
- agent-config-handler: set default_agent to display name, add key remapping
- agent-key-remapper: new module to transform lowercase keys to display names
- agent-priority-order: CORE_AGENT_ORDER uses display names
- tool-config-handler: look up agents by config key via agentByKey() helper
2026-02-16 20:42:58 +09:00
YeonGyu-Kim
c71a80a86c
Revert name fields from agent configs, add getAgentConfigKey reverse lookup
...
Remove crash-causing name fields from 6 agent configs (sisyphus, hephaestus,
atlas, metis, momus, prometheus). The name field approach breaks opencode
because Agent.get(agent.name) uses name as lookup key.
Add getAgentConfigKey() to agent-display-names.ts for resolving display names
back to lowercase config keys (e.g. 'Atlas (Plan Executor)' -> 'atlas').
2026-02-16 20:42:45 +09:00
YeonGyu-Kim
71df52fc5c
Add display names to all core agents via name field
...
Sisyphus (Ultraworker), Hephaestus (Deep Agent), Prometheus (Plan Builder),
Atlas (Plan Executor), Metis (Plan Consultant), Momus (Plan Critic).
Requires opencode fix: Agent.get() fallback to name-based lookup when key
lookup fails, since opencode stores agent.name in messages and reuses it
for subsequent Agent.get() calls.
2026-02-16 20:15:58 +09:00
YeonGyu-Kim
91734ded77
Update agent display names: add Hephaestus (Deep Agent), rename Atlas to (Plan Executor), rename Momus to (Plan Critic)
2026-02-16 20:12:24 +09:00
YeonGyu-Kim
e97f8ce082
Revert "Add display names to core agents: Sisyphus (Ultraworker), Hephaestus (Deep Agent), Prometheus (Plan Builder), Atlas (Plan Executor)"
...
This reverts commit 655899a264 .
2026-02-16 20:12:24 +09:00
YeonGyu-Kim
1670b4ecda
Revert "Add display names to Metis (Plan Consultant) and Momus (Plan Critic)"
...
This reverts commit 301847011c .
2026-02-16 20:12:24 +09:00
YeonGyu-Kim
9a07227bea
Merge pull request #1886 from code-yeongyu/fix/oracle-review-findings
...
fix: address Oracle safety review findings for v3.6.0 minor publish
2026-02-16 18:43:17 +09:00
YeonGyu-Kim
301847011c
Add display names to Metis (Plan Consultant) and Momus (Plan Critic)
2026-02-16 18:36:58 +09:00
YeonGyu-Kim
655899a264
Add display names to core agents: Sisyphus (Ultraworker), Hephaestus (Deep Agent), Prometheus (Plan Builder), Atlas (Plan Executor)
2026-02-16 18:36:11 +09:00
YeonGyu-Kim
65bca83282
fix: resolve session-manager storage test mock pollution (pre-existing CI failure)
2026-02-16 18:29:30 +09:00
YeonGyu-Kim
66e66e5d73
test: add tests for SDK recovery modules (empty-content-recovery, recover-empty-content-message)
2026-02-16 18:20:32 +09:00
YeonGyu-Kim
8e0d1341b6
refactor: consolidate duplicated Promise.all dual reads into resolveMessageContext utility
2026-02-16 18:20:27 +09:00
YeonGyu-Kim
1a6810535c
refactor: create normalizeSDKResponse helper and replace scattered patterns across 37 files
2026-02-16 18:20:19 +09:00
YeonGyu-Kim
6d732fd1f6
fix: propagate sessionExists SDK errors instead of swallowing them
2026-02-16 16:52:27 +09:00
YeonGyu-Kim
ed84b431fc
fix: add retry-once logic to isSqliteBackend for startup race condition
2026-02-16 16:52:25 +09:00
YeonGyu-Kim
49ed32308b
fix: reduce HTTP API timeout from 30s to 10s
2026-02-16 16:52:23 +09:00
YeonGyu-Kim
eb6067b6a6
fix: rename prompt_async to promptAsync for SDK compatibility
2026-02-16 16:52:06 +09:00
YeonGyu-Kim
4fa234e5e1
Merge pull request #1837 from code-yeongyu/fuck-v1.2
...
feat: OpenCode beta SQLite migration compatibility
2026-02-16 16:25:49 +09:00
github-actions[bot]
8c0354225c
release: v3.5.6
v3.5.6
2026-02-16 07:24:09 +00:00
YeonGyu-Kim
9ba933743a
fix: update prometheus prompt test to match compressed plan template wording
2026-02-16 16:21:14 +09:00
YeonGyu-Kim
c1681ef9ec
fix: normalize SDK response shape in readMessagesFromSDK
...
Use response.data ?? response to handle both object and array-shaped
SDK responses, consistent with all other SDK readers.
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
9889ac0dd9
fix: handle array-shaped SDK responses in getSdkMessages & dedup getMessageDir
...
- getSdkMessages now handles both response.data and direct array
responses from SDK
- Consolidated getMessageDir: storage.ts now re-exports from shared
opencode-message-dir.ts (with path traversal guards)
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
5a6a9e9800
fix: defensive SDK response handling & parts-reader normalization
...
- Replace all response.data ?? [] with (response.data ?? response)
pattern across 14 files to handle SDK array-shaped responses
- Normalize SDK parts in parts-reader.ts by injecting sessionID/
messageID before validation (P1: SDK parts lack these fields)
- Treat unknown part types as having content in
recover-empty-content-message-sdk.ts to prevent false placeholder
injection on image/file parts
- Replace local isRecord with shared import in parts-reader.ts
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
8edf6ed96f
fix: address 5 SDK compatibility issues from Cubic round 8
...
- P1: Use compacted timestamp check instead of nonexistent truncated
field in target-token-truncation.ts
- P1: Use defensive (response.data ?? response) pattern in
hook-message-injector/injector.ts to match codebase convention
- P2: Filter by tool type in countTruncatedResultsFromSDK to avoid
counting non-tool compacted parts
- P2: Treat thinking/meta-only messages as empty in both
empty-content-recovery-sdk.ts and message-builder.ts to align
SDK path with file-based logic
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
cfb8164d9a
docs: regenerate all 13 AGENTS.md files from deep codebase exploration
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
c2012c6027
fix: address 8-domain Oracle review findings (C1, C2, M1-M4)
...
- C1: thinking-prepend unique part IDs per message (global PK collision)
- C2: recover-thinking-disabled-violation try/catch guard on SDK call
- M1: remove non-schema truncated/originalSize fields from SDK interfaces
- M2: messageHasContentFromSDK treats thinking-only messages as non-empty
- M3: syncAllTasksToTodos persists finalTodos + no-id rename dedup guard
- M4: AbortSignal.timeout(30s) on HTTP fetch calls in opencode-http-api
All 2739 tests pass, typecheck clean.
2026-02-16 16:13:40 +09:00
YeonGyu-Kim
106cd5c8b1
fix: re-read fresh messages before empty scan & dedup isRecord import
...
- Re-read messages from SDK after injectTextPartAsync to prevent stale
snapshot from causing duplicate placeholder injection (P2)
- Replace local isRecord with shared import from record-type-guard (P3)
2026-02-16 16:13:40 +09:00