Commit Graph
31 Commits
Author SHA1 Message Date
KeelrLeek 9c74b17943 CLI: --as <Agent> from a second session's worktree of the same app runs as that session (Codex2 copies the Codex app's shared --as Codex instructions) 2026-10-06 10:59:09 -05:00
KeelrLeek fdaa3b0806 Shared app servers: the PreToolUse hook leaves a ticket naming the calling session, the MCP server takes it per call (middleware), so two sessions of one app on one Harbor server act as themselves; i_am checks instead of binding and is allowed under a stop 2026-10-06 10:47:08 -05:00
KeelrLeek e283e4cc54 Several sessions of one app: a session's working folder names its agent when that agent runs in the same app (MCP server and hooks), an i_am tool binds a session explicitly, the doctor checks second sessions against their app's install, and an agent that left the roster can still be uninstalled 2026-10-06 10:06:01 -05:00
KeelrLeek d755ab8a76 Resuming one agent under a later 'stop everyone' works even when its own flag is already off: the human's resume records its time 2026-10-06 09:25:32 -05:00
KeelrLeek 440f148c87 watch.py: --ignore AGENT,... skips stalls already reported 2026-10-06 01:44:56 -05:00
KeelrLeek 2fb62fa105 watch.py: --quiet-traffic wakes only on stalls, stops and resting (helpers cover items and messages) 2026-10-05 19:05:47 -05:00
KeelrLeek 774b0ae25a Logbook auto: run the stats rebuild in its own data dir so agents' compiles can't lock it 2026-10-05 18:37:26 -05:00
KeelrLeek 580fcfacb4 Chat: render a bounded window and append new messages instead of rebuilding the log; polls back off while hidden
Opening the chat froze the machine: the log rendered all ~800 loaded messages (1.1 M characters, ~10,000 nodes,
a 440,000 px column) and rebuilt the whole log on every new message, receipt change and mark refresh - about
1.8 s of blocked main thread each time. Now:
- the log keeps the newest 150 rows; "Load earlier" adds 150 more (from memory, then the server) and keeps the
  reader's place; switching person or thread starts again at 150
- new messages are appended; a changed receipt, pin, correction or answer repaints only its row
- off-screen rows skip layout and paint (content-visibility); the Intl date formatters are made once
- polls go through every(): no overlapping requests; while the tab is hidden messages poll every 10 s (sound and
  notifications still work), people every 60 s, the overview every 30 s, and the marks refresh and board panels pause
- removed the backdrop-filter blurs on the sidebar, top bar and composer, and the live dot's endless box-shadow
  animation (now opacity)

Measured: forced full render 1,600-1,850 ms -> 16-21 ms (hidden pane, render + layout); load long task 1,806 ms -> 56 ms;
DOM 13,318 -> 5,282 nodes (log 9,870 -> 1,806); a new message appends 2 nodes with no long task; hidden-tab traffic
~37 requests / ~2 MB per 30 s -> 4 requests / 156 KB.
2026-10-05 18:35:39 -05:00
KeelrLeek 9eee1294e0 Logbook auto: keep the empty body field of a commit with no description 2026-10-05 18:30:01 -05:00
KeelrLeek f1241c19a3 Inbox: people before system notices and newest first; wait wakes on new or human messages, not an old notice backlog; mark_read MCP tool
DeepSeek's inbox was buried under 78 automatic baseline notices read oldest
first, so it missed direct answers.
2026-10-05 18:19:19 -05:00
KeelrLeek f708e3025c tools/watch_needs.py: wake the coordinator when a helper appends to the needs file 2026-10-05 17:57:17 -05:00
KeelrLeek 453434c2b2 re_match_program: one whole-program build per worktree at a time (a lock file); concurrent runs collided 2026-10-05 17:29:36 -05:00
KeelrLeek 5211cee9c4 re_behaviour: the emulator check for given functions of a worktree 2026-10-05 16:54:58 -05:00
KeelrLeek 0d764799a7 Logbook: lead with '% done' (functions handled out of all 10,673), game functions decompiled, and unsorted; trend tracks done 2026-10-05 16:43:54 -05:00
KeelrLeek b7e09cfbd1 Logbook lives in Harbor and keeps itself current
The board's Logbook view replaces the published page: statistics, the chart
of the executable, where the code stands (with the function tiers), the
trend, milestones and the ship's log, stored as JSON in the Harbor home.
A server thread follows main: each new commit becomes a log entry and the
statistics, chart and trend point are rebuilt with the open-seas progress
tools on a scratch copy. 'harbor logbook add|stats|map|milestone|refresh'.
2026-10-05 16:30:21 -05:00
KeelrLeek 87631bec52 Board: Decomp view (progress tiers, function inspector, next up per band, deferred) and RE tools in Health; Verified tier from the emulator 2026-10-05 16:08:51 -05:00
KeelrLeek a9efc2e5c5 re_lookup shows the original source file (Xbox file/line sites) and the Mac build's original name 2026-10-05 15:16:04 -05:00
KeelrLeek 5a0fb44c7d re_match_program: the whole-program LTCG build and check; progress counts its exact matches 2026-10-05 15:11:21 -05:00
KeelrLeek d2c365d531 Queue: skip the compiler's at-exit destructor thunks (mov ecx, global; jmp dtor) 2026-10-05 14:46:31 -05:00
KeelrLeek 3f32d0eb3e Queue: also skip the compiler's import thunks and unwind funclets (0x6BAB3A-0x6BB9AC) 2026-10-05 14:34:03 -05:00
KeelrLeek 4da2eb93e3 Queue and progress treat the statically linked D3DX9 block and byte-matched library functions as library 2026-10-05 14:32:17 -05:00
KeelrLeek 7b03642f90 Agent protocol: next_functions, re_lookup convention, re_similar, re_match before submit, defer after two attempts 2026-10-05 13:49:06 -05:00
KeelrLeek 07a031109b re_similar, re_struct_audit; next_functions favours raw functions with a readable near-duplicate 2026-10-05 13:45:16 -05:00
KeelrLeek 2d2f5fe7c5 next_functions, defer and decomp_progress: an easy-first queue per band, deferrals with reasons, tiered progress 2026-10-05 13:39:03 -05:00
KeelrLeek ec210c019f re_lookup/re_disassemble show the calling convention read from the bytes 2026-10-05 13:34:33 -05:00
KeelrLeek c7e678eacb re_match: byte-match functions with the game's compiler (Visual C++ 2003)
Runs R:/Workspace/Tools/re/match71.py for up to 50 addresses from main or
an agent's worktree; configured by matcher/match_flags in [reverse].
2026-10-05 13:10:01 -05:00
KeelrLeek 584fabeb74 Per-agent x64dbg session through debugger()/debugger_tools()
Harbor starts the x64dbg-automate MCP server (stdio) on first use and keeps
it for the life of the agent's Harbor process; the debuggee is terminated
when that process exits. Configured by debugger_command/_path/_temp in
[reverse].
2026-10-05 12:44:25 -05:00
KeelrLeek 7ed914ebdb Forward ghidra()/ghidra_tools() to the shared read-only Ghidra MCP server
Every agent reaches GhidrAssistMCP through Harbor's own MCP server, so no
per-host configuration is needed. Configured by ghidra_url in [reverse];
long decompiles are polled; also 'harbor re ghidra <tool> <json>'.
2026-10-05 12:27:19 -05:00
KeelrLeek 3f6df88f95 Add shared reverse-engineering lookups (re_disassemble, re_xrefs, re_bytes, re_lookup)
Read the project's flat image, facts.jsonl and annotations with the team's
current names; exposed as MCP tools and as 'harbor re'. Configured by a
[reverse] table in the project file.
2026-10-05 11:16:56 -05:00
KeelrLeek dbc0c45ef2 Keep Kimi going at a stop with exit code 2
Kimi's agent-core reads a top-level {"decision": "block"} as allow, so
Harbor's keep-going never took effect for Kimi; it honours exit code 2
with the reason on stderr (its hooks run through cmd.exe), once per turn.
Tool-call denials keep the JSON form, which Kimi does honour.
Also: attention skips stopped agents and closed items; file scopes of
function files carry their address.
2026-10-05 10:53:32 -05:00
KeelrLeek dbfd1720c5 Harbor as of 2026-10-05: the coordination hub for the Open Sea's decomp team
Messages, threads, acknowledgements, claims, bands, tasks, review items and
stop flags for a team of AI agents; the chat page and board; host hooks and
MCP server; autopilot; tools/watch.py. Put under version control after the
weekend's changes so they have history and can be rolled back. Local only.
2026-10-05 10:44:23 -05:00