Skip to content

v0.3.0

Choose a tag to compare

@github-actions github-actions released this 05 Sep 06:39
· 22 commits to main since this release

Changelog

  • 0f8ef7f build(npm): ship a README in the main package; skip already-published versions
  • 1f375f3 build: installer wires niq into PATH automatically
  • ce76c4b build: move publish-npm.sh into npm/ and add make npm-publish target
  • aea4e6d build: release pipeline with goreleaser, npm platform packages, and install.sh
  • 30a520d chore(project): events dir is plural (events/), matching other dirs
  • a5bfc06 chore(reason): batch streaming deltas every 1s
  • a6ef8fa chore(reason): remove TODO.md
  • 0698a5f chore(webui): update dist entry html for the rebuilt assets
  • 870df70 chore(webui): update dist entry html for the rebuilt assets
  • 9310ed6 core/bus: define core protocol interfaces
  • 9abdfab core/event: add Recipients field for delivery tracking
  • 33ddf63 docs(bus): document the registry API's omitted-allow-list default
  • 0d600bd docs(reason): align ToolProvider comment with BuiltinTools (own call-and-answer tools)
  • 1c532f4 docs(reason): clarify BuiltinTools is the worker's own call-and-answer tools
  • 1dc2f06 docs(reason): don't reference future upstream workers from a dependency
  • a4a3140 docs(reason): drop 'conversation' from comments/descriptions
  • 7f4775d docs(reason): drop the 'shell' metaphor from comments
  • 31a7abe docs(reason): fix package/comments after BaseReasonWorker extraction
  • f159d47 docs(reason): fix stale comments after the refactor
  • 43ea7cc docs(reason): relocate and rewrite README/TODO; inline tool-result helpers
  • 96d07e6 docs(reason): replace 'domain-agnostic' with a defensible split
  • 74d5029 docs(reason): treat the three input modes as a spectrum, not a default
  • 5f406e7 feat(bus): enforce publish ACL with target restriction
  • aaeb149 feat(config): move providers & templates under the shared common dir
  • ff5302f feat(config): subscriptions support source-restricted patterns
  • 6f9dbe4 feat(control): fixed-port control plane with project start + SPA mode context
  • c396b55 feat(control,webui): create a new project from a template and start it
  • 165508d feat(control,webui): template management panel; running detects manual CLI starts
  • a7a62a4 feat(eventbus): multi-worker filter, target_worker_id, deterministic order
  • 6b27c2c feat(events): per-worker traffic role filter; recipients normalized to a table
  • 09a5b15 feat(llm): support provider.json and additional LLM APIs
  • de9863e feat(project): consolidate sqlite event files under an event/ dir
  • 42e3b17 feat(project): migrate legacy global swarm into a project
  • 4fdad3c feat(project): persisted ports are authoritative — kill any holder
  • 69f4bc2 feat(project): project definition store + project.json CLI
  • 6d6b475 feat(project): reclaim a stale process and check ports on start
  • ebec9fa feat(project): run a project instance with its own bus, ports and data dirs
  • 8bf1430 feat(provider): configured models list is authoritative over API discovery
  • ec7f221 feat(providercfg,reason): multi-model providers + runtime LLM provider switching
  • 642f9e1 feat(reason): align handleInput with all three input levels
  • 01f9231 feat(reason): append a completion note after context compaction
  • de2dd76 feat(reason): cap oversized transcript payloads at 20KB
  • 662e149 feat(reason): context builder — transcript projection, compaction, episodes, spawn seeding
  • 6c5f9ee feat(reason): expose the provider.* domain to the worker's own LLM
  • c27708a feat(reason): extract Compactor as a replaceable compression strategy
  • 2a5ed81 feat(reason): fall back to the full reply payload when a tool result has no recognized field
  • 476f56a feat(reason): get_worker_info — the detail view behind the slimmed list_workers
  • 31fbd1f feat(reason): meta ops as their own event types; unify responses on request.* + Event.RequestId
  • 2f2eed5 feat(reason): program.query/program.update meta-extensions with durable programs
  • a8eecb2 feat(reason): retire tool.request — tools become their own event types
  • a442980 feat(reason): self-synchronized transcript with edit-buffered Apply
  • f76c172 feat(reason): unify meta operations (compress/rotate) via worker.update
  • e110e2b feat(swarm): launch and supervise unmanaged (external) workers
  • 0c55c4e feat(swarm): print webui url to stdout and open it in the browser
  • 4a5a91a feat(swarm): wire the SQLite event store per project
  • 77311e6 feat(template): JSON project templates; default template auto-uses providers.json
  • a489cd7 feat(transport,webui): support dynamic (:0) port allocation
  • c4c1433 feat(webui): add favicon from the niq logo
  • 319e116 feat(webui): archived workers sort last and show an archived status
  • e5e66b9 feat(webui): archiving a worker suspends it first; restore resumes it
  • 98b4cdc feat(webui): create workers from the workers view
  • 6b62d99 feat(webui): edit worker subscribe_allow against the bus registry
  • a0e3d13 feat(webui): gate oversized event payloads behind a hint
  • 4887114 feat(webui): launch declared-but-idle external workers from project.json
  • 5279b58 feat(webui): mention popup left-aligned, right check, exclude archived/suspended
  • 7e61338 feat(webui): persistent worker delete; fix external-worker lifecycle
  • d6b28ab feat(webui): query and switch a reason worker's provider over the bus
  • b07bc95 feat(webui): restart a running project, and a real loading state
  • f46f2f5 feat(webui): send events from a worker's watch contract with schema form
  • 75024de feat(webui): send worker events from its watch contract via schema form
  • 32bd183 feat(webui): show current project name under the logo
  • 4b29439 feat(webui): soft-wrap toggle for tool JSON + click-blank to collapse
  • 0597953 feat(webui): start/create no longer redirect — stay on the Projects page
  • f5dab83 feat(webui): syntax-highlight the tool_call / tool_call_result JSON
  • 56899d2 feat(webui): talk/events/workers UI overhaul
  • ee26094 feat(webui): trim the workers list — drop Action and Subscribe columns
  • 18313b9 feat(webui): workers managed column, model switcher, allow-list tags
  • 550d978 feat(worker/reason): pass Compactor and BuiltinTools through the shell
  • 3028ab8 feat(workerhost): durable-change checkpointing; persist runtime provider switches
  • 1b03606 feat(workerhost,swarm): persisted-authoritative worker recovery
  • 04e9f43 feat(workspace): bound bash tool output at 20KB head+tail
  • 39f372c feat: bus-level source-filtered subscriptions, ReplyRejected, UUIDv7 event ids
  • 5dcdc11 feat: drop the tool name from request.* results; merge results into invocations
  • 0f21c17 feat: flat project layout + archived workers
  • 78e6320 feat: init
  • 3d1df92 feat: template detail panel + per-project dated logs
  • e2354cb feat: worker lifecycle suspend/resume + persistence + WebUI worker view
  • 7b9fb35 fix eventbus: wire EventLog via Engine.OnEvent so Send events reach SSE stream
  • 5e364a8 fix(control): don't respawn a project that is already running
  • 7341ccd fix(control,webui): real running state; Start/Stop/Jump by liveness, not stale ports
  • 2058ad5 fix(discovery): restore worker.discover subscription for managed workers
  • 561b9e6 fix(eventbus): apply sqlite pragmas via DSN so every pooled connection gets them
  • b25f0f7 fix(eventbus): deliver the watermark event on the live stream
  • 5519989 fix(eventbus): don't persist transient streaming deltas
  • 2a1e38a fix(eventbus): set sqlite busy_timeout to stop silent event drops
  • 1803446 fix(evtstore): order & paginate by insertion order (rowid/index), not timestamp
  • c7e7386 fix(evtstore,webui): persist request_id; name tool invocations from their type
  • 3ee6d0d fix(httptrans): check scanner.Err() after the SSE read loop
  • e5a215f fix(llm): guarantee a tool_call_id on every tool call
  • 5753058 fix(preset): update default.json to the request.* event convention
  • cd2656a fix(project): reason spec subscriptions are broadcast lifecycle only
  • 6355abe fix(project): stop churning project.json on every start
  • 64a3e9e fix(project): validate persisted ports (1-65535)
  • 00f9536 fix(reason): DefaultConverter text branch keeps intended shape (no payload repeat)
  • d008020 fix(reason): drop tautological parked != nil check on late result
  • 2467717 fix(reason): keep meta tool calls out of the transcript
  • 77fe8c9 fix(reason): precise LLM error policy with event-driven 429 backoff
  • 98e1306 fix(reason): restore tool-name reverse mapping for dotted tool dispatch
  • 9f1470a fix(reason): retry transient provider errors; fix ContextLength retry
  • 2f280e6 fix(reason): route ErrorContextLength compaction through worker.update; rename emitMetaRequest
  • 046bbc8 fix(reason): subscribe the default worker to get_worker_info
  • e3062b9 fix(reason,timer,swarm): tool naming, unavailable-tool notice, timer cancel, hiw rename, webui banner
  • e4d5839 fix(swarm): reuse a project's persisted ports so they stop jumping
  • 9639bf6 fix(swarm): use hyphenated default hiw id (default-hiw)
  • 5315ea8 fix(swarm): workspace uses the declared worker id, not a path-derived one
  • 990649c fix(template): clear superseded builtin YAML templates when seeding
  • 069b996 fix(webui): Jump opens the project in a new tab
  • 32e0699 fix(webui): Jump/create/start stay in the current dev origin
  • 839d00f fix(webui): apply the wrap toggle to the element too
  • 5eced3644adac743514fef8480488f790eadab80 fix(webui): hide host suspend/resume tool calls from the talk stream
  • 1433539315a371e2874bd57539844b2d0bcf2d42 fix(webui): keep immediate workers fetch for the talk mention dropdown
  • 4cb3eac783e725b82dc941e493d3d818c69d484f fix(webui): keep the Talk header when there are no messages
  • 4cd19058139d8144c00a4a98ab9e963250c4495a fix(webui): keep the talk viewport stable while paging older history
  • c0a9497a3564e62825db0ffd94511d364a2e6718 fix(webui): map the frontend to the request.* event convention
  • 5450687a1c0991fcc860faa893240eb3604ed4de fix(webui): no Start-button flash after starting a project
  • 2abdce6069dd0c23fa28a229f131529abdb09dda fix(webui): no flash when switching to the talk view
  • b42b9cc00183b8b69159bd64f92621dc608be018 fix(webui): project name under logo missing in dev ?project mode
  • fb827e8374d3db7829c8af8790516cb309ee9139 fix(webui): rename the swarm-owned hiw to webui-hiw everywhere
  • 41c7c279686295ac8b09e7e23d2051ae5aff54cb fix(webui): render every talk event as a card; pair results by request_id
  • 832647966f8ff70da1eaffeedb979f956db9ee88 fix(webui): section dividers span edge-to-edge, content clips at talk divider
  • 90305a3c1992961598ed9a5c2d578222dfe7a694 fix(webui): stop workers polling + SSE on the Projects surface
  • d9c35ddf64effec597c86c6a27c811e09faf64fd fix(webui): talk shows tool events only when a reason worker is a party
  • c003b3d1ce63f8cd8019b274109f6b65d0c6606b fix(webui): target picker keyboard nav, view-settings persistence, scroll + SSE races
  • 2aced375172266b098c5e544d52d69b62cc9dced fix(webui): usePolling must re-run when enabled flips
  • 132dea2ea4daeb04788b01b9b0770ece45db0e25 fix(webui): workers polling doesn't fetch on activation
  • c17ffc90b6b1ee2bf2dd4199d945fae5d7708f2d fix(webui): workers polling hits the project's own address; live project status
  • 244a175e333662946389a4e3fa2c3fe053b60704 fix: Update IdentityRegistry interface to propagate worker type
  • 333a091ba284fa13a951c693bd60e1ad7d21442e fix: add MemoryEventStore for hiw event history
  • 566595c9ef51bd985881a6809e55ff8f11b0a50c fix: add Type field to Identity, fix WebUI workers endpoint
  • 421b421ac81c4b244681c690c55cb660a13fac4d fix: gate unix-only process-group syscalls behind build tags
  • f66a9ad36ebe8dbe6e2a133e5bfbed6690c30f6a fix: handle duplicate identity registration on restart
  • bc0e0209f4ac0ab2ac36ce6f8f1741dc8de1d606 migrate all workers to WorkerSideChannel
  • 4e4d74e99e513f1de53007e644f65eb75a62782d perf(evtstore): bare timestamp index for all-history pagination
  • 29b9e54605d5d3bab57a3754adfb8d4f6a18d23a perf(persist): store snapshots as raw JSON; slim list_workers results
  • 8d9c3e83183f09af2ad867b73544dfa8a32416ca pkg/service/eventbus/transport/inprocess: align with 'ball and arrows' model
  • b4d8c4be7d9e1ac6b5a5476eb89d01d32af1e0ff pkg/service/eventbus: implement event bus engine, transports, and registry API
  • facbc0607cb6098dfc39f82a3c47e587f6f753a8 pkg/service/swarm: migrate to new eventbus
  • 55353a924b18f1fc2f5b6f63759a733aa478d5b9 pkg/worker/reason: migrate to WorkerSideChannel
  • db4e7de76b4da8c96b461175598fa0c203a7ce7b pkg/worker/timer: migrate to WorkerSideChannel (experiment)
  • 078a36bc685478841c56d02c1438575d0064aca1 reason: add worker identity & collaboration guidance to the system prompt
  • c12926987796d99372913a9b51dcd2b5cd31cbf1 reason: clarify transcript docs & naming; update README
  • 015238bde5955197b4cea5edbbe0c674a6cb4fda reason: implement streaming interrupt preservation (TODO 1+2)
  • 081f461d5909b05d0b004ce29497752df8ad1f23 reason: rename built-in tools to DefaultTools / bus-declared capabilities
  • 6caf10015a1d104df7af3f115e77b4fa892f8ff0 reason: route self-tool declarations through the tool provider
  • e7652c6cfe94ba54be9c41eb3ac842790eee51c3 refactor(build): unify SubscribeAllow — template-first, hardcoded defaults
  • 845b0252927ef7cac1fdc7f96fe30bd262a140fd refactor(bus): remove the worker-side subscription declaration entirely
  • bf523a6dc7f4db54a583c23c724c3aee84242440 refactor(config): JSON-only, drop YAML template support and migration cleanup
  • 28da04c4c53ad3e99f36e4d91102769e3b7a55d4 refactor(event): drop discriminator/arguments — event type + payload are the whole contract
  • 468ddd06b748fee4e09813d6c1a6f725b4cdf07a refactor(event): type universal bus protocol events as EventType
  • 1a6f6dfcae5018116e9741758e81057e6ece19fd refactor(event): unify grant JSON tags to target / source
  • e54879afc56099adadde92baf3d36e0dcc3b09fb refactor(eventbus): mark transient events at the source instead of filtering by type in the bus
  • da06c002a0c3cf2f81da1f1affdf51c5d16f2d75 refactor(project): config.json is the authoritative worker config
  • ce75301ae99cb413d6c2dfda9a22ead4768594e4 refactor(project): replace wildcard publish/subscribe defaults with explicit grants
  • 66889087ed736bc9bb4357d1db6dbe38a727ec28 refactor(reason): actionable list_workers serialization error
  • 059bda001020e52406fd83d16a9363a78fa9dd45 refactor(reason): capability registry; feat(provider): context window + custom headers; feat(webui): mobile layout
  • a95ffdc77a54013674c4c29f79072ac5b187b068 refactor(reason): converge mechanism scope; compression becomes a worker-owned event convention
  • 59df72f85d82930273aebb11817fd2b3276bb7b4 refactor(reason): decouple tool-call timeout from the timer worker
  • 12d87d1d7dcd4d0656bf5d72c8e8a4fdb0066a86 refactor(reason): discover own tools from a self-directed worker.ready
  • c74567f5789bb8cb2502483d698cc98b91b47462 refactor(reason): extract baseworker + transcript/requesttracker subpackages, rename capabilities to extensions
  • 98654c36a1c65bb477393f610200ab5d012bfd07 refactor(reason): extract common reasoning base into pkg/reason
  • 615693dcd4a25000ba940ebe7af7d001d6dd1d98 refactor(reason): extract three-level input handling, consolidate parking, improve naming
  • be6ff51f7b811171dd94ac759fcd61eb799789df refactor(reason): fold transcript subpackage into main package; rename inputs to Patch
  • d926e2c25bc89c84e97c90ecaf78a3c617cdf167 refactor(reason): major reason worker restructure + message layer extraction
  • cbab3b8af25dd831f3806c7672fe22e6a397e5fd refactor(reason): merge compactor.go into compact.go
  • 8a049e3e3ebb368e7746d79922e1668602b38eec refactor(reason): move cloneParams to the end of tools.go
  • a302c51675a85f9cecebfe2e2ecb4eda83a848eb refactor(reason): move llmToolDefs into tools.go
  • 176254256afa3a7f9edd06b53686276cc5ea5946 refactor(reason): persist provider selection; drop dead compactor/seed seams
  • e7b05db607ab90044bee3ec799ff286ec0f7b1ac refactor(reason): rename budget.go->compact.go, fix toolset/tools test naming
  • fb77e05b0cc6a067b79cc610ff6de055f55c4939 refactor(reason): rename compress built-in to context.compress
  • 2bae60e6c6753a3df0472071a38b519d18ac2084 refactor(reason): rename context.close_episode to context.rotate
  • 8ce28b74e10107aec1190703bea2b423dc80c57c refactor(reason): rename pkg/reason/base.go to worker.go
  • 73675f32292c309422dcf37f6d1232060ee7b3d5 refactor(reason): rename recordUsage to handleBudget
  • feee7cabce6f3d476727ced67c44db500f907238 refactor(reason): rename snapshotMessages to renderTranscriptLocked
  • 6ce74a9887f2a229133c8d124b7253f2b17160ee refactor(reason): split domain-agnostic BaseReasonWorker into pkg/reason
  • c5917474161341ce642290054f30d0dd1ae6565e refactor(reason): split reason() into focused helpers
  • db78b64fd4a1a20abaaf924ceb41115aa4a106b5 refactor(reason): split watch into watch (loop) and process (dispatch)
  • 063e0d098aa12c565f3619afe3f6477737a880cd refactor(reason): subscriptions list only broadcast-delivered events
  • 83d1861ff3b69b6e127204545dde0a5f58756e02 refactor(reason): swap append/schedule input_mode names to match semantics
  • f854ff6589db7a91b00db31d7547f25a3e3cf555 refactor(reason): tool provider interface + private fields
  • 80847c68a09638d6ad07a26a4d4703ce0b8d3480 refactor(reason): unambiguous tool naming via provider__name
  • 81b732aec64fddf625f771411b725385acdf28e5 refactor(reason): when a meta op yields to pending input, drop it cleanly
  • eb801433f94e932f60356d954bfcd8251eda52c1 refactor(swarm): consolidate LLM provider config into provider subpackage
  • 0afc34ce4639bf042a192a59811b4a2bbeb20299 refactor(swarm): worker dir is truth; provider gate; drop legacy migrations
  • 7782be3927960c2428b1a8167dd794150d98e57c refactor(transcript): buffer only input + late result during a meta edit
  • e5646188033ae65aff64557c9b65b985910df5f2 refactor(transcript): name files by ownership
  • e6525cd1688937f4bd2c69851a6d730012c4123e refactor(webui): remove decision.made machinery, converge human decisions into worker.input
  • 19575076716e78b7540754d55eb3bed74cbe83a4 refactor(worker): solidify core tool-serving workers and add reason tests
  • f8d8e76f34741faf8c7f01ce21c845e3963af84d refactor(workerstore): persist worker snapshots as raw text, not base64
  • 4d0f7947bfa6c28c55271e88524e6aa6005b964d refactor: move eventbus out of services — services are worker backends only
  • 77c578282e63406d8e75782effdf1be1e075f78b refactor: move swarm and webui to internal/, simplify HIW to only SendInput
  • f47da808770f434a0e99dbd19f36b992144368a1 refactor: normalize layout — workers/services under pkg/, ext keeps only http
  • dab252e2064d79f483d54f3726c31cf4463bfd02 refactor: rename pkg/llmprovider to pkg/provider
  • 5403b238ce239756fe0f5061fe484facea01cb0a refactor: split internal/swarm into control + project packages, drop the legacy swarm mode
  • 97c59fbcd0c1455264a59c99681964496cac9113 rename ToolCallCause → InterruptCause, use typed constants for interruptReason
  • 80af5ec8d91b2dd0bf83dfa53dfcdf47ff16a9c5 restore TODO.md that was accidentally deleted, update to new constant names
  • a9dbf993f387525a3cd91a8e197a8b1b0a936b47 style(webui): 2s-coalesced streaming; split invocation/result into two blocks
  • e444851c6546c13b9279ea0121b8460cf7b7b01b style(webui): breathing room in worker-detail actions
  • bfb2cdeced08d535920418ea336540613734c5bd style(webui): cap tool_call / tool_call_result height with scroll
  • 5b61d2f0145dd3192fbb6ec891dc82430a64aae4 style(webui): document the create-form allow-list defaults
  • 2cb526908305e71e72e0c5576972d2f0fdcb4df7 style(webui): faster, decelerating logo spring-back
  • 3069a9b0f084a59e1fde8978cbef5af88bc0055c style(webui): no hover background on the subscribe allow edit/close toggle
  • 67b75114d0d5e9913630b5680944887e5a8ed8a1 style(webui): project name as plain text under the logo
  • 5b742cd8ce62079ddf602098d2a0cf60a9bb7a23 style(webui): project name — remove italic
  • 745b0f691151fdca194970abef32b187a01362bb style(webui): pull the logo flush to the text's left edge
  • 58c28172d06f7c1e42333b58ad118be8a057f8df style(webui): refresh sidebar logo typography and add divider
  • cffb5b6637e647330939ab884d4bb242be21ccd1 style(webui): render subscribe_allow one per line in WorkerDetail
  • bcf2d29393cb6d3b1cc234d7ce9df222a7df4c10 style(webui): show subscribe_allow in the editor layout, read-only
  • 2221d82fceb63c35b595541219f472105039466d style(webui): source dropdown in SubscribeAllow editor, no read-only placeholders
  • 738f0bee33d85761ad60a5b49753e16e8bb27356 style(webui): swap action descriptions above their buttons in WorkerDetail
  • 66474648e672a0f59cc083c683aff105f875487d style(webui): swap favicon to the reverse niq logo
  • 6268cb01fc6b3b97f298e4ba5f57b7b0b23b2697 style(webui): unify tool-call wording as request
  • 85347abd6267d7609c3d7dc35bae22e2d5d871bb style(webui): unify worker delete button layout with the action buttons
  • e8151537f6eff8255bdb6edddcf0c0a9f9d2a95b test(bus): lock the type-wildcard target-narrowing publish path; fix target spelling
  • 0d6e1f487845963db48635aadb15847d32a9c8d7 test(reason): consolidate worker/reason tests into a single file
  • 1fcafb693a1aeb259e27d59e9500f309873c5509 test(reason): move handler tests to process_test, watch_test keeps integration
  • 4f3bfe7c30579e2cf42756d05cd4cd3b081d1987 test(reason): rename message_test to process_test, drop duplicated EventPattern test
  • faca34a5e0faf07a110126a1ed5a3c4e8ac68819 test(reason): tidy helpers_test.go names and docs
  • bc34230cb510bdbf1a0b17e2237bf3fced5e9966 test(transcript): fix unconditionally-terminated loop in cut-alignment test
  • 1f2f467eeecd5006202908a9806cbdbc4c2d0de5 webui tweaks: logo font/bold, detail block spacing, dev proxy→9527, logo assets
  • 067a098df785b94cf9c67e20eb56246dbfb38173 webui: add en/zh i18n with language toggle and rebuild dist
  • c12487bed1710aa8718e738e7d463c783a97d656 webui: cap event history fetch and pagination at 30
  • bd873098d45825c45633245c7444c93bf8e43ad0 webui: clip logo at divider, unify divider width, drop error from tool title
  • 19b2b3e7fff1e2d3c67c5bd06e5cfa5900faca88 webui: polish talk/event views and fix streaming trace loss
  • b14e9ceb12468b210497b69f51558bf7f6118762 webui: rebuild talk timeline via watermark + history pagination
  • a33a1ccebfb4b0bfcfae91d959bfc9df478aa6ae webui: stop runaway top-loading in events list; add scroll-to-bottom button
  • c9c0c02b07fc7eec923e472d3e9797337111936e webui: unify fonts, collapsible code blocks, and worker selector polish