Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
2a12726
feat(room): add the secure room core: registry, shelf and coordinator
zonblade Nov 12, 2026
d027764
feat(room): add the lane foundations: inbox, control channel and digest
zonblade Nov 12, 2026
180a4d0
feat(room): add the lane runner, cloned from the sub-agent loop
zonblade Nov 12, 2026
68a1e29
feat(room): add the reconciler that syncs lanes and wakes the Chief
zonblade Nov 12, 2026
d259311
feat(room): dispatch reviews, return feedback and hand findings to th…
zonblade Nov 12, 2026
211e1d1
feat(room): add the clerk: deterministic audit and a Chief-only flag …
zonblade Nov 12, 2026
4b917d0
feat(room): add the trajectory projection and `koma room trajectory`
zonblade Nov 12, 2026
703a27b
feat(room): add the swim-lane timeline and the status-menu classify list
zonblade Nov 12, 2026
a19bb95
feat(room): add the room actor and its tool router
zonblade Nov 12, 2026
3df0c7a
feat(room): add the real model and tool seams over the daemon runtime
zonblade Nov 12, 2026
e06df1f
feat(room): assemble a room from a session directory with a ticker
zonblade Nov 12, 2026
9e6ae5e
feat(room): run the secure daemon kind
zonblade Nov 12, 2026
6957ef7
feat(room): persist wake and visible nonces
zonblade Nov 12, 2026
d780633
feat(room): add room IPC and headless attach
zonblade Nov 12, 2026
7cb0367
feat(room): hand /security to the secure room UI
zonblade Nov 12, 2026
db45b81
feat(room): remove the old security backend
zonblade Nov 12, 2026
c9d052e
feat(room): give each specialist a chat lane
zonblade Nov 12, 2026
05340bc
feat(room): resolve a lane from its own provider
zonblade Nov 12, 2026
cd32855
feat(room): flag claims that lack evidence or disagree
zonblade Nov 12, 2026
a15472a
fix(room): type the room socket data callback so tsc passes
zonblade Nov 12, 2026
df89b28
fix(room): bound the fired-nonce set in memory and room.sqlite
zonblade Nov 12, 2026
e3291a0
fix(room): replay missed room output to a client that attaches
zonblade Nov 12, 2026
bd046cc
docs(ext): drop the comment that names the removed security manager
zonblade Nov 12, 2026
9a47109
fix(term): keep the hook order when /security opens the room
zonblade Nov 12, 2026
fa64c78
refactor(room): tie fired nonces to their work instead of capping a set
zonblade Nov 12, 2026
37d60fe
feat(term): draw the secure room in koma's chat style
zonblade Nov 12, 2026
49ac232
feat(term): autocomplete @people and /commands in the secure room
zonblade Nov 12, 2026
0199e39
feat(term): /status, /shelf and /trajectory open full screen in the s…
zonblade Nov 12, 2026
2363995
feat(room): /model picks the model of each minion's lane
zonblade Nov 12, 2026
8efab39
feat(term): Ctrl+C in the secure room asks to quit to chat
zonblade Nov 12, 2026
9ae3de4
feat(room): lanes keep their conversation and every lane gets the hos…
zonblade Nov 12, 2026
5307b2a
feat(room): !cmd runs a shell command in the room without the model
zonblade Nov 12, 2026
0b67aa6
feat(room): DRSS and message_find on every lane
zonblade Nov 12, 2026
e01053d
feat(room): lanes stream thinking, tool calls and tool results
zonblade Nov 12, 2026
c0c1851
feat(term): the room draws turns like the coding chat
zonblade Nov 12, 2026
48686ca
feat(term): the room composer and slash popup match the coding chat
zonblade Nov 12, 2026
d73df15
feat(room): status carries the roster, lane details and timestamped e…
zonblade Nov 12, 2026
0dddfd5
feat(term): /status is a lane table, a gates panel and a readable tim…
zonblade Nov 12, 2026
ce8001f
feat(room): text and thinking stream live from the provider
zonblade Nov 12, 2026
d21f58c
feat(term): the room shows text and thinking as they stream
zonblade Nov 12, 2026
ecbe120
feat(room): lanes run background jobs, cd, a checklist and the rest o…
zonblade Nov 12, 2026
7eb6c82
feat(room): a specialist's chat lane speaks in a friendlier register
zonblade Nov 12, 2026
a95a81c
feat(room): lanes can look at an image the user points at
zonblade Nov 12, 2026
8cee2ec
feat(room): paste and clipboard images work like the chat, and every …
zonblade Nov 12, 2026
151a701
fix(room): send each tool once so the provider stops answering 400, a…
zonblade Nov 12, 2026
ef0d3b1
feat(room): real shelf schemas, stop (Esc, /stop, room_stop), a think…
zonblade Nov 12, 2026
4add64a
fix(term): keep one blank row under the room's status strip
zonblade Nov 12, 2026
fb38eb2
chore: add banner image, news export and generated docs page types
zonblade Nov 12, 2026
863f49f
fix(room): keep a message typed while the daemon starts, remember the…
zonblade Nov 12, 2026
a2397f3
feat(room): the Chief coordinates and delegates verification and repo…
zonblade Nov 12, 2026
5245f50
feat(room): shelf, trajectory and report screens as collapsible trees…
zonblade Nov 12, 2026
0b8ec1b
feat(room): Lab Red Web and API, Researcher, RE and Builder, and a st…
zonblade Nov 12, 2026
c87e8b2
feat(room): Lab Blue, and web_fetch and web_search on every minion
zonblade Nov 12, 2026
dcf72eb
feat(room): no git_operator or web_download in the secure room
zonblade Nov 12, 2026
84fb918
fix(room): record every lane's model spend in the usage ledger
zonblade Nov 12, 2026
da83b77
feat(room): the trajectory is a numbered tree with cross references, …
zonblade Nov 12, 2026
da8612e
fix(room): loading screen at once on enter and leave, and keep the ro…
zonblade Nov 13, 2026
58d91d2
feat(room): the Chief only manages; hands-on tools and work go to the…
zonblade Nov 13, 2026
1fa7117
fix(room): a trajectory node's detail shows the content of its shelf …
zonblade Nov 13, 2026
857f78e
fix(room): detail screens scroll with page keys, home and end
zonblade Nov 13, 2026
1a34d36
feat(room): detail screens are a two-column table, a fifth for the na…
zonblade Nov 13, 2026
ad9edb9
feat(room): raw JSON in room text and delegation cards is set out as …
zonblade Nov 13, 2026
bca0fe6
fix(room): a reviewer's evidence no longer rewrites the claim under r…
zonblade Nov 13, 2026
12ee1cc
feat(room): the reviewer hands over to the reporter, and the clerk fl…
zonblade Nov 13, 2026
2fcf7d3
feat(room): a background proof check on claims, per-goal spend and ru…
zonblade Nov 13, 2026
c478ed6
fix(room): the strip under the composer is just short tags in state c…
zonblade Nov 13, 2026
81bf17b
fix(room): bring back the marks in the strip under the composer; only…
zonblade Nov 13, 2026
9ce83ac
feat(tools): secure_shelf, a read-only tool that lets the coding agen…
zonblade Nov 13, 2026
a03dd68
feat(room): a quick second Esc clears the composer; one Esc still int…
zonblade Nov 13, 2026
51fd7ed
feat(room): the room is its own daemon that keeps running after /leav…
zonblade Nov 13, 2026
ae0aaff
feat(room): the trajectory graph is a compact vertical tree, one box …
zonblade Nov 13, 2026
e13b64e
feat(room): the trajectory graph is a layered diagram again, narrower…
zonblade Nov 13, 2026
6ebe7c4
fix(room): goals that share a name no longer highlight together or op…
zonblade Nov 13, 2026
27aa6ab
feat(room): the trajectory graph runs top to bottom with narrower thr…
zonblade Nov 13, 2026
145a8e9
feat(room): the trajectory graph runs left to right, depth across and…
zonblade Nov 13, 2026
8a89dea
feat(room): /leave is designed like /stop, with two options in the po…
zonblade Nov 13, 2026
95844d3
fix(ci): the nix flake no longer lists the removed src-security, and …
zonblade Nov 13, 2026
ad29bee
ci: drop the koma-safety Docker image jobs and scripts, and add a sec…
zonblade Nov 13, 2026
0f22764
fix(room): /stop settles the assignment it stops, crossing graph link…
zonblade Nov 13, 2026
5b4655c
fix(room): saving a lane's model retries the rename when Windows hold…
zonblade Nov 13, 2026
407b951
fix(room): on Windows a lane's model is written in place, and a faile…
zonblade Nov 13, 2026
11ef452
test(room): the wire bench keeps the room's files in a real temp dire…
zonblade Nov 13, 2026
3d8a33b
feat(room): each specialist lane carries its own field method, so a p…
zonblade Nov 13, 2026
e7ba80f
feat(skill): a word-match search over name, description, triggers and…
zonblade Nov 13, 2026
7f82553
feat(skill): skill_find, skill_load, skill_unload, skill_create and s…
zonblade Nov 13, 2026
dad3da6
chore(skill): drop the unused catalogue text, tidy for clippy
zonblade Nov 13, 2026
6e62936
feat(skill): skill_find asks the Main model to order close matches, a…
zonblade Nov 13, 2026
f63f389
feat(room): every lane but the clerk finds, loads and unloads skills,…
zonblade Nov 13, 2026
b261363
feat(skill): the skill tools show their request in the transcript, sk…
zonblade Nov 13, 2026
b95913d
docs(skill): the agent finds skills by asking, and the classifier rul…
zonblade Nov 13, 2026
a1d3105
test(skill): the prompt stays the same size at a thousand skills, and…
zonblade Nov 13, 2026
eda4040
Merge pull request #297 from aula-id/feat/skill-find
zonblade Nov 13, 2026
9bf5091
feat(room): /screen picks what the room shows, combine, split, user o…
zonblade Nov 13, 2026
abf254b
test(term): the sweep label test waits for the timers instead of slee…
zonblade Nov 13, 2026
ab287c3
test(term): the folder guide test waits for the listing instead of sl…
zonblade Nov 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
9 changes: 9 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,15 @@ jobs:
cargo build -p agent --no-default-features
python src-term/scripts/verify-setup-exit.py

# The secure room is its own daemon (`--kind secure`): bind, accept, one client
# round trip and the clean exit, over the same native IPC the chat uses.
- name: Secure room daemon self-test
shell: bash
run: |
exe=./target/debug/koma
[ "$RUNNER_OS" = "Windows" ] && exe=./target/debug/koma.exe
"$exe" --daemon --kind secure --daemon-selftest

- name: Native Windows SSH password helper
if: runner.os == 'Windows'
run: ./target/debug/koma.exe --ssh-askpass-self-test
Expand Down
78 changes: 2 additions & 76 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ jobs:
publish:
# build -> check -> publish. Source tests belong to ci.yml and ran on the
# PR; this pipeline only checks the binaries it built (verify, and the MSI
# checks inside windows-package). Guest images build after this, tier by tier.
# checks inside windows-package).
if: >-
${{ !cancelled() && startsWith(github.ref, 'refs/tags/v')
&& needs.build.result == 'success'
Expand All @@ -300,8 +300,7 @@ jobs:
contents: write
steps:
- uses: actions/checkout@v4
# Named downloads only. A bare download also pulls the Docker build
# record, and that blob failed after five retries on v0.4.9.
# Named downloads only, so each asset is fetched by its own artifact name.
- uses: actions/download-artifact@v4
with:
name: koma-linux-x64
Expand Down Expand Up @@ -385,76 +384,3 @@ jobs:
mkdir published
curl -fsSL --retry 5 --retry-delay 10 "$base/koma-linux-x64" -o published/koma-linux-x64
(cd published && grep ' koma-linux-x64$' ../published-sums | sha256sum --check --strict -)

# Guest images (only on v*-security tags). They start after the binaries are
# published and run one tier at a time, so a release never has 30 builds at
# once. A failed tier does not stop the next; each build reports on its own.
safety-matrix:
name: plan koma-safety images
if: startsWith(github.ref, 'refs/tags/v') && contains(github.ref_name, '-security')
runs-on: ubuntu-22.04
outputs:
core: ${{ steps.plan.outputs.core }}
ext: ${{ steps.plan.outputs.ext }}
src: ${{ steps.plan.outputs.src }}
steps:
- uses: actions/checkout@v4
- name: One image per composition in compositions.json
id: plan
# Every composition the /security panel lists gets an image, so no row
# offers a pull that cannot succeed. Bare :version / :latest is minimal.
# core: minimal + the 8 base domains. ext: npm/cargo shards, recon-2, lab.
# src: from-source shards, the slowest builds.
run: |
python3 - <<'PY' >> "$GITHUB_OUTPUT"
import json
comps = json.load(open("src-security/install_recipes/buckets/compositions.json"))
base = {"kali": "kalilinux/kali-rolling"}
core_ids = {"minimal", "recon", "web", "identity", "cloud", "rev", "crypto", "pxn", "dfir"}
tiers = {"core": [{"composition": "minimal", "tag_suffix": "", "base_image": "python:3.11-slim-bookworm"}], "ext": [], "src": []}
for c in comps:
tier = "core" if c["id"] in core_ids else "src" if c["id"].endswith("-src") else "ext"
tiers[tier].append({
"composition": c["id"],
"tag_suffix": f"-{c['id']}",
"base_image": base.get(c.get("base_hint"), "python:3.11-slim-bookworm"),
})
for name, rows in tiers.items():
print(f"{name}={json.dumps(rows)}")
PY

images-core:
name: images (core)
needs: [safety-matrix, publish]
if: ${{ !cancelled() && needs.safety-matrix.result == 'success' }}
permissions:
contents: read
packages: write
uses: ./.github/workflows/safety-image.yml
with:
include: ${{ needs.safety-matrix.outputs.core }}
max-parallel: 5

images-ext:
name: images (ext)
needs: [safety-matrix, images-core]
if: ${{ !cancelled() && needs.safety-matrix.result == 'success' }}
permissions:
contents: read
packages: write
uses: ./.github/workflows/safety-image.yml
with:
include: ${{ needs.safety-matrix.outputs.ext }}
max-parallel: 4

images-src:
name: images (src)
needs: [safety-matrix, images-ext]
if: ${{ !cancelled() && needs.safety-matrix.result == 'success' }}
permissions:
contents: read
packages: write
uses: ./.github/workflows/safety-image.yml
with:
include: ${{ needs.safety-matrix.outputs.src }}
max-parallel: 3
97 changes: 0 additions & 97 deletions .github/workflows/safety-image.yml

This file was deleted.

1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Binary file added assets/banner.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion docs/ARCH_TUI_DAEMON.md
Original file line number Diff line number Diff line change
Expand Up @@ -431,7 +431,7 @@ trait Tool: Send + Sync {

Built-in tools (see `tool/mod.rs` `all_tools()` for the full list): filesystem
(read/write/edit/delete/list), search (grep/glob), shell (bash/output/kill as
jobs), memory, skill, history, internet/browser, git, planning + SDLC, task
jobs), memory, skills (skill_find/load/unload/create/modify), history, internet/browser, git, planning + SDLC, task
delegation, graph_query, cd, seqthink, and misc (pong/todo).

### Tool execution lanes
Expand Down
3 changes: 1 addition & 2 deletions flake.nix
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@

# `koma-extension` (src-extension) is excluded from the cargo workspace but is
# a path dependency of `agent`, so it must ship in the build sandbox. `src-misc`,
# `src-internet`, `src-security` and `models.json` are pulled in unconditionally
# `src-internet` and `models.json` are pulled in unconditionally
# at compile time via `include_dir!`/`include_str!`, independent of any feature flag.
# `assets/` is embedded by `include_bytes!` in launcher.rs (PNG sizes and icon.icns).
commonFileset = lib.fileset.unions [
Expand All @@ -34,7 +34,6 @@
./src-extension
./src-misc
./src-internet
./src-security
];

commonSrc = lib.fileset.toSource {
Expand Down
Binary file added news-export/f16-headbutt-maneuver.docx
Binary file not shown.
37 changes: 37 additions & 0 deletions news-export/f16-headbutt-maneuver.tex
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
\documentclass[11pt]{article}
\usepackage[margin=1in]{geometry}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{hyperref}
\usepackage{parskip}

\title{F-16 Uses ``Headbutt Maneuver'' to Intercept Plane near Mar-a-Lago}
\author{Emily Mae Czachor, Yahoo News}
\date{Updated Monday, 26 October 2026, 10:07 PM GMT+9}

\begin{document}
\maketitle

\noindent Source: \url{https://www.yahoo.com/news/us/articles/f-16-uses-headbutt-maneuver-130709283.html}

\noindent Section: US. Two-minute read. Brief paraphrased from the Yahoo News article, not a reprint.

\section*{What happened}

On Saturday, a NORAD F-16 intercepted a civilian aircraft that had entered restricted airspace near President Trump's Mar-a-Lago resort in Palm Beach, Florida. U.S. military officials said the intercept happened at about 12:20 p.m.\ ET. Trump was in West Palm Beach that day to vote in Florida's midterm election.

The jet flew close in front of the civilian plane to get the pilot's attention. NORAD calls that standard tactic a ``headbutt maneuver.'' It worked: the crews made contact, and the pilot left the restricted airspace as instructed.

The plane had violated a Temporary Flight Restriction over the area. NORAD said the pilot could also be met by federal authorities on landing and face enforcement action.

\section*{Why the airspace was closed}

The FAA issues temporary flight restrictions for sporting events, severe weather, rallies, and other gatherings involving high-profile officials, especially the president. Pilots are expected to check Notices to Airmen (NOTAMs) for the current limits.

\section*{The day's political context}

Trump and First Lady Melania Trump were seen Saturday afternoon at a West Palm Beach polling station, where he cast an early ballot ahead of the following week's midterms. Asked if he voted along party lines, he said, ``Very much so.'' He then left for a campaign rally in Georgia.

His midterm rallies have been triggering similar restrictions. Earlier this month, NORAD F-16s intercepted a plane over Clemson, South Carolina, during a rally for Darline Graham's Senate campaign. Days before that, the command reported a similar intercept over Cincinnati, Ohio, near another rally he attended.

\end{document}
Loading
Loading