Raw JSON report machine-readable
{
"data": {
"repo": {
"topics": [
"agent-runtime",
"ai-agent",
"local-first",
"terminal-ai"
],
"is_fork": false,
"size_kb": 2526,
"has_wiki": false,
"homepage": null,
"languages": {
"Go": 1661976,
"Shell": 3194
},
"pushed_at": "2026-07-27T13:36:46Z",
"created_at": "2026-06-11T12:52:44Z",
"owner_type": "User",
"updated_at": "2026-07-27T13:42:07Z",
"description": "Local-first terminal agent runtime with isolated subtasks and intent-aware safety.",
"is_archived": false,
"is_disabled": false,
"license_spdx": null,
"default_branch": "main",
"license_spdx_raw": "NOASSERTION",
"primary_language": "Go",
"significant_languages": [
"Go"
]
},
"owner": {
"blog": "www.alancc.cn",
"name": "Alan Chen",
"type": "User",
"login": "alanchenchen",
"company": null,
"location": "Wuhan, China",
"followers": 43,
"avatar_url": "https://avatars.githubusercontent.com/u/23295628?v=4",
"created_at": "2016-11-06T15:42:23Z",
"is_verified": null,
"public_repos": 34,
"account_age_days": 3550
},
"license": {
"state": "custom",
"spdx_id": null,
"raw_spdx": "NOASSERTION",
"file_present": true,
"scorecard_found": true,
"profile_has_license": true
},
"activity": {
"releases": [
{
"tag": "v0.13.3",
"kind": "patch",
"published_at": "2026-07-27T13:43:03Z"
},
{
"tag": "v0.13.2",
"kind": "patch",
"published_at": "2026-07-23T09:36:43Z"
},
{
"tag": "v0.13.1",
"kind": "patch",
"published_at": "2026-07-21T14:53:40Z"
},
{
"tag": "v0.13.0",
"kind": "minor",
"published_at": "2026-07-21T02:00:31Z"
},
{
"tag": "v0.12.0",
"kind": "minor",
"published_at": "2026-07-20T03:36:33Z"
},
{
"tag": "v0.11.0",
"kind": "minor",
"published_at": "2026-07-17T04:29:33Z"
},
{
"tag": "v0.10.0",
"kind": "minor",
"published_at": "2026-07-16T10:48:46Z"
},
{
"tag": "v0.9.4",
"kind": "patch",
"published_at": "2026-07-13T04:10:14Z"
},
{
"tag": "v0.9.3",
"kind": "patch",
"published_at": "2026-07-09T12:56:18Z"
},
{
"tag": "v0.9.2",
"kind": "patch",
"published_at": "2026-07-08T09:20:33Z"
},
{
"tag": "v0.9.1",
"kind": "patch",
"published_at": "2026-07-08T07:12:26Z"
},
{
"tag": "v0.9.0",
"kind": "minor",
"published_at": "2026-07-08T04:45:56Z"
},
{
"tag": "v0.8.0",
"kind": "minor",
"published_at": "2026-07-03T09:07:34Z"
},
{
"tag": "v0.7.0",
"kind": "minor",
"published_at": "2026-07-01T04:40:04Z"
},
{
"tag": "v0.6.0",
"kind": "minor",
"published_at": "2026-06-26T11:10:51Z"
},
{
"tag": "v0.5.0",
"kind": "minor",
"published_at": "2026-06-25T07:55:59Z"
},
{
"tag": "v0.4.0",
"kind": "minor",
"published_at": "2026-06-24T14:38:05Z"
},
{
"tag": "v0.3.2",
"kind": "patch",
"published_at": "2026-06-22T10:12:26Z"
},
{
"tag": "v0.3.1",
"kind": "patch",
"published_at": "2026-06-22T10:01:32Z"
},
{
"tag": "v0.3.0",
"kind": "minor",
"published_at": "2026-06-22T09:36:44Z"
},
{
"tag": "2026-6-22",
"kind": "other",
"published_at": "2026-06-22T05:53:17Z"
},
{
"tag": "2026-6-19",
"kind": "other",
"published_at": "2026-06-18T16:23:01Z"
},
{
"tag": "2026-6-15",
"kind": "other",
"published_at": "2026-06-15T07:23:28Z"
},
{
"tag": "2026-6-12",
"kind": "other",
"published_at": "2026-06-11T13:54:36Z"
}
],
"recent_commits": [
{
"oid": "f3d7a7faf4d97ea61ca235579369bd33546ef1cb",
"body": "Use a native Bubbles list state model for Skills, MCP servers, and model selection while preserving Suna-specific actions and styling.\n\nKeep registered slash commands out of chat transcripts, reset list state when sessions change, and add regression coverage for filtering, lifecycle, and command routing.",
"is_bot": false,
"headline": "feat(tui): unify chat management lists",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-27T13:21:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "38ee89e5a9a7d741bdc330be97ab652dec82c4ea",
"body": "Keep composer rendering, focus state, and key routing aligned while terminal selection, guard confirmations, and AskUser interactions take control.\\n\\nUse Bubbles key bindings for selection and guard actions, and add regression coverage for interaction priority and focus restoration.",
"is_bot": false,
"headline": "fix(tui): align composer state with modal input handling",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-23T09:21:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e5799a57fc9a5ed5348490cb1f187f49eddc1633",
"body": "Remove private and relay-provider names from documentation, tests, and user-facing examples. Replace credential-shaped samples with neutral placeholders and safe test values.\\n\\nDocument the repository privacy policy in AGENTS.md so future code, docs, prompts, UI copy, and test fixtures avoid exposing credentials or internal provider details.",
"is_bot": false,
"headline": "chore: sanitize public provider examples",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-21T14:34:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4dd0a9db4ec8b651cc9938252fb79d60a1643177",
"body": "Keep the edited model selected when leaving its detail page instead of resetting the model list to the first row.\\n\\nRemove duplicated Welcome picker help text and automatically return to the Welcome menu after the last visible idle session is deleted. Add regression coverage for model selection, help rendering, and idle-session lifecycle.",
"is_bot": false,
"headline": "fix(tui): preserve picker navigation state",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-21T14:34:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2f44e535907fbc52d4e79e722821cfdd1757a9d9",
"body": null,
"is_bot": false,
"headline": "feat(debug): add daemon memory diagnostics",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-20T15:45:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4ef3cdca0566277aa6df99dd09702f2146f46bfa",
"body": "Expose third-party clients through a loopback TCP JSON-RPC transport and add suna serve for daemon discovery. Keep the official TUI on the local transport while both transports share daemon sessions, lifecycle, and handoff semantics.",
"is_bot": false,
"headline": "feat(transport): replace stdio runtime with tcp daemon",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-20T02:25:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "89079fe8f2f34c3e761f4adeed65d0bad9d511f4",
"body": "Clear transient chat state when leaving for Welcome so transcript, render caches, tool data, interactions, and attachment references can be reclaimed. Ignore queued chat notifications while no session is open.",
"is_bot": false,
"headline": "fix(tui): release chat runtime on welcome",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-19T09:51:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "843bb616bcc4949ba382a01f33fc19c6c9c96baa",
"body": "Cancel active runs and clear pending interactions when the last attached connection leaves a session runtime. Preserve interaction handoff while another connection remains attached.",
"is_bot": false,
"headline": "fix(daemon): cancel orphaned session runtimes",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-19T09:15:40Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5aef35d17d498e67ca1b3de6a3bd9f8fc46adc74",
"body": null,
"is_bot": false,
"headline": "fix(tui): clarify model retry guidance",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-17T04:20:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "bef22aaa7efc243d6b63c96114cee5b3f674acdb",
"body": "Align the TUI session workflow with workspace-aware actions. Welcome now\nresumes or creates sessions for the current workspace, joins active\nsessions elsewhere, and exposes idle sessions elsewhere for cleanup.\n\nUpdate slash-command session navigation to separate current, active, and\nidle session gro\n[…]\n old session when creation\nfails.\n\nKeep delete confirmations bound to their original session across session\nlist refreshes, and document the updated new-session, sessions, and\nmodel command semantics.",
"is_bot": false,
"headline": "feat(tui): streamline session navigation",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-17T04:09:27Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "826726550d44306ecbd67c7f7fea3ae71213a9ad",
"body": "Release idle session runtimes after a short detach grace period while keeping session metadata, persisted working state, and attachments intact.\n\nUse a generation-checked delayed unload so reconnects, active runs, state operations, waiting interactions, deletes, and pruning invalidate stale unload a\n[…]\nreconnects fast without retaining every detached session in the long-lived daemon.\n\nAdd lifecycle tests for unload, reattach reuse, persisted-state recovery, and runs that become idle after detaching.",
"is_bot": false,
"headline": "perf(daemon): unload detached session runtimes",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-16T10:37:03Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "46887e8e63ec9f788a81080ef29ea3842727ef75",
"body": "Use Bubble Tea background-color queries to resolve the automatic theme while preserving the existing light and dark palettes. Refresh existing chat content when the resolved theme changes and keep explicit user choices authoritative.\n\nUnify Welcome and Config vertical navigation with a lightweight s\n[…]\n\nPolish the chat model metadata with a compact Thinking indicator and remove redundant status separators. Add focused rendering and behavior tests for themes, selection state, and configuration flows.",
"is_bot": false,
"headline": "feat(tui): refine theme and configuration navigation",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-16T09:43:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "5206836900f43341c0261ba9de4efe233c91b7f9",
"body": "Document the repository's English Conventional Commit format and require detailed English bodies for significant cross-module changes, migrations, and protocol updates.",
"is_bot": false,
"headline": "docs(agents): define commit message convention",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-16T05:06:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c26eced44ec68c4b114ac773db1bc0f3ff593c5",
"body": "Move runtime model choice from global active_model to persistent\nsessions.model_ref. Each session now creates an explicit immutable\nModelBinding for its runs, so model changes in one session do not affect\nother sessions or their auxiliary LLM calls.\n\n- use active_model only for new session defaults \n[…]\nodel ref\n- keep memory_queue global while persisting its processing model_ref\n- add structured unavailable-model recovery, session-aware model UI,\n attachment cleanup, and session-model documentation",
"is_bot": false,
"headline": "feat(session): make model selection session-scoped",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-16T05:05:51Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "052796e72f9e994da0fc1305af12aec52719af05",
"body": null,
"is_bot": false,
"headline": "fix(model): 修复 Responses 工具调用与思考摘要",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-14T07:26:20Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cdf45a887e3d501c7549479790723d44e0f9d7bb",
"body": "Ensure the tool block for a subtask is sealed once the parent spawn\ncall finishes and no tools remain running, so subsequent main-agent\ntools start a fresh execution batch instead of being appended to the\ncompleted subtask block.\n\n- add CloseToolBlockWhenIdle flag to defer block closure\n- reset subtask cursors and selection when sealing the block\n- cover the behavior with new tool block tests",
"is_bot": false,
"headline": "fix(tui): close subtask tool block when idle after parent ends",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-13T04:02:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ce2cf41c47a96c0ba48c1bad056e403695867206",
"body": "Add guidance so the agent and guard reviewer respond in the user's\nlanguage while keeping structured keys and decision values in English.\n- system.md: write tool-call `intent` in the user's current language\n- guard_review.md: write `reason`/`suggestion` in the user's language,\n keep JSON keys and `decision` values in English",
"is_bot": false,
"headline": "feat(prompt): localize agent-facing text to user's language",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-13T03:14:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "7a716b6bbab11e5bfd6108d2c14f6318342c322d",
"body": null,
"is_bot": false,
"headline": "feat: improve TUI model and session UX",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-09T12:32:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "182ba45589c834726405e2dd8b90db0e444edd08",
"body": "…l+S selection\n\nMove the waiting/running status lines out of the transcript viewport and\nrender them as a locked input-area placeholder instead, so the transcript\nsignature stays stable and the bottom loading hint is not duplicated.\nReplace the Shift+drag native copy hint with an explicit Ctrl+S selection\nmode that temporarily disables mouse capture and returns to scrolling on\nEsc. Update i18n keys, help docs, and tests accordingly.",
"is_bot": false,
"headline": "refactor(tui): consolidate loading status into input area and add Ctr…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-08T09:12:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c482d887f4c31ae4c2f4632e23f4b258e3ab53e9",
"body": "Remove the TUI copy mode (Ctrl+Y) that toggled mouse capture, relying\ninstead on the terminal's Shift+drag native text selection. When the\ncomposer is empty, Up/Down now browse previous user messages as input\nhistory, preserving the in-progress draft on overflow. Includes tests\nfor history navigation.",
"is_bot": false,
"headline": "feat(tui): add input history recall and use native terminal copy",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-08T06:58:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f7072046e04ff593309e44a9f75a462c9711ae71",
"body": "Replace the single-session model with a daemon-managed multi-session\nruntime. Sessions now isolate cwd, working memory, attachments, guard\nstate and run state while sharing global config, router, skills, MCP\nand memory stores.\n\nProtocol is bumped to v0.2: session.new/session.restore are replaced by\n\n[…]\n is migrated to sessions + session_state on startup.\n\nBREAKING CHANGE: stdio runtime protocol version is now 0.2; clients must\nuse session.create/session.attach instead of session.new/session.restore.",
"is_bot": false,
"headline": "feat(session): add multi-session management and handoff support",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-08T04:37:12Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "890bb98c1446962c5bdf20b9258b27fb3e96878f",
"body": null,
"is_bot": false,
"headline": "docs: clarify Suna positioning",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-06T04:29:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "47382601b5582ed766fc2ee58e80158b2b67b5bb",
"body": "Refactor docs/protocol.md into a semantic reference for maintainers\nand transport implementors, separating design principles from\ndeveloper quick-start. Update docs/runtime-stdio.md to a developer\nhandbook format with quickstart, handshake verification, and\nstructured method/notification tables.",
"is_bot": false,
"headline": "docs: restructure protocol reference and stdio runtime guide",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-03T09:56:29Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8ba36ef2b291aae0d6eb819fc5c25e99f01611a5",
"body": "Add `suna runtime --transport stdio` as a headless entry point\nthat exposes the existing daemon service over JSON-RPC/NDJSON with\na required `runtime.hello` handshake.\n\nExtract shared JSON-RPC serving code for local and stdio transports,\nadd transport lifecycle retention policies, and separate method\nresponses from daemon notifications in the TUI.\n\nDocument the runtime protocol, stdio integration flow, lifecycle\nsemantics, and third-party client guidance.",
"is_bot": false,
"headline": "feat(runtime): add stdio JSON-RPC runtime for third-party clients",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-03T08:51:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e3e3dc2e1fd5369b8631823a0d36d80b8a172456",
"body": "Add FinishInfo struct to capture completion metadata from provider\nresponses and populate it in terminal stream chunks across all providers.\nRefactor LLM request logging to use dedicated stream statistics collection\nwith finish shape inference for better observability.",
"is_bot": false,
"headline": "feat(model): propagate finish info and refactor LLM request logging",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-07-01T04:06:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "04ed2f47b9396b6f1fc2e281fad8a7a1c55da2df",
"body": "…ents\n\nAdd router validation to reject orphan tool results without matching\nassistant calls. Expand memory compression to retain tool call parents\nfor recent tool results. Fix TUI to treat invalid spawn-prefixed tools\nas main entries when parent subtask is missing.",
"is_bot": false,
"headline": "fix(toolchain): validate tool result pairs and preserve tool call par…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T15:24:58Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "af382dc7a606fac1957f4d724af45a7c449295f4",
"body": "…rers and handlers\n\nExtract input handling, attachment rendering, command overlays, live placeholders,\nreasoning display, and subtask views from monolithic chat.go, chat_render.go, and\nchat_view.go into dedicated files. This improves code organization and maintainability\nby separating concerns.",
"is_bot": false,
"headline": "refactor(tui): modularize chat components by extracting focused rende…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T13:08:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55f9cb8b1683f07a01d17975c2383db92e018380",
"body": "Refactor the live transcript rendering system to use OSC (Operating System Command) sequences for embedding dynamic content like spinner frames and elapsed time. This replaces the previous placeholder approach with a more robust architecture that separates spinner and elapsed time markers, adds syncContent() calls to ensure viewport updates after state changes, and improves test coverage for the new placeholder replacement logic.",
"is_bot": false,
"headline": "refactor(tui): replace spinner placeholder with OSC-based live markers",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T12:09:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "eab5a27a500adb35b723edb42955e01a9a198bae",
"body": "…rebuilds\n\nInsert placeholder during rendering and replace with actual spinner frame\nin viewChat(), preventing O(N) transcript reconstruction on each tick.\nTruncate elapsed time to whole seconds to further reduce signature churn.",
"is_bot": false,
"headline": "perf(tui): defer spinner character substitution to reduce transcript …",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T08:08:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1958c8c42a5c88cea5851c4574d89239002e89eb",
"body": "…ogging\n\nReplace all \"transport\" logging category references with \"ipc\" across\ndaemon and transport layers. Remove the \"perf\" logging category and\nassociated slow-performance instrumentation from TUI components,\nincluding threshold constants and timing wrappers. Clean up unused\nlogging imports and simplify time checks in transcript rendering.",
"is_bot": false,
"headline": "refactor(logging): rename transport category to ipc and remove perf l…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T07:06:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4000c81c58782983c723fe96c01f5b2e453f3355",
"body": "…oning\n\nImplement a notice system that shows a one-time message when a protocol\nchange automatically clears reasoning settings. The notice is deferred\nuntil the daemon confirms the config write to avoid showing success\nmessages on failure. Notices are cleared on user interaction or errors.",
"is_bot": false,
"headline": "feat(tui): add pending config notice when protocol change clears reas…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-30T06:11:12Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6ddcd9f81ee7b1c2249067aed601604451a81124",
"body": "…s pages\n\nPrevent duplicate input cursor blink tick chains by tracking blink state\nwith inputCursorBlinking flag. Keep the tick chain alive when navigating\naway from chat so the cursor resumes blinking on return, while keeping\nthe cursor visible on non-chat pages. Add tests verifying singleton\nstart behavior and cross-page tick continuity.",
"is_bot": false,
"headline": "fix(tui): ensure singleton cursor blink chain and maintain tick acros…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-26T10:58:49Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ed374c6c77401bae5091ba5c0967ab3934fddcdb",
"body": "…racy\n\nIntroduce TokenCalibrator to align local token estimates with actual\nprovider input tokens using EMA smoothing, hard range filtering, and\nrelative outlier rejection. Inject into Runner to dynamically adjust\ncompaction safety margins—thinner padding when calibrated, thicker\nduring cold start or anomalies. Separate raw estimates (for calibration\nfeedback) from calibrated values (for UI and compression decisions).",
"is_bot": false,
"headline": "feat(model): add token calibrator to improve context compression accu…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-26T10:31:55Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "840eb82c02528b48673bf6453e33929483f69bf7",
"body": "…nd unify Anthropic streaming\n\nSplit monolithic reasoning field handling into SDK-specific adapters\n(`reasoning_fields_openai.go`, `reasoning_fields_anthropic.go`) with a\nshared validation layer (`reasoning_fields.go`). Remove provider-specific\n`applyReasoning` methods in favor of generic `*Reasonin\n[…]\nmeout. Replace Claude budget-based presets with adaptive effort\npresets in TUI. Update architecture docs to reflect the new layered\ncontract where public reasoning logic must not import concrete SDKs.",
"is_bot": false,
"headline": "refactor(model): extract protocol-specific reasoning field adapters a…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-26T08:11:14Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1da050900e87a70427eeee991ab96ecb6846d342",
"body": "…from provider name\n\nPreviously, the provider name implicitly determined the API protocol\n(openai -> OpenAI Responses, anthropic -> Anthropic Messages, others\n-> OpenAI Chat). Introduce a dedicated `protocol` field in model\nconfiguration with supported values `openai_chat`, `openai_responses`,\nand `\n[…]\n protocol. Includes backward compatibility\nfor existing configs missing the protocol field, defaulting to\n`openai_chat`. Update TUI to support protocol selection and refresh\ndocumentation accordingly.",
"is_bot": false,
"headline": "feat(config): add explicit model protocol field and decouple routing …",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-26T06:46:10Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "ecd2e1adec4836d2ca98d084c9032c6cd7ff463a",
"body": "Replace string concatenation with strings.Builder in tool call accumulation,\nstream batching, log compaction, TUI rendering, and notification handling.\nAdd buffer retention limits to prevent unbounded growth. Introduce\nperformance logging for slow TUI operations and refactor local transport\nframing to use bufio.Reader and shared sendFrame/receiveFrame helpers.",
"is_bot": false,
"headline": "perf: reduce allocations and add memory bounds in streaming paths",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-26T04:24:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0677de5d6e93a506cc566d69f9107dc2b92476a5",
"body": "Update package descriptions to reflect recent changes including\nagent.delta/agent.run/agent.usage protocol, model request auto-recovery,\nand structured ModelError handling. Add architecture rules for protocol\nsemantics and runner responsibilities. Update release process to require\nChinese release notes and version suggestion workflow.",
"is_bot": false,
"headline": "docs: update architecture and release process documentation",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-25T07:59:09Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0b776c4144d8c3035029f1e58ce532871e04ee23",
"body": "Replace inline retry configuration with named constants for max retries,\nmax attempts, and retry delay. Update protocol documentation to reflect\nthe correct retry semantics (3 retries = 4 total attempts) and add test\ncoverage for the constant values.",
"is_bot": false,
"headline": "refactor(runner): extract model request retry constants",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-25T07:45:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e47a0dcf99ee0455f1834c037940e10dd327c11b",
"body": "Refactor tool input schema construction to correctly extract the `required`\narray and preserve additional fields beyond `type`, `properties`, and\n`required`. Previously these were silently dropped, causing tool definitions\nto diverge from their declared parameters when sent to the API.\n\nUpdate Claude reasoning presets to match Claude Code style budgets and add\ntests covering schema preservation and preset configurations.",
"is_bot": false,
"headline": "fix(anthropic): preserve required and extra fields in tool input schemas",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-25T07:17:43Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ae286d341088a8c5a73ce5ba4b93fff1dd29855b",
"body": "…dd ModelError recovery\n\nRestructure the daemon-to-TUI protocol to separate content streaming from run\nlifecycle and errors. agent.delta carries assistant/reasoning text increments,\nagent.run carries running/retrying/done/failed/cancelled states with structured\nModelError, and agent.usage carries to\n[…]\ncoding, and documentation accordingly.\n\nBREAKING CHANGE: Protocol notifications changed; agent.stream and agent.reasoning\nare replaced by agent.delta and agent.run with different parameter structures.",
"is_bot": false,
"headline": "feat(protocol): replace agent.stream with agent.delta/agent.run and a…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-25T07:00:22Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c0efbb91a0e79a5916d2e098b2d8026c28e44d1c",
"body": null,
"is_bot": false,
"headline": "fix(release): fetch annotated tag notes in workflow",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-24T14:42:51Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1bf8d5d646b95c7f7b33641d04e9dbcfe94e92b3",
"body": "…alling\n\nReplace auto-generated release notes with annotated tag message content,\ndisplay trimmed notes during update check, and prompt for explicit\nconfirmation before downloading and installing. Remove --check flag in\nfavor of unified flow that always shows status first.\n\nBREAKING CHANGE: suna update --check is no longer supported; the update\ncommand now always checks for updates and displays release notes before\nprompting for installation confirmation.",
"is_bot": false,
"headline": "feat(update): show release notes and require confirmation before inst…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-24T14:24:07Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "6c4f9cacc00e414eafc2d549dca48d3c8001ae9b",
"body": "Avoid retaining full SKILL.md contents during manager reload by reading\nonly a bounded index window for metadata extraction. Load now reads the\nfull file on demand, while reload can still parse frontmatter fields from\nthe bounded index and ignores partial trailing lines.\n\nUse strings.Builder for guard review stream accumulation and add tests\ncovering large skill files and partial index parsing.",
"is_bot": false,
"headline": "perf(skill): limit reload indexing to skill metadata",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-24T07:21:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8c3f69ed1f515d1b8f319ed15cbb1ddb02f60c2d",
"body": "…ummary\n\nConvert tool summary storage from an unbounded slice of items to a\nstructured ToolSummary type that caps recent entries at 4, failures\nat 2, and aggregates change-tool counts. The daemon now emits the\nsummary through SessionRestoreStatus.ToolSummary as a structured\npayload, and the TUI rend\n[…]\nreventing compacted history from being retained via shared backing\narrays. Replace string concatenation with strings.Builder in the\nrunner streaming path to reduce allocation pressure on long replies.",
"is_bot": false,
"headline": "refactor(memory): replace flat tool summary with bounded structured s…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-24T06:41:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "08c6fec131220b84e053b985e0a05748d4d774f5",
"body": "…ring\n\nImplement a 32MB soft memory limit for TUI display history, trimming old\nturns from the top while preserving the first user message and adding a\ncumulative discard summary. Replace streaming text concatenation with an\nappend-only StreamingTextState buffer that only retains tail lines for\nrendering, reducing O(n²) rewrap CPU and memory pressure for long replies.",
"is_bot": false,
"headline": "feat(tui): add display history budget and streaming tail window rende…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-24T04:58:52Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "cab49eb2fd8c0328fc1e401ce2ca3900a27dd81d",
"body": "Add redirect-based fallback for latest-release detection when the GitHub API is unavailable. Standardize generated release asset URLs for fixed binary names, add coverage for tag parsing and asset resolution, and improve update command status and error presentation.",
"is_bot": false,
"headline": "feat(update): make self-update fallback and reporting clearer",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T09:54:11Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "466d3653a43a716dc2947e16de30870214b422c1",
"body": "Document package responsibilities for clipboard input, subtask result disclosure,\nupdate/version internals, and the TUI/daemon boundary for paste images.\n\nAdd release guidance covering SemVer tags, version source, pre-release checks,\nannotated tags, push order, and GitHub Actions release asset generation.",
"is_bot": false,
"headline": "docs(repo): clarify agent architecture and release workflow",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T09:43:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f1b00a6ab04a43332cff6b1dbaa7c3114c4178a3",
"body": "Add `suna update` and `suna update --check` to fetch GitHub Release metadata, compare versions, download the matching platform asset, verify SHA256 checksums, extract the bundled binary, and replace the current executable.\n\nWire release builds to inject version information through a shared `internal\n[…]\nbuilds, checksums, and uploads `dist/*` releases.\n\nDocs now explain the update flow, daemon/TUI shutdown requirement, cache behavior, release asset naming, and the automated tag-based release process.",
"is_bot": false,
"headline": "feat(cli): add self-update command",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T09:28:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "08571b8e93ee60c84708aad8c76a898e52b68043",
"body": "Update release documentation and platform build scripts so archives keep platform-specific names while the packaged binaries are consistently named `suna` or `suna.exe`.\n\nThis makes extracted binaries directly usable from `PATH` without renaming after installation.",
"is_bot": false,
"headline": "docs(build): standardize release binary names",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T08:02:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c6144a1aa45d49875b260412d2dbea23dde13485",
"body": "When a pasted image is confirmed in the TUI, daemon-side attachment\nstatistics may not update automatically. Refresh the attachment status\nafter adding the image so the configuration page displays the current\nattachment count.",
"is_bot": false,
"headline": "fix(tui): refresh attachment status after confirming pasted image",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T06:07:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "c04f4d6bdec1073ad37bf2adca58dce1306f039f",
"body": "Implement Ctrl+V clipboard image fallback in the TUI chat input path. When no terminal paste arrives, the UI reads image bytes from the system clipboard, validates MIME and size, enqueues a pending image attachment, and persists it to the attachment root on confirmation.\n\nAdd attachment detection for raw image bytes, non-image filtering, size blocking, and content-hash based persistence behavior. Document the clipboard image paste flow and dependency updates for the new clipboard integration.",
"is_bot": false,
"headline": "feat(tui): add clipboard image paste fallback",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T05:48:10Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "0d8144b37ce06f564e16c11e02daf1d163faf42a",
"body": "Dynamically split subtask row space so intent text and active tool activity use the available width instead of fixed half-widths. Failed subtasks now show their error reason before child activity, and selected summaries surface that reason in the detail panel.\n\nSearch summaries keep raw mode values and remove unused localized content label plumbing. Add regression tests for wide viewport subtask rows and failure reason precedence.",
"is_bot": false,
"headline": "fix(tui): surface subtask errors and fit row details",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T03:47:59Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "928048007e02cb5749b1ee64565bef6d82991cc4",
"body": "Add a `subtask_for` model option that filters which active main models can see a configured model as a spawn/subtask candidate. Empty filters remain visible to all main models, while glob patterns match model refs with `*` and `**` semantics.\n\nThe router now exposes spawnable models for the active model, spawn validation rejects hidden models, and config/TUI plumbing preserves the new field across persistence, protocol, forms, and detail views.",
"is_bot": false,
"headline": "feat(config): add subtask model visibility filters",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-22T03:21:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "f88420e8b7cb2f9f4c825febfc84c3a144829cf3",
"body": "Update the prompt template to state that batching tool and spawn calls should\nbe accompanied by actual parallel work, not just narration. This reduces\nambiguity around when to claim parallelization in agent behavior.",
"is_bot": false,
"headline": "docs(prompt): clarify tool call batching guidance",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-20T13:02:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e74c8fc5f1b7fc42308fce7177a107ed7f270e12",
"body": "Added coverage for the subtask panel divider so section titles do not leave a visible\nright gap when rendered.",
"is_bot": false,
"headline": "fix(tui): assert subtask divider reaches right edge",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-20T12:46:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "71956253805f137e25d3aea1db17051fbfb4f844",
"body": "Tool summaries now render aggregate counts, failures, change-tool counts,\nrecent operations, and folded earlier entries. Thinking, tool, and subtask\nblocks use shared indentation and bounded reasoning previews to keep chat\nlayout stable.",
"is_bot": false,
"headline": "refactor(transcript): compact tool summaries and align blocks",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-20T12:41:45Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "67e94c99746031f7b2658674494ff4d228c7d915",
"body": "Introduce structured subtask statuses, JSON result parsing, and side effect\nreporting so the main agent can surface failures and tool-caused changes\nreliably.",
"is_bot": false,
"headline": "feat(subtask): capture side effects in subtask results",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-20T11:52:21Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1f844ea1f0177bf67657fb31c107351c935814c",
"body": "Update the system prompt to consolidate tool-call and delegation instructions,\nclarify when to batch or split work, and emphasize bounded subtask scope with\nmain-agent control.",
"is_bot": false,
"headline": "docs(prompt): simplify tool call and delegation guidance",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-20T10:01:36Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "fb5466eb46c40a84f5bcf6bad45c8e5453d7f43e",
"body": "Document that the notification pump's 8ms text coalescing is separate from the TUI chat transcript's approximately 16ms dirty sync frame. Clarify that the transcript frame limits viewport visual refresh to about 60fps without changing daemon streaming, text delta semantics, or critical event delivery.\n\nUpdate the implementation comment for the transcript sync interval to reflect the 60fps terminal rendering target and reduced renderer pressure.",
"is_bot": false,
"headline": "docs(tui): clarify transcript sync frame semantics",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T16:10:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "8aa8b41b4ee0518372bc854949f720f63a221d0a",
"body": "Introduce a focused subtask panel for active delegations with keyboard navigation, tool detail expansion, and scrollable tool output.\n\nRefactor tool block rendering to show only main tools in a status-aware titled container, move compact running status into the input area, and adjust chat layout calculations to use rendered rows for input hints, suggestions, and separators.\n\nAdd tests for subtask interaction, tool block output, and chat view layout behavior.",
"is_bot": false,
"headline": "feat(tui): add interactive subtask panel",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T15:41:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "5bfec9f5890c6e1def2efd5570dac9be9cfcddf8",
"body": "Defer transcript synchronization until after a short frame interval so streaming output and tool events do not repeatedly trigger full chat renders.\n\nAlso update the system prompt to encourage batching independent tool and delegation work while avoiding parallel dependent, destructive, or duplicate write actions.",
"is_bot": false,
"headline": "perf(tui): coalesce transcript sync updates",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T08:12:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92775edd3b2204713f82815d8e679a8c3efbbbb3",
"body": "Expose memory delete and clear operations through the daemon protocol and TUI.\nActive memories can now be removed individually or cleared entirely from a new\nmemory overlay, while the memory extraction queue remains untouched.\n\nThe daemon emits updated memory list notifications after mutations so the TUI\ncan refresh overlay state and keep chat panel output for command-driven memory\nlisting.",
"is_bot": false,
"headline": "feat(tui): add interactive memory deletion",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T04:21:27Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee342b2f0ae2e1bb199a22871a5ad13cbde0b365",
"body": "Image attachments pasted from the same path or URL now resolve to the\nexisting attachment instead of being appended again. The cursor moves to\nthe existing item, and tests cover duplicate paths, duplicate URLs, and\ndistinct sources.",
"is_bot": false,
"headline": "fix(tui): prevent duplicate image attachments",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T03:38:34Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "92b1ccccabd5b39b4496f04dd38fb513654bc056",
"body": "Document the updated compaction policy across architecture,\nconfiguration, implementation, design, and performance guides. The\ndocs now describe proactive compaction using local context estimates,\nfull `max_output_tokens` output reservation, estimator safety tokens,\nand the distinction between TUI context estimates and provider usage\nmetrics.",
"is_bot": false,
"headline": "docs(context): clarify proactive compaction budgeting",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T03:08:37Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ab6fbf2a12cbeb14530b4b6b8907b22f4c8a225c",
"body": "Use a router-backed provider for memory extraction and compression so\nbackground work follows the active model after config reloads.\n\nThread estimated context tokens through runner, protocol, agent events, and\nthe TUI, while manual compaction reserves space for output budget and\nestimator safety. Router-level LLM logging now records provider, model, and\nstream statistics for all completion paths.",
"is_bot": false,
"headline": "feat(llm): route background LLM calls through active model",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-18T01:38:03Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2e8d763a3cd78d6e01c5e6475a4c03672ba611a7",
"body": "Intercept mouse wheel messages before Bubble Tea viewport handling so\ntranscript scrolling can move across transcript windows instead of being\nclamped by the current viewport slice.\n\nAdd coverage for wheel-up scrolling from the top of the current viewport.",
"is_bot": false,
"headline": "fix(tui): handle wheel scrolling across transcript windows",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T12:25:42Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "2ebb88819a501584b8f352b28110335df8333696",
"body": "Update built-in tool descriptions and parameter help to be shorter,\nsingle-purpose, and consistent, using \"Default X, max Y\" phrasing for\nbounds and defaults.\n\nRefresh implementation and performance docs to reflect the redesigned\nsearch schema, bounded listdir depth, writefile parent-directory creation\nguidance, and token-aware tool definition style.",
"is_bot": false,
"headline": "docs(tools): tighten built-in tool schemas and guidance",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T10:48:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "562b7e908ff8542688bb435f033e719453365c91",
"body": "Update TUI documentation to describe the current streaming render\ncoordination, overscan-window scrolling semantics, reasoning detail\nwindowing, and visible-window refresh behavior.\n\nClarify that these changes preserve immediate scrolling and spinner\nupdates while avoiding redundant transcript synchronization and repeated\nreasoning rendering.",
"is_bot": false,
"headline": "docs(tui): document rendering, scroll, and spinner behavior",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T10:08:56Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "3ea6f9a85186f50d71d1bba86538aab055c5f455",
"body": "Clip long reasoning detail before wrapping or markdown rendering, cache\nrendered line counts by width/theme/mode, and avoid full transcript\nresyncs while streaming text is updating. Return whether scroll/page\nactions changed the transcript window so callers only refresh when\nvisible content changes.\n\nAdd tests for reasoning clipping, streaming suppression, and scroll\nwindow-change reporting.",
"is_bot": false,
"headline": "perf(tui): optimize chat rendering during streaming and scrolling",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T10:06:08Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d29824d37490a4ea7c10c86e28f2f898a5432c36",
"body": null,
"is_bot": false,
"headline": "fix(tui): simplify config model rows and normalize reasoning tabs",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T09:15:02Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "55966ea42fa9db1a803578434abd19ac2eaeba20",
"body": "Add max_output_tokens to model configuration, protocol messages, and provider construction. Validate context_window and max_output_tokens on load and save, requiring positive values with output smaller than the total context window.\n\nUse the configured output budget for chat, subtask, Guard review, \n[…]\nhe new required model capability fields.\n\nBREAKING CHANGE: existing model configs must include both context_window and max_output_tokens; load and save now fail when either field is missing or invalid",
"is_bot": false,
"headline": "feat(model): enforce explicit context and output limits",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-17T08:46:04Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "a2f4c7a3c5d45a213c1944e6379309fef22dcacc",
"body": " - replace legacy search parameters with pattern, terms, mode, match, case, scope, context, limit, and depth\n - add literal terms search for multiple alternatives without regex\n - add workspace/deps/all search scopes with built-in safe excludes\n - support doublestar glob patterns for path/include/exclude matching\n - update TUI search summaries for the new schema\n - refresh README and tool design docs",
"is_bot": false,
"headline": "refactor(tools): redesign search tool for LLM-friendly local discovery",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-16T08:19:15Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "abb7925f18395140b0b1341159551167c02a8b94",
"body": "Update the built-in search tool and TUI summaries to use the newer\n`pattern` and `mode` parameter names. Rename result grouping and tests to\nmatch the unified search option vocabulary, add term-aware summaries, and\nkeep existing search behavior around scope, limits, context, and diagnostics.",
"is_bot": false,
"headline": "refactor(search): migrate search params to pattern and mode",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-16T07:44:39Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "dcccd9828340e1bb2bc635654ed92e755a6b88be",
"body": "…search and context lines\n\nReplace the `mode` parameter with `kind` (auto, content, path, symbol),\nrename `max_matches` to `max_results`, and add `context_lines`, `word`,\nand `kind=auto` that returns grouped path, symbol, and content matches.\nIntroduce `search_format.go` for output formatting, updat\n[…]\nry\nto show per-kind match counts, and adjust documentation and tests.\n\nBREAKING CHANGE: `mode` is removed in favor of `kind`; `max_matches` is\nrenamed to `max_results`. Old parameters will be ignored.",
"is_bot": false,
"headline": "feat(search)!: replace mode/kind, add structured path/symbol/content …",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-15T06:56:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e45307393efed82de6999fc5f8aba428f7a416db",
"body": "Introduce `cachedStreamingText` that tracks last wrap state (`StreamLines`, `StreamLastLineWidth`, `StreamPendingNewlines`) per message. On each delta, only the appended text is processed through `appendStreamingDelta`, which reuses the existing wrapped lines and avoids re-wrapping the entire accumu\n[…]\nDelta` uses `ansi.GraphemeWidth` for proper cell-width wrapping. The test `TestCachedStreamingTextMatchesFullRender` verifies that incremental results stay identical to the full `renderStreamingText`.",
"is_bot": false,
"headline": "perf(tui): add incremental wrap cache for streaming assistant text",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-15T06:05:08Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "6365c5ab9895f8afd76c629aaebfe5f63378e226",
"body": "…ool calls and usage tracking\n\nReplace the non‑streaming `MessageNew` call with `NewStreaming`, enabling real‑time chunk processing. Accumulate tool calls by content block index and sort them before emitting. Track token usage via `message_start` / `message_delta` events, merging output deltas with \n[…]\nccumulated tool call ordering, initial arguments fallback, cache token inclusion in input totals, assistant block input object serialisation, usage merge semantics, and default temperature resolution.",
"is_bot": false,
"headline": "feat(anthropic): migrate Complete to streaming API with accumulated t…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-15T05:07:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "db284acef9f0a559439496b836e2f0d91e83dc06",
"body": "- Update README and design docs to describe smart mode as a safety gate\n that judges safety, user intent, and boundaries—not a general tool-call\n optimizer.\n- Clarify editfile `target` parameter: default unique match, `\"all\"` for\n all, and `\"2\"` for 1‑based nth occurrence.\n- Rewrite guard_review prompt instructions to align with the refined\n smart mode scope.",
"is_bot": false,
"headline": "docs: refine guard smart mode description and editfile target examples",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-15T04:49:18Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e291702e2ea2de338d57cacc44f81c171e1e0a89",
"body": "The `mode` and `occurrence` properties are replaced by a single `target`\nproperty. `target` accepts:\n- omit (default) for unique replacement\n- \"all\" for replacing every match\n- a positive 1-based occurrence number as string (e.g. \"2\") for nth match\n\nThis simplifies the edit specification and eliminates invalid combinations\n(e.g. mode=\"unique\" with occurrence>0). All existing tests are updated\nto use the new field.",
"is_bot": false,
"headline": "feat(tools)!: replace mode/occurrence fields with unified target field",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-15T04:23:35Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "60bc57baac4c1e3a7bdecb75fcebe7b4b95881b6",
"body": "Update the EditFile tool spec descriptions and parsing error messages to\nclearly communicate when the `occurrence` field is required or must be\nomitted based on the `mode` value. Add tests that verify:\n\n- Zero `occurrence` is accepted for `unique` and `all` modes.\n- Positive `occurrence` is rejected for `unique` and `all` modes with a\n descriptive error.\n- `occurrence` is required when mode is `nth`.",
"is_bot": false,
"headline": "fix(tools): refine occurrence validation for EditFile mode values",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-14T14:58:44Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "671c82b38f1fbdda26fdcb6c3af25e4b724bc867",
"body": "… on in-window scroll\n\nThe `transcriptWindowSignature` no longer includes `YOffset`, so scrolling\nwithin the current overscan window does not invalidate the signature and\ndoes not trigger a `SetContentLines` call. `ScrollTranscript` now checks\n`canReuseTranscriptWindow` and, when the new offset stay\n[…]\ndow, only adjusts the viewport offset instead of rebuilding the content.\n\nThis reduces CPU churn during small scrolls and keeps the same block\ncontent visible while moving the logical scroll position.",
"is_bot": false,
"headline": "refactor(tui): remove YOffset from window signature and reuse content…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-14T09:42:16Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "1d08869801a3b79a037791b201aa1706e9526078",
"body": "…own cache\n\nReplace full-transcript `SetContent` with a windowed strategy: only the\nviewport's visible region plus overscan is built into blocks and fed to\nthe viewport. The `Model` retains a global block layout and `YOffset`,\nallowing `ScrollTranscript`, `PageTranscript`, and `SetTranscriptYOffset`\n[…]\naningful changed, reducing CPU churn on spinner/ticks.\n\nNew `transcript_test.go` covers windowed content bounds, unchanged\nwindow optimization, cache trimming, and full re-render after cache\neviction.",
"is_bot": false,
"headline": "perf(tui): implement windowed transcript rendering with bounded markd…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-14T07:18:28Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "31cdc5546e51e42ba6de519c789fa21265dbc851",
"body": "… TUI\n\nParses `reasoning_details` array from MiniMax M3 streaming delta,\nconcatenating `text` parts (filtered by optional `type`) into\nreasoning content. Adds MiniMax M3 / Split as a reasoning option\nin the TUI configuration page and includes an example model config\nin the documentation.",
"is_bot": false,
"headline": "feat(model): add reasoning_split parsing for MiniMax M3 and expose in…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-14T05:31:25Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ee09af9c88a87ac293167965df6a8b6179f2770b",
"body": "… search diagnostics\n\nReplaces the mutually exclusive `replace_all` boolean and `occurrence`\ninteger in editfile with a single `mode` parameter (`unique`, `nth`,\n`all`), simplifying the API and eliminating invalid parameter combos.\n\nAdds diagnostic messages to search results when no matches are found,\nreporting skipped-file statistics (binary, large, excluded, etc.), while\npreserving the existing metadata contract expected by the TUI.",
"is_bot": false,
"headline": "refactor(tools): replace boolean replace flags with mode enum and add…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-13T16:17:16Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "caf0d716dd7d99286b4b2ebac69a63e18f79f2c2",
"body": "…stream reading\n\nAdd a shared `ReadStreamTextWithIdle` function in the model package to\nsimplify LLM stream reading with idle timeout for non-Runner calls.\nDefine per-purpose idle timeout constants (compact, guard review, skill\nreview, memory compact).\n\nRefactor Runner's `readStream` to accept a tim\n[…]\n reading loops in agent skill adapters, tools,\nmemory compress, and memory worker with the new helper, improving\ncode consistency and timeout handling.\n\nAdd tests to verify timeout extension behavior.",
"is_bot": false,
"headline": "feat(runner): implement dynamic reasoning idle timeout and unify LLM …",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-13T16:00:07Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "34d5c4d83551066cabeb29def37891b875de4b0a",
"body": "Replace per-architecture build scripts (build-macos-arm64.sh, build-windows-amd64.sh)\nwith per-OS scripts (build-darwin.sh, build-linux.sh, build-windows.sh) that build\nboth arm64 and amd64 variants. This adds support for Linux and Windows arm64 targets.\n\nIntroduce `SUNA_BUILD_VERSION` environment v\n[…]\nme\nrelease, avoiding timestamp discrepancies.\n\nUpdate README and development docs to reflect the new build commands and warn\nagainst using `go run .` due to daemon/TUI process management requirements.",
"is_bot": false,
"headline": "feat(build): add per-platform multi-arch build scripts",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-12T04:43:34Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "e70ce2c92bdb8ce30a7bd13957ce692d247e606b",
"body": "Deprecate `go run .` usage for running Suna; the daemon and TUI rely on a stable executable path for local process management. Update instructions to use `go install .` or build a binary instead.",
"is_bot": false,
"headline": "docs(readme): clarify installation steps and recommend go install",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T13:46:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e1a9d8521fefe9f24841af45269e56176385b352",
"body": "…ation\n\nRemove the redundant destination path display from the extra details row of FS change summaries. The full action/path/destination is already shown in the main tool entry line, so repeating the path here added visual clutter. The compact summary now focuses on key metadata (entry kind, recursive, size) instead.\n\nUpdate test to ensure the FS path appears only once in the rendered output.",
"is_bot": false,
"headline": "refactor(tui): compact filesystem change summary to avoid path duplic…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T13:44:13Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "9f34e240c3d2334b49611553a5dd3342325410bd",
"body": "- Rewrite README with new structure emphasizing design philosophy,\n highlights, and quickstart over feature enumeration\n- Add docs/design.md explaining key design decisions (TUI+daemon\n separation, Guard system, context management)\n- Add docs/subtask.md documenting the intelligent model routing sy\n[…]\ned as three tiers: README (project\nshowcase), docs/ (implementation facts), and plans/ (historical\nrecords). Each tier has a clear purpose to avoid confusion between\ncurrent behavior and future plans.",
"is_bot": false,
"headline": "docs(readme): rewrite project documentation and add design docs",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T13:34:40Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "c5db31ab7656d142d69581023677c3d9b77914c7",
"body": "Replace the flat \"active memory\" model with a structured user profile\nmemory that tracks source, confidence, and evidence for each memory\nitem. Introduce ExtractCandidate to replace JudgeSignificance, using\nrule-based extraction that only processes user signals and ignores\nassistant output. Update t\n[…]\ntured\ncandidates, and adjust the worker compaction logic to handle the new\nfields. Rename all internal references from \"active memory\" to \"user\nprofile memory\" across code, documentation, and prompts.",
"is_bot": false,
"headline": "refactor(memory): migrate to structured user profile memory system",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T11:58:15Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "22ad628413b11921c7ff7948395736725e5675ad",
"body": "…d examples\n\nEnhance the `Search` tool specification by improving parameter descriptions to\ninclude default values, range limits, and concrete examples. The tool-level\ndescription now advises using this over shell grep/find. These changes make the\ntool spec more self-documenting and reduce ambiguity for downstream consumers.",
"is_bot": false,
"headline": "chore(builtin): refine search tool spec descriptions with defaults an…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T10:53:47Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "997c9692a94eafb1de4ed5f4204bf403b64cfead",
"body": "…entifiers\n\nReplace hardcoded `/Users/alanchen/` paths with `/Users/me/` and\nremove the specific example domain `dreamfield.top` from test\nassertions and the agent overview document. This ensures the\ncodebase does not expose personal user data and that tests remain\ndeterministic regardless of the developer's environment.",
"is_bot": false,
"headline": "chore: sanitize test fixtures and documentation to remove personal id…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T10:45:23Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "555b780908aad4d3365cc1ddb1acfb326df63eae",
"body": "…or editfile and writefile\n\nThe previous descriptions for EditFile and WriteFile were ambiguous or\ndid not clearly distinguish their intended use cases. Update the short\ndescriptions to better explain atomically targeted edits versus whole-file\nreplacement, and clarify the mode parameter enum with examples.",
"is_bot": false,
"headline": "fix(builtin): correct tool descriptions and parameter documentation f…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T10:32:04Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "1815d12db7f64ce8d12af88ee63ae420c8baf087",
"body": "… truncation logic\n\nThe path field was not consistently populated across all tool result\nmetadata and the truncation logic added complexity without meaningful\nbenefit. The summary now focuses solely on operation, line deltas, and\nreplacements, making it more robust and easier to maintain.",
"is_bot": false,
"headline": "refactor(toolview): simplify file change summary by removing path and…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T10:21:19Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "e45e43a5cf7decfa7b38e2fa680255ee47c5b8cc",
"body": "Replace scattered per-interaction fields (PendingAskID, PendingAskOptions,\nPendingGuard, PendingImagePaste, ConfirmDiscardDraft) with a single\ninteraction queue. Each interaction is now represented by an Interaction\nstruct with a Kind field, and the model exposes typed accessor methods\n(ActiveAsk, A\n[…]\nImagePaste, etc.). This reduces state\nduplication, simplifies routing in RouteKey, and allows future\ninteractions (e.g., model picker, attachment confirm) to be added\nwithout touching multiple fields.",
"is_bot": false,
"headline": "refactor(tui): unify pending interactions into a generic queue system",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T10:17:09Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "347dc910521dc5b39c82e8fd7f67ab171186fd6c",
"body": null,
"is_bot": false,
"headline": "feat(tui): add subtask completion waiting indicator and status label",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T09:51:28Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "ca7ecd529bf6b83dd8c5ac3055de471ab97d4b59",
"body": "…ss.Width\n\n- Introduce `searchSummary` to display mode label, query, and compacted path\n- Replace `compactSummary` with `compactText` using lipgloss.Width for accurate rune-aware truncation\n- Apply `CompactPath` directly to file paths for readfile/listdir/writefile/editfile tools\n- Add tests verifying search query and path suffix preservation",
"is_bot": false,
"headline": "feat(toolview): add search summary and improve truncation with lipglo…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T09:34:41Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "179cbc29e7a1cb5636dda6a29da00b653e4ec9ec",
"body": "Ctrl+Up jumps to the start of the last assistant message, Ctrl+Down returns to\nthe bottom of the transcript. When a response is longer than the viewport, a\nhint is shown in the input area. Position tracking resets on new input to\nensure navigation reflects the latest assistant response.",
"is_bot": false,
"headline": "feat(tui): add keyboard shortcuts for response navigation",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T09:26:32Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "4c847ca084ac2cdcdb920667802eaf263c27c92c",
"body": "Automatic context compression in runner previously did not commit the compacted\nsession state immediately. A new `OnCompactCommit` hook now calls\n`commitCompactState`, which saves the state with a 3-second timeout context.\nWhen compact returns no state, the fallback `saveConversationState` is still\ncalled. This ensures the session state is always persisted after compression\nand prevents stale or missing state on subsequent requests.",
"is_bot": false,
"headline": "fix(agent): persist compacted session state via OnCompactCommit hook",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T08:54:46Z",
"body_truncated": false,
"is_coding_agent": false
},
{
"oid": "d0928b1296be13e876194c879d192af615168483",
"body": "…ve editfile, readfile, writefile\n\nReplace the split readhttp/writehttp pair with a unified HTTP tool supporting GET, HEAD, POST, PUT, PATCH, DELETE methods. Add FileSystem tool for stat/mkdir/move/copy/remove operations and Search tool for file name and content search with safe defaults. Enhance Ed\n[…]\n new tool set.\n\nBREAKING CHANGE: Remove readhttp and writehttp tools; use http tool with method parameter.\nBREAKING CHANGE: EditFile schema changes from single old_string/new_string to an edits array.",
"is_bot": false,
"headline": "feat(tools): add structured filesystem, http, and search tools; impro…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-11T08:39:02Z",
"body_truncated": true,
"is_coding_agent": false
},
{
"oid": "7bede7e376fa8c93814ae04b7226a6765655a4a2",
"body": "…e message wrapping\n\nThe session state was previously embedded as a system message in the message\nlist, requiring special handling in the memory package (IsSessionStateMessage,\nSplitSessionStateMessages, NewSessionStateMessage). This polluted working\nmemory and complicated compression logic.\n\nNow, s\n[…]\nt.go, memory/compress.go to stop\n injecting/parsing session state messages.\n- Update all providers to accept and inject session state.\n- Update runner to pass session state through CompletionRequest.",
"is_bot": false,
"headline": "refactor(model): move session state into provider layer, remove inlin…",
"author_name": "alanchen",
"author_login": "alanchenchen",
"committed_at": "2026-06-10T15:44:26Z",
"body_truncated": true,
"is_coding_agent": false
}
],
"releases_count": 24,
"commits_last_year": 207,
"latest_release_at": "2026-07-27T13:43:03Z",
"latest_release_tag": "v0.13.3",
"releases_from_tags": false,
"days_since_last_push": 0,
"active_weeks_last_year": 12,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.1
},
"community": {
"has_readme": true,
"has_license": true,
"has_description": true,
"has_contributing": false,
"health_percentage": 42,
"has_issue_template": false,
"has_code_of_conduct": false,
"has_pull_request_template": false
},
"ecosystem": {
"packages": [
{
"name": "github.com/alanchenchen/suna",
"exists": true,
"license": null,
"keywords": [],
"ecosystem": "go",
"matches_repo": true,
"registry_url": "https://pkg.go.dev/github.com/alanchenchen/suna",
"is_deprecated": false,
"latest_version": "v0.13.3",
"repository_url": "https://github.com/alanchenchen/suna",
"versions_count": 20,
"total_downloads": null,
"dependents_count": null,
"deprecation_note": null,
"maintainers_count": null,
"monthly_downloads": null,
"first_published_at": null,
"latest_published_at": "2026-07-27T13:21:36Z",
"latest_version_yanked": null,
"days_since_latest_publish": 0
}
]
},
"popularity": {
"forks": 3,
"stars": 14,
"watchers": 0,
"fork_history": {
"days": [
{
"date": "2026-06-11",
"count": 1
},
{
"date": "2026-06-12",
"count": 1
},
{
"date": "2026-06-22",
"count": 1
}
],
"complete": true,
"collected": 3,
"total_forks": 3
},
"star_history": null,
"open_issues_and_prs": 0
},
"ai_readiness": {
"has_nix": false,
"example_dirs": [],
"has_llms_txt": false,
"has_dockerfile": false,
"has_mcp_signal": false,
"bootstrap_files": [],
"api_schema_files": [],
"has_devcontainer": false,
"typecheck_configs": [],
"toolchain_manifests": [
"go.mod"
],
"largest_source_bytes": 54111,
"source_files_sampled": 353,
"oversized_source_files": 0,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 9372
},
"dependencies": {
"manifests": [
"go.mod"
],
"advisories": {
"error": null,
"scope": null,
"source": null,
"findings": [],
"collected": false,
"malicious": [],
"truncated": false,
"by_severity": {},
"advisory_count": 0,
"affected_count": 0,
"assessed_count": 0,
"malicious_count": 0,
"assessed_package": null,
"unassessed_count": 0,
"direct_affected_count": 0
},
"ecosystems": [
"go"
],
"dependencies": [
{
"name": "charm.land/bubbles/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.1.0"
},
{
"name": "charm.land/bubbletea/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.6"
},
{
"name": "charm.land/glamour/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.0"
},
{
"name": "charm.land/lipgloss/v2",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v2.0.3"
},
{
"name": "github.com/BurntSushi/toml",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/Microsoft/go-winio",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.6.2"
},
{
"name": "github.com/anthropics/anthropic-sdk-go",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.40.0"
},
{
"name": "github.com/charmbracelet/x/ansi",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.11.7"
},
{
"name": "github.com/google/uuid",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.6.0"
},
{
"name": "github.com/openai/openai-go/v3",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v3.37.0"
},
{
"name": "golang.design/x/clipboard",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v0.8.0"
},
{
"name": "modernc.org/sqlite",
"manifest": "go.mod",
"ecosystem": "go",
"version_constraint": "v1.50.0"
}
],
"all_dependencies": {
"error": "GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository",
"source": null,
"packages": [],
"collected": false,
"truncated": false,
"total_count": null,
"direct_count": null,
"indirect_count": null
}
},
"maintainership": {
"issues": {
"open_prs": 0,
"merged_prs": 0,
"open_issues": 0,
"closed_ratio": null,
"closed_issues": 0,
"closed_unmerged_prs": 0
},
"bus_factor": 1,
"bot_contributors": 0,
"top_contributors": [
{
"type": "User",
"login": "alanchenchen",
"commits": 207,
"avatar_url": "https://avatars.githubusercontent.com/u/23295628?v=4"
}
],
"contributors_sampled": 1,
"top_contributor_share": 1
},
"quality_signals": {
"has_ci": true,
"has_tests": true,
"ci_workflows": [
"release.yml"
],
"has_docs_dir": true,
"linter_configs": [],
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"security_signals": {
"lockfiles": [
"go.sum"
],
"scorecard": {
"checks": [
{
"name": "Binary-Artifacts",
"score": 10,
"reason": "no binaries found in the repo",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#binary-artifacts"
},
{
"name": "Branch-Protection",
"score": 0,
"reason": "branch protection not enabled on development/release branches",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#branch-protection"
},
{
"name": "CI-Tests",
"score": null,
"reason": "no pull request found",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#ci-tests"
},
{
"name": "CII-Best-Practices",
"score": 0,
"reason": "no effort to earn an OpenSSF best practices badge detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#cii-best-practices"
},
{
"name": "Code-Review",
"score": 0,
"reason": "Found 0/30 approved changesets -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#code-review"
},
{
"name": "Contributors",
"score": 3,
"reason": "project has 1 contributing companies or organizations -- score normalized to 3",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#contributors"
},
{
"name": "Dangerous-Workflow",
"score": 10,
"reason": "no dangerous workflow patterns detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dangerous-workflow"
},
{
"name": "Dependency-Update-Tool",
"score": 0,
"reason": "no update tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#dependency-update-tool"
},
{
"name": "Fuzzing",
"score": 10,
"reason": "project is fuzzed",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#fuzzing"
},
{
"name": "License",
"score": 9,
"reason": "license file detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#license"
},
{
"name": "Maintained",
"score": 0,
"reason": "project was created within the last 90 days. Please review its contents carefully",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#maintained"
},
{
"name": "Packaging",
"score": null,
"reason": "packaging workflow not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#packaging"
},
{
"name": "Pinned-Dependencies",
"score": 0,
"reason": "dependency not pinned by hash detected -- score normalized to 0",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#pinned-dependencies"
},
{
"name": "SAST",
"score": 0,
"reason": "no SAST tool detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#sast"
},
{
"name": "Security-Policy",
"score": 0,
"reason": "security policy file not detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#security-policy"
},
{
"name": "Signed-Releases",
"score": 0,
"reason": "Project has not signed or included provenance with any releases.",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#signed-releases"
},
{
"name": "Token-Permissions",
"score": 0,
"reason": "detected GitHub workflow tokens with excessive permissions",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#token-permissions"
},
{
"name": "Vulnerabilities",
"score": 0,
"reason": "21 existing vulnerabilities detected",
"documentation_url": "https://github.com/ossf/scorecard/blob/c395761df6afe1a69e476bc60a013a94bcbc153f/docs/checks.md#vulnerabilities"
}
],
"commit": "f3d7a7faf4d97ea61ca235579369bd33546ef1cb",
"ran_at": "2026-07-28T06:02:10Z",
"aggregate_score": 2.6,
"scorecard_version": "v5.5.0"
},
"has_codeql_workflow": false,
"has_security_policy": false,
"has_dependabot_config": false
},
"contribution_flow": {
"collected": true,
"ci_last_run_at": "2026-07-27T13:43:19Z",
"oldest_open_prs": [],
"last_merged_pr_at": null,
"ci_last_conclusion": "SUCCESS",
"oldest_open_issues": []
}
},
"config": {
"disabled_metrics": [],
"disabled_categories": [],
"disabled_components": {}
},
"source": {
"url": "https://github.com/alanchenchen/suna",
"host": "github.com",
"name": "suna",
"owner": "alanchenchen"
},
"metrics": {
"overall": {
"key": "overall",
"band": "weak",
"name": "Overall health",
"note": "The weighted overall 49 is calibrated to 48 on the published index scale (record calibration 2026-08-02).",
"notes": [
{
"code": "overall_calibration",
"params": {
"raw": 49,
"calibrated": 48,
"calibration": "2026-08-02"
}
}
],
"value": 48,
"inputs": {
"security": 26,
"vitality": 73,
"community": 32,
"governance": 38,
"calibration": "2026-08-02",
"engineering": 66,
"ai_readiness": 74,
"weighted_overall_raw": 49
},
"components": []
},
"categories": [
{
"key": "vitality",
"band": "good",
"name": "Vitality",
"value": 73,
"weight": 0.21,
"metrics": [
{
"key": "development_activity",
"band": "moderate",
"name": "Development activity",
"note": null,
"notes": [],
"value": 62,
"inputs": {
"commits_last_year": 207,
"human_commit_share": 1,
"days_since_last_push": 0,
"active_weeks_last_year": 12
},
"components": [
{
"key": "push_recency",
"name": "Push recency",
"detail": "last push 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "push_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "commit_cadence",
"name": "Commit cadence",
"detail": "12/52 weeks with commits",
"points": 8.3,
"status": "partial",
"details": [
{
"code": "commit_cadence_weeks",
"params": {
"weeks": 12
}
}
],
"max_points": 36
},
{
"key": "commit_volume",
"name": "Commit volume",
"detail": "207 commits in the last year",
"points": 18,
"status": "met",
"details": [
{
"code": "commits_last_year",
"params": {
"count": 207
}
}
],
"max_points": 18
},
{
"key": "openssf_scorecard_maintained",
"name": "OpenSSF Scorecard: Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "release_discipline",
"band": "excellent",
"name": "Release discipline",
"note": null,
"notes": [],
"value": 90,
"inputs": {
"releases_count": 24,
"latest_release_tag": "v0.13.3",
"releases_from_tags": false,
"days_since_latest_release": 0,
"mean_days_between_releases": 2.1
},
"components": [
{
"key": "ships_releases",
"name": "Ships releases",
"detail": "24 releases published",
"points": 27,
"status": "met",
"details": [
{
"code": "releases_published",
"params": {
"count": 24
}
}
],
"max_points": 27
},
{
"key": "release_recency",
"name": "Release recency",
"detail": "latest release 0 days ago",
"points": 36,
"status": "met",
"details": [
{
"code": "release_recency",
"params": {
"days": 0
}
}
],
"max_points": 36
},
{
"key": "release_cadence",
"name": "Release cadence",
"detail": "a release every ~2.1 days",
"points": 27,
"status": "met",
"details": [
{
"code": "release_cadence",
"params": {
"gap": 2.1
}
}
],
"max_points": 27
},
{
"key": "openssf_scorecard_signed_releases",
"name": "OpenSSF Scorecard: Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "abandonment",
"band": "exceptional",
"name": "Abandonment",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"cap": null,
"state": "unverified",
"guards": [],
"signals": [],
"red_flag": false,
"multiplier_pct": 100,
"declared_reason": null,
"unverified_reason": "repository_too_young",
"unanswered_open_prs": null,
"unanswered_open_issues": null,
"days_since_last_merged_pr": null,
"days_since_last_human_commit": null,
"days_since_last_human_commit_is_floor": false
},
"components": [
{
"key": "project_is_still_maintained",
"name": "Project is still maintained",
"detail": "maintenance record not established from the collected data",
"points": 100,
"status": "met",
"details": [
{
"code": "abandonment_unverified",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Is the project alive — is code being written and are releases shipping?"
},
{
"key": "community",
"band": "at_risk",
"name": "Community & Adoption",
"value": 32,
"weight": 0.17,
"metrics": [
{
"key": "popularity",
"band": "at_risk",
"name": "Popularity & adoption",
"note": null,
"notes": [],
"value": 21,
"inputs": {
"forks": 3,
"stars": 14,
"watchers": 0,
"growth_state": "unverified",
"growth_factor_pct": 100,
"growth_unverified_reason": "no_history"
},
"components": [
{
"key": "stars",
"name": "Stars",
"detail": "14 stars",
"points": 18.1,
"status": "partial",
"details": [
{
"code": "stars",
"params": {
"count": 14
}
}
],
"max_points": 60
},
{
"key": "forks",
"name": "Forks",
"detail": "3 forks",
"points": 2.5,
"status": "partial",
"details": [
{
"code": "forks",
"params": {
"count": 3
}
}
],
"max_points": 25
},
{
"key": "watchers",
"name": "Watchers",
"detail": "0 watchers",
"points": 0,
"status": "missed",
"details": [
{
"code": "watchers",
"params": {
"count": 0
}
}
],
"max_points": 15
}
]
},
{
"key": "community_health",
"band": "weak",
"name": "Community health",
"note": null,
"notes": [],
"value": 44,
"inputs": {
"has_readme": true,
"has_license": true,
"readme_badges": null,
"has_contributing": false,
"has_issue_template": false,
"has_code_of_conduct": false,
"readme_badge_services": [],
"has_pull_request_template": false
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 22.5,
"status": "met",
"details": [],
"max_points": 22.5
},
{
"key": "license",
"name": "License",
"detail": "license file present, not a recognized license",
"points": 16.9,
"status": "partial",
"details": [
{
"code": "license_custom",
"params": {}
}
],
"max_points": 22.5
},
{
"key": "contributing_guide",
"name": "CONTRIBUTING guide",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 18
},
{
"key": "code_of_conduct",
"name": "Code of conduct",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 13.5
},
{
"key": "issue_template",
"name": "Issue template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.2
},
{
"key": "pr_template",
"name": "PR template",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.3
}
]
}
],
"description": "Does the project have users, downloads, attention, and a welcoming setup for contributors?"
},
{
"key": "governance",
"band": "weak",
"name": "Sustainability & Governance",
"value": 38,
"weight": 0.23,
"metrics": [
{
"key": "maintainer_resilience",
"band": "critical",
"name": "Maintainer resilience (bus factor)",
"note": null,
"notes": [],
"value": 13,
"inputs": {
"bus_factor": 1,
"contributors_sampled": 1,
"top_contributor_share": 1
},
"components": [
{
"key": "bus_factor",
"name": "Bus factor",
"detail": "1 contributor(s) cover half of all commits",
"points": 9,
"status": "partial",
"details": [
{
"code": "bus_factor",
"params": {
"count": 1
}
}
],
"max_points": 54
},
{
"key": "commit_distribution",
"name": "Commit distribution",
"detail": "top contributor authored 100% of commits",
"points": 0,
"status": "missed",
"details": [
{
"code": "top_contributor_share",
"params": {
"share": 100
}
}
],
"max_points": 22.5
},
{
"key": "contributor_breadth",
"name": "Contributor breadth",
"detail": "1 contributors",
"points": 1.4,
"status": "partial",
"details": [
{
"code": "contributors_sampled",
"params": {
"count": 1
}
}
],
"max_points": 13.5
},
{
"key": "openssf_scorecard_contributors",
"name": "OpenSSF Scorecard: Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 3,
"status": "partial",
"details": [],
"max_points": 10
}
]
},
{
"key": "responsiveness",
"band": "critical",
"name": "Issue & PR responsiveness",
"note": "Excluded from scoring (no data or not applicable): Issue resolution, PR acceptance, Newcomer PR acceptance. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"issue_resolution",
"pr_acceptance",
"newcomer_pr_acceptance"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 1,
"inputs": {
"merged_prs": 0,
"open_issues": 0,
"closed_issues": 0,
"prs_merged_7d": null,
"prs_decided_7d": null,
"prs_merged_30d": null,
"prs_decided_30d": null,
"issue_closed_ratio": null,
"closed_unmerged_prs": 0,
"first_time_authors_30d": null,
"first_time_prs_merged_30d": null,
"first_time_prs_decided_30d": null
},
"components": [
{
"key": "issue_resolution",
"name": "Issue resolution",
"detail": "no issues or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_issues_or_data",
"params": {}
}
],
"max_points": 42
},
{
"key": "pr_acceptance",
"name": "PR acceptance",
"detail": "no decided pull requests or no data",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_decided_prs_or_data",
"params": {}
}
],
"max_points": 30
},
{
"key": "newcomer_pr_acceptance",
"name": "Newcomer PR acceptance",
"detail": "no first-time contributor's PR decided in 30d",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_newcomer_prs",
"params": {
"days": 30
}
}
],
"max_points": 13
},
{
"key": "openssf_scorecard_code_review",
"name": "OpenSSF Scorecard: Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
}
]
},
{
"key": "stewardship",
"band": "moderate",
"name": "Ownership & stewardship",
"note": "Excluded from scoring (no data or not applicable): Verified domain. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"verified_domain"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 56,
"inputs": {
"followers": 43,
"owner_type": "User",
"is_verified": null,
"owner_login": "alanchenchen",
"public_repos": 34,
"account_age_days": 3550
},
"components": [
{
"key": "ownership_backing",
"name": "Ownership backing",
"detail": "personal (user) account",
"points": 10,
"status": "partial",
"details": [
{
"code": "owner_personal",
"params": {}
}
],
"max_points": 30
},
{
"key": "verified_domain",
"name": "Verified domain",
"detail": "not applicable to user accounts",
"points": 0,
"status": "excluded",
"details": [
{
"code": "not_applicable_to_user_accounts",
"params": {}
}
],
"max_points": 20
},
{
"key": "owner_reach",
"name": "Owner reach",
"detail": "43 followers of alanchenchen",
"points": 11.8,
"status": "partial",
"details": [
{
"code": "owner_followers",
"params": {
"count": 43,
"login": "alanchenchen"
}
}
],
"max_points": 25
},
{
"key": "track_record",
"name": "Track record",
"detail": "34 public repos, account ~9 yr old",
"points": 23.2,
"status": "partial",
"details": [
{
"code": "public_repos",
"params": {
"count": 34
}
},
{
"code": "account_age_years",
"params": {
"years": 9
}
}
],
"max_points": 25
}
]
},
{
"key": "package_maintenance",
"band": "exceptional",
"name": "Package maintenance",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"packages": [
"github.com/alanchenchen/suna"
],
"ecosystems": "go",
"any_deprecated": false,
"min_days_since_publish": 0
},
"components": [
{
"key": "published_resolvable",
"name": "Published & resolvable",
"detail": "1 package(s) on go",
"points": 25,
"status": "met",
"details": [
{
"code": "packages_published",
"params": {
"count": 1,
"ecosystems": "go"
}
}
],
"max_points": 25
},
{
"key": "publish_recency",
"name": "Publish recency",
"detail": "latest publish 0 days ago",
"points": 35,
"status": "met",
"details": [
{
"code": "publish_recency",
"params": {
"days": 0
}
}
],
"max_points": 35
},
{
"key": "version_history",
"name": "Version history",
"detail": "20 published versions",
"points": 20,
"status": "met",
"details": [
{
"code": "published_versions",
"params": {
"count": 20
}
}
],
"max_points": 20
},
{
"key": "not_deprecated",
"name": "Not deprecated",
"detail": "active, not deprecated or yanked",
"points": 20,
"status": "met",
"details": [
{
"code": "package_not_deprecated",
"params": {}
}
],
"max_points": 20
}
]
}
],
"description": "Will the project survive its people — bus factor, responsiveness, who backs it, and package upkeep?"
},
{
"key": "engineering",
"band": "good",
"name": "Engineering Quality",
"value": 66,
"weight": 0.19,
"metrics": [
{
"key": "engineering_practices",
"band": "moderate",
"name": "Engineering practices",
"note": "Excluded from scoring (no data or not applicable): OpenSSF Scorecard: CI-Tests. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"openssf_scorecard_ci_tests"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 60,
"inputs": {
"has_ci": true,
"has_tests": true,
"has_editorconfig": false,
"has_linter_config": false,
"has_precommit_config": false
},
"components": [
{
"key": "ci_workflows",
"name": "CI workflows",
"detail": "1 workflow(s)",
"points": 24,
"status": "met",
"details": [
{
"code": "ci_workflows",
"params": {
"count": 1
}
}
],
"max_points": 24
},
{
"key": "tests_present",
"name": "Tests present",
"detail": null,
"points": 24,
"status": "met",
"details": [],
"max_points": 24
},
{
"key": "linter_config",
"name": "Linter config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 16
},
{
"key": "pre_commit_hooks",
"name": "Pre-commit hooks",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 9.6
},
{
"key": "editorconfig",
"name": ".editorconfig",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 6.4
},
{
"key": "openssf_scorecard_ci_tests",
"name": "OpenSSF Scorecard: CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 20
}
]
},
{
"key": "documentation",
"band": "good",
"name": "Documentation",
"note": null,
"notes": [],
"value": 75,
"inputs": {
"topics": [
"agent-runtime",
"ai-agent",
"local-first",
"terminal-ai"
],
"has_wiki": false,
"homepage": null,
"has_readme": true,
"has_docs_dir": true,
"has_description": true
},
"components": [
{
"key": "readme",
"name": "README",
"detail": null,
"points": 30,
"status": "met",
"details": [],
"max_points": 30
},
{
"key": "documentation_directory",
"name": "Documentation directory",
"detail": null,
"points": 25,
"status": "met",
"details": [],
"max_points": 25
},
{
"key": "documentation_homepage_site",
"name": "Documentation / homepage site",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "repository_description",
"name": "Repository description",
"detail": null,
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "topics",
"name": "Topics",
"detail": "4 topics",
"points": 10,
"status": "met",
"details": [
{
"code": "topics_count",
"params": {
"count": 4
}
}
],
"max_points": 10
},
{
"key": "wiki",
"name": "Wiki",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
}
],
"description": "Are baseline engineering and documentation practices in place?"
},
{
"key": "security",
"band": "at_risk",
"name": "Security",
"value": 26,
"weight": 0.16,
"metrics": [
{
"key": "security_posture",
"band": "at_risk",
"name": "Security posture",
"note": "Excluded from scoring (no data or not applicable): CI-Tests, Packaging. Remaining weights renormalized.",
"notes": [
{
"code": "excluded_no_data",
"params": {
"components": [
"ci_tests",
"packaging"
]
}
},
{
"code": "weights_renormalized",
"params": {}
}
],
"value": 26,
"inputs": {
"source": "openssf_scorecard",
"checks_evaluated": 16,
"scorecard_version": "v5.5.0",
"checks_inconclusive": 2,
"scorecard_aggregate": 2.6
},
"components": [
{
"key": "binary_artifacts",
"name": "Binary-Artifacts",
"detail": "no binaries found in the repo",
"points": 7.5,
"status": "met",
"details": [],
"max_points": 7.5
},
{
"key": "branch_protection",
"name": "Branch-Protection",
"detail": "branch protection not enabled on development/release branches",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "ci_tests",
"name": "CI-Tests",
"detail": "no pull request found",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 2.5
},
{
"key": "cii_best_practices",
"name": "CII-Best-Practices",
"detail": "no effort to earn an OpenSSF best practices badge detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 2.5
},
{
"key": "code_review",
"name": "Code-Review",
"detail": "Found 0/30 approved changesets -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "contributors",
"name": "Contributors",
"detail": "project has 1 contributing companies or organizations -- score normalized to 3",
"points": 0.8,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "dangerous_workflow",
"name": "Dangerous-Workflow",
"detail": "no dangerous workflow patterns detected",
"points": 10,
"status": "met",
"details": [],
"max_points": 10
},
{
"key": "dependency_update_tool",
"name": "Dependency-Update-Tool",
"detail": "no update tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "fuzzing",
"name": "Fuzzing",
"detail": "project is fuzzed",
"points": 5,
"status": "met",
"details": [],
"max_points": 5
},
{
"key": "license",
"name": "License",
"detail": "license file detected",
"points": 2.2,
"status": "partial",
"details": [],
"max_points": 2.5
},
{
"key": "maintained",
"name": "Maintained",
"detail": "project was created within the last 90 days. Please review its contents carefully",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "packaging",
"name": "Packaging",
"detail": "packaging workflow not detected",
"points": 0,
"status": "excluded",
"details": [
{
"code": "no_data",
"params": {}
}
],
"max_points": 5
},
{
"key": "pinned_dependencies",
"name": "Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "sast",
"name": "SAST",
"detail": "no SAST tool detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "security_policy",
"name": "Security-Policy",
"detail": "security policy file not detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 5
},
{
"key": "signed_releases",
"name": "Signed-Releases",
"detail": "Project has not signed or included provenance with any releases.",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "token_permissions",
"name": "Token-Permissions",
"detail": "detected GitHub workflow tokens with excessive permissions",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
},
{
"key": "vulnerabilities",
"name": "Vulnerabilities",
"detail": "21 existing vulnerabilities detected",
"points": 0,
"status": "missed",
"details": [],
"max_points": 7.5
}
]
},
{
"key": "high_risk_jurisdiction_exposure",
"band": "exceptional",
"name": "High-Risk Jurisdiction Exposure",
"note": "Only high-confidence self-published location evidence affects this multiplier. Ambiguous matches are review-only; country evidence is not proof of nationality, citizenship, legal registration, malicious intent, or sanctions status.",
"notes": [
{
"code": "jurisdiction_evidence_limits",
"params": {}
}
],
"value": 100,
"inputs": {
"meaning": "self-published location evidence; not nationality or citizenship",
"red_flag": false,
"exposures": [],
"policy_countries": [
"Russia",
"Iran",
"North Korea"
],
"commit_weight_rule": {
"min_commits": 50,
"min_commit_share": 0.1
},
"review_only_matches": 0,
"below_threshold_exposures": [],
"assessed_self_published_locations": 3
},
"components": [
{
"key": "policy_exposure_multiplier",
"name": "Policy exposure multiplier",
"detail": "no confirmed policy-scope location match",
"points": 100,
"status": "met",
"details": [
{
"code": "jurisdiction_no_match",
"params": {}
}
],
"max_points": 100
}
]
}
],
"description": "Are visible security and supply-chain practices strong, with no malicious dependency and no unresolved high-risk jurisdiction exposure?"
},
{
"key": "ai_readiness",
"band": "good",
"name": "AI Readiness",
"value": 74,
"weight": 0.04,
"metrics": [
{
"key": "ai_agent_context",
"band": "excellent",
"name": "Agent context & guidance",
"note": null,
"notes": [],
"value": 85,
"inputs": {
"has_llms_txt": false,
"legible_history_share": 1,
"agent_instruction_files": [
"AGENTS.md"
],
"agent_instruction_max_bytes": 9372
},
"components": [
{
"key": "agent_instructions",
"name": "Agent instructions",
"detail": "AGENTS.md",
"points": 45,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "AGENTS.md"
}
}
],
"max_points": 45
},
{
"key": "machine_readable_docs_llms_txt",
"name": "Machine-readable docs (llms.txt)",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 15
},
{
"key": "legible_commit_history",
"name": "Legible commit history",
"detail": "100 of 100 human commits state their intent (structured subject or explanatory body)",
"points": 40,
"status": "met",
"details": [
{
"code": "legible_history",
"params": {
"legible": 100,
"sampled": 100
}
}
],
"max_points": 40
}
]
},
{
"key": "ai_verify_loop",
"band": "moderate",
"name": "Verify loop (build / test / typecheck)",
"note": null,
"notes": [],
"value": 56,
"inputs": {
"has_nix": false,
"has_tests": true,
"lockfiles": [
"go.sum"
],
"has_dockerfile": false,
"typed_language": true,
"bootstrap_files": [],
"has_devcontainer": false,
"has_linter_config": false,
"typecheck_configs": [],
"agent_commit_share": 0,
"toolchain_manifests": [
"go.mod"
],
"dependency_bot_commit_share": 0
},
"components": [
{
"key": "one_command_bootstrap",
"name": "One-command bootstrap",
"detail": "go.mod (toolchain convention, no task runner)",
"points": 12.6,
"status": "partial",
"details": [
{
"code": "toolchain_convention",
"params": {
"files": "go.mod"
}
}
],
"max_points": 18
},
{
"key": "automated_tests",
"name": "Automated tests",
"detail": null,
"points": 22,
"status": "met",
"details": [],
"max_points": 22
},
{
"key": "lint_format_config",
"name": "Lint / format config",
"detail": null,
"points": 0,
"status": "missed",
"details": [],
"max_points": 11
},
{
"key": "static_type_checking",
"name": "Static type checking",
"detail": "Go (statically typed)",
"points": 11,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 11
},
{
"key": "reproducible_environment",
"name": "Reproducible environment",
"detail": "lockfile",
"points": 10,
"status": "met",
"details": [
{
"code": "file_list",
"params": {
"files": "lockfile"
}
}
],
"max_points": 10
},
{
"key": "demonstrated_agent_practice",
"name": "Demonstrated agent practice",
"detail": "no agent-authored commits among the last 100",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_agent_authored_commits",
"params": {
"sampled": 100
}
}
],
"max_points": 10
},
{
"key": "automated_maintenance",
"name": "Automated maintenance",
"detail": "no automated dependency updates observed",
"points": 0,
"status": "missed",
"details": [
{
"code": "no_dependency_automation",
"params": {}
}
],
"max_points": 8
},
{
"key": "openssf_scorecard_pinned_dependencies",
"name": "OpenSSF Scorecard: Pinned-Dependencies",
"detail": "dependency not pinned by hash detected -- score normalized to 0",
"points": 0,
"status": "missed",
"details": [],
"max_points": 10
}
]
},
{
"key": "ai_code_legibility",
"band": "exceptional",
"name": "Code legibility for models",
"note": null,
"notes": [],
"value": 100,
"inputs": {
"primary_language": "Go",
"largest_source_bytes": 54111,
"source_files_sampled": 353,
"oversized_source_files": 0
},
"components": [
{
"key": "type_checkable_code",
"name": "Type-checkable code",
"detail": "Go (statically typed)",
"points": 45,
"status": "met",
"details": [
{
"code": "statically_typed_language",
"params": {
"language": "Go"
}
}
],
"max_points": 45
},
{
"key": "manageable_file_sizes",
"name": "Manageable file sizes",
"detail": "0/353 source files over 60KB",
"points": 55,
"status": "met",
"details": [
{
"code": "oversized_source_files",
"params": {
"kb": 60,
"sampled": 353,
"oversized": 0
}
}
],
"max_points": 55
}
]
}
],
"description": "How well is the repo equipped to be developed and maintained with AI coding agents? Carries a deliberately small weight: agent tooling is a real maintenance signal, but its absence must never gate the top of the scale (calibration saturates at raw 91, so 100/100 remains reachable with AI Readiness at zero)."
}
],
"classification": {
"labels": [
"library"
],
"scores": {
"library": 6
},
"primary": "library",
"evidence": [
{
"tier": "distribution",
"label": "library",
"source": "registry:go",
"weight": 6
}
],
"artifacts": [],
"confidence": "medium",
"host_extension": false,
"runs_as_process": false,
"consumed_by_code": true
},
"metrics_version": "2.3.1"
},
"warnings": [
"Star history unavailable: GitHub GraphQL error: Resource not accessible by personal access token",
"GitHub dependency-graph SBOM unavailable (404); the dependency graph may be disabled for this repository"
],
"report_type": "repository",
"generated_at": "2026-07-28T06:02:15.006607Z",
"schema_version": "0.27.0",
"badge_url": "https://raw.githubusercontent.com/inspect-software/badges/main/v1/a/alanchenchen/suna.svg",
"full_name": "alanchenchen/suna",
"license_state": "custom",
"license_spdx": null
}