Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
131 commits
Select commit Hold shift + click to select a range
971b459
Merge pull request #967 from ChronoAIProject/sync/post-release-v0.11.0
chronoai-shining Jun 9, 2026
dccb5af
feat(web): assistant SSE event union + message types (#970)
chronoai-shining Jun 9, 2026
92938b6
feat(web): session-scoped assistant chat store (#970)
chronoai-shining Jun 9, 2026
eb983d3
feat(web): assistant SSE stream client (#970)
chronoai-shining Jun 9, 2026
e0b9255
feat(web): useAssistantChat send/stream hook (#970)
chronoai-shining Jun 9, 2026
b74a97e
feat(web): add assistant surface flags to provider model types (#970)
chronoai-shining Jun 9, 2026
c109f26
feat(web): assistant surface column in ProviderModelsDrawer (#970)
chronoai-shining Jun 9, 2026
8ba6290
feat(web): show assistant-enabled model count in providers list (#970)
chronoai-shining Jun 9, 2026
aea9642
feat(api): introduce 'assistant' LLM surface — model flags + settings…
chronoai-shining Jun 9, 2026
9c51e29
feat(api): wire assistant surface into model picker + execute resolve…
chronoai-shining Jun 9, 2026
b6c33aa
chore(web): drop unused ReactNode import in ProviderModelsDrawer test…
chronoai-shining Jun 9, 2026
b7260fb
feat(web): Ornn Assistant widget — launcher + slide-in chat panel (#970)
chronoai-shining Jun 9, 2026
5813604
feat(web): mount Ornn Assistant in the authed app shell (#970)
chronoai-shining Jun 9, 2026
3de9095
feat(api): add assistant knowledge-base module — budget, distiller, l…
chronoai-shining Jun 9, 2026
318a720
feat(api): build-assistant-kb script + committed grounding digest (#970)
chronoai-shining Jun 9, 2026
77dc8f2
feat(api): extend quota Surface with 'assistant' (reserve/charge only…
chronoai-shining Jun 9, 2026
f61f946
feat(api): assistant scoped retrieval + context assembly + chat servi…
chronoai-shining Jun 9, 2026
3721224
feat(api): POST /api/v1/assistant/chat SSE endpoint + wiring (#970)
chronoai-shining Jun 9, 2026
dfad20a
feat(api): register assistant/chat in the OpenAPI spec (#970)
chronoai-shining Jun 9, 2026
d641c97
docs: changeset for Ornn Assistant (#970)
chronoai-shining Jun 9, 2026
012a558
docs: document /assistant/chat SSE + error reuse (#970)
chronoai-shining Jun 9, 2026
d600e65
fix(web): align assistant usage fields to backend contract (#970)
chronoai-shining Jun 9, 2026
447bbc9
fix(web): a11y — dialog focus trap + 44px header touch targets (#970)
chronoai-shining Jun 9, 2026
33ed266
fix(api): restrict assistant KB to user-relevant doc sections (#970)
chronoai-shining Jun 9, 2026
78a3f46
ci: gate assistant KB digest freshness (#970, MAJOR-1)
chronoai-shining Jun 9, 2026
758eed4
test(web): dedicated unit test for assistantStreamApi (#970)
chronoai-shining Jun 9, 2026
c41c8f9
Merge pull request #975 from ChronoAIProject/feature/ornn-assistant-c…
chronoai-shining Jun 9, 2026
7862409
feat(web): add assistant sign-in + mascot greeting i18n keys (#976)
chronoai-shining Jun 9, 2026
3d9abd4
feat(web): redesign AssistantWidget — mascot launcher, anon gate, aut…
chronoai-shining Jun 9, 2026
b7d67ef
feat(web): mount AssistantWidget globally for anonymous + landing vis…
chronoai-shining Jun 9, 2026
ae666a7
docs: changeset for Ornn Assistant UX redesign (#976)
chronoai-shining Jun 9, 2026
39e29a0
fix(web): tone down assistant launcher glow for DESIGN.md compliance …
chronoai-shining Jun 9, 2026
7804b69
fix(web): show assistant errors inline in the panel (#976)
chronoai-shining Jun 9, 2026
db0489e
chore(web): add forge launcher/greet assets (#976)
chronoai-shining Jun 9, 2026
6e85f74
feat(web): forge-hammering video launcher + greet imagery (#976)
chronoai-shining Jun 9, 2026
c4537fc
[Feature] Skill dependencies — declare prerequisite skills in metadat…
chronoai-shining Jun 9, 2026
7fe3558
[Feature] Skillsets — typed, versioned skill bundles (revive #916 wit…
chronoai-shining Jun 9, 2026
0eae4a2
[Feature] Skillset master prompt — required usage-instructions (entry…
chronoai-shining Jun 9, 2026
dc2b5ee
chore(api): refresh assistant KB digest for skillset docs (#968, #969…
chronoai-shining Jun 9, 2026
14fbf3e
Merge pull request #982 from ChronoAIProject/feature/promote-skillset…
chronoai-shining Jun 9, 2026
c1632ba
chore(web): add floating Ornn cutout assets (#976)
chronoai-shining Jun 9, 2026
4bb20e2
feat(web): floating-character launcher; forge video moves into panel …
chronoai-shining Jun 9, 2026
7d6d739
feat(web): skillset api client + hooks + types (#1059)
chronoai-shining Jun 10, 2026
243f972
feat(web): skillset UI components (#1059)
chronoai-shining Jun 10, 2026
8bf1049
feat(web): skillset pages — explore/detail/new/edit/my (#1059)
chronoai-shining Jun 10, 2026
5fb39a5
feat(web): wire skillset routes + nav + i18n (#1059)
chronoai-shining Jun 10, 2026
d27cbc7
fix(web): satisfy root ESLint for skillset UI (#1059)
chronoai-shining Jun 10, 2026
a3593e7
Merge pull request #1062 from ChronoAIProject/feature/skillset-ui-to-…
chronoai-shining Jun 10, 2026
d16e57e
Merge remote-tracking branch 'origin/develop' into feature/assistant-…
chronoai-shining Jun 10, 2026
7917ff6
Merge pull request #1063 from ChronoAIProject/feature/assistant-anon-…
chronoai-shining Jun 10, 2026
77cbb52
[Feature] Skillset member-dependency graph — interactive, stored in t…
chronoai-shining Jun 10, 2026
b38a3a7
Merge pull request #1066 from ChronoAIProject/feature/skillset-depgra…
chronoai-shining Jun 10, 2026
12afac9
[Feature] Rework skillset UI to mirror the registry + react-flow drag…
chronoai-shining Jun 10, 2026
8bcd379
Merge pull request #1069 from ChronoAIProject/feature/promote-1067-sk…
chronoai-shining Jun 10, 2026
53cb191
feat(web): stick node drags + stop teleport-on-edit in skillset depgr…
chronoai-shining Jun 10, 2026
44b98fc
feat(web): grabbable handles + silky motion + on-brand Controls skin …
chronoai-shining Jun 10, 2026
870f0b8
chore(web): add Tidy i18n key for the depgraph canvas (en+zh) (#1072)
chronoai-shining Jun 10, 2026
13f561a
docs: changeset for smoother skillset depgraph canvas (#1072)
chronoai-shining Jun 10, 2026
9d38c6e
Merge pull request #1073 from ChronoAIProject/feature/skillset-canvas…
chronoai-shining Jun 10, 2026
229e88e
fix(web): make skillset create/edit pages scroll (#1074)
chronoai-shining Jun 10, 2026
2383088
feat(web): compact 2-col metadata grid in the skillset form (#1074)
chronoai-shining Jun 10, 2026
c692d0d
fix(web): let a plain wheel scroll the page over the depgraph canvas …
chronoai-shining Jun 10, 2026
12d23c1
docs: changeset for skillset form scroll + compact layout (#1074)
chronoai-shining Jun 10, 2026
a81fff4
Merge pull request #1075 from ChronoAIProject/feature/skillset-form-c…
chronoai-shining Jun 10, 2026
942ecbf
fix(web): viewport-locked two-pane skillset detail with RailCard sect…
chronoai-shining Jun 10, 2026
1533ba9
fix(web): skillset hero footer + varied pill trio to match the skill …
chronoai-shining Jun 10, 2026
0c23921
docs: changeset for skillset detail parity (#1076)
chronoai-shining Jun 10, 2026
c51a103
Merge pull request #1077 from ChronoAIProject/feature/skillset-ui-parity
chronoai-shining Jun 10, 2026
c223225
fix(web): restore breadcrumb + quota chip on skillset routes (#1078)
chronoai-shining Jun 10, 2026
8a756da
fix(web): drop version badge from skillset browse card for SkillCard …
chronoai-shining Jun 10, 2026
fc90136
docs: changeset for skillset breadcrumb + quota fix (#1078)
chronoai-shining Jun 10, 2026
5a341d1
Merge pull request #1079 from ChronoAIProject/feature/skillset-breadc…
chronoai-shining Jun 10, 2026
8ed443b
feat(api): add q keyword filter to skillset-search (#1080)
chronoai-shining Jun 11, 2026
26fe226
feat(web): keyword search on skillset browse + drop per-card edit but…
chronoai-shining Jun 11, 2026
36b2e65
feat(web): SkillsetMemberViewer — read-only member skill-package view…
chronoai-shining Jun 11, 2026
f32003d
feat(web): skillset detail left pane = member viewer; master prompt i…
chronoai-shining Jun 11, 2026
cfef24f
docs: changeset for skillset search + member viewer (#1080)
chronoai-shining Jun 11, 2026
486ff2a
polish(web): match search icon, remount preview on member switch, fix…
chronoai-shining Jun 11, 2026
8adbc9f
Merge pull request #1081 from ChronoAIProject/feature/skillset-search…
chronoai-shining Jun 11, 2026
3f5af1e
feat(web): restructure skillset detail layout per feedback (#1082)
chronoai-shining Jun 11, 2026
c11b7df
Merge pull request #1083 from ChronoAIProject/feature/skillset-detail…
chronoai-shining Jun 11, 2026
ba8e82d
docs(skills): add skillset lifecycle to agent "always load" checklist…
chronoai-shining Jun 11, 2026
fb263b8
feat(web): smaller font in skillset closure content + rename "Resolve…
chronoai-shining Jun 11, 2026
5605bb0
feat(web): make skillset members clickable linking to skill details page
chronoai-shining Jun 11, 2026
2a93d35
feat(web): remove permissions button from skillset hero; only keep ed…
chronoai-shining Jun 11, 2026
460281a
feat(web): move version to right-rail Versions card on skillset detai…
chronoai-shining Jun 11, 2026
d2c498b
chore: add changeset for skillset details UI changes (# per request)
chronoai-shining Jun 11, 2026
a0f8134
fix: remove unused ReactNode import from SkillsetHeroStrip (causing t…
chronoai-shining Jun 11, 2026
acf2291
fix: update SkillsetHeroStrip and SkillsetMemberViewer tests after mo…
chronoai-shining Jun 11, 2026
51124e8
fix: update MemberViewer switch test to click the button element (Lin…
chronoai-shining Jun 11, 2026
1d1bf28
fix(web): correct member links to Closure list only (revert from Memb…
chronoai-shining Jun 11, 2026
ba16507
fix(test): wrap SkillsetClosureViewer tests in MemoryRouter (Link add…
chronoai-shining Jun 11, 2026
adda9d3
Merge pull request #1086 from ChronoAIProject/feature/skillset-work
chronoai-shining Jun 11, 2026
beb2d41
fix: remove lingering unused ReactNode import in SkillsetHeroStrip (b…
chronoai-shining Jun 11, 2026
a263f62
fix(web): correct links only in Closure (revert MemberViewer); Versio…
chronoai-shining Jun 11, 2026
b42c51a
fix(web): make dependency graph significantly taller by giving its Ra…
chronoai-shining Jun 11, 2026
8518ade
fix(web): make skillset member dep graph span its RailCard space (no …
chronoai-shining Jun 11, 2026
f5761dc
fix(web): skillset member picker requires explicit skill + version se…
chronoai-shining Jun 11, 2026
59738ce
chore: merge origin/develop into fix/skillset-depgraph-spacing (resol…
chronoai-shining Jun 11, 2026
ecf05bc
chore: merge origin/develop into fix/skillset-member-version-select (…
chronoai-shining Jun 11, 2026
51dd80d
Merge branch 'fix/skillset-member-version-select' into develop
chronoai-shining Jun 11, 2026
5a3de4c
feat(web): auto-bump version on skillset edit publish + quick +patch/…
chronoai-shining Jun 11, 2026
add83c9
fix(web): correct TS in bumpVersion (use safe parse, avoid destructur…
chronoai-shining Jun 11, 2026
8aa0b13
feat(web): member dep graph uses full canvas; remove permanent below …
chronoai-shining Jun 11, 2026
5ced8d2
feat(web): use react-flow canvas for member dep graph read-only (prop…
chronoai-shining Jun 11, 2026
3404fe6
feat(web): modernize graph nodes/edges (letterpress cards, thicker ar…
chronoai-shining Jun 11, 2026
52b6e43
fix(web): memoize SkillsetDependencyGraph + stable useCallback for on…
chronoai-shining Jun 11, 2026
2978601
fix(web): stabilize graphMembers + depEdges with useMemo (keyed on st…
chronoai-shining Jun 11, 2026
7d0eb01
fix(web): add min-h-[200px] to read-only canvas wrapper in SkillsetDe…
chronoai-shining Jun 11, 2026
9d1d03a
fix(web): make onNodeMouseEnter and popup position fully defensive wi…
chronoai-shining Jun 11, 2026
79f5040
chore: add changeset for skillset edit auto version bump and graph fixes
chronoai-shining Jun 11, 2026
d49f741
fix(web): restructure canvas hooks to be unconditional (fix Rules of …
chronoai-shining Jun 11, 2026
07c9440
fix(web): make CI green — version bump semantics, unused setter, drop…
chronoai-shining Jun 11, 2026
e468349
fix(ci): drop committed node_modules symlinks that broke docker-build…
chronoai-shining Jun 11, 2026
ded45cb
Merge pull request #1091 from ChronoAIProject/feature/skillset-graph-…
chronoai-shining Jun 11, 2026
3118759
feat(web): modern Forge card nodes + arc edges + blueprint grid for t…
chronoai-shining Jun 11, 2026
aeac986
Merge pull request #1093 from ChronoAIProject/feature/skillset-graph-…
chronoai-shining Jun 11, 2026
dff741d
feat(web): animated edges + 'runs before' labels + read-only zoom + p…
chronoai-shining Jun 11, 2026
7aaa9fe
Merge pull request #1095 from ChronoAIProject/feature/skillset-graph-…
chronoai-shining Jun 11, 2026
c03fbf4
chore(deps)(deps): bump the bun-minor-and-patch group across 1 direct…
dependabot[bot] Jun 12, 2026
b4b3545
chore(ci)(deps): bump the actions-all group across 1 directory with 2…
dependabot[bot] Jun 12, 2026
0c40ac3
chore(docker)(deps): bump oven/bun from 1.3.13 to 1.3.14 in /ornn-web…
dependabot[bot] Jun 12, 2026
ea269c4
chore(docker)(deps): bump oven/bun from 1.3.13 to 1.3.14 in /ornn-api…
dependabot[bot] Jun 12, 2026
f1ad2f7
[Misc] Gate/scope user-directory enumeration on /users/search and /us…
chronoai-shining Jun 12, 2026
041edec
feat(api): launch-promo foundation — admin manual award + /me status …
chronoai-shining Jun 12, 2026
850eef7
fix(api): normalize chat-completion tool calls into Responses events …
chronoai-shining Jun 12, 2026
aeab6cb
docs: README conversion polish — value-prop bullets, Try Ornn free, s…
chronoai-shining Jun 12, 2026
fe70690
feat(web): skillset detail graph — fixed popup, node drag, independen…
chronoai-shining Jun 12, 2026
0e0dfa7
feat(web): landing popups, graph popup click-to-open, assistant posit…
chronoai-shining Jun 12, 2026
e4e0f15
feat(web): skill explorer + landing popup glass fix (#1100) (#1103)
chronoai-shining Jun 12, 2026
f13f0d9
docs: release notes for 2026-06-12 release (#1104)
chronoai-shining Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/assistant-mascot-ux.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": minor
---

Ornn Assistant is now a branded, always-available presence: the widget appears for anonymous visitors (including the landing page) as a draggable, animated Ornn-mascot launcher, auto-expands once on a first visit, and prompts sign-in when a logged-out visitor tries to send. Backend remains authenticated-only.
6 changes: 6 additions & 0 deletions .changeset/auto-816-user-directory-enumeration.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"ornn-api": patch
"ornn-web": patch
---

Harden the user-directory endpoints against enumeration: /users/search now rejects empty and single-character queries, and both /users/search and /users/resolve are rate-limited per user. The collaborator typeahead asks for at least 2 characters before searching.
2 changes: 2 additions & 0 deletions .changeset/big-moments-unite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
---
---
27 changes: 27 additions & 0 deletions .changeset/chat-completion-tool-calls-608.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
---
"ornn-api": patch
---

NyxLlmClient now normalizes Chat Completions tool-call deltas into the same Responses-API `response.output_item.done` / `function_call` events the playground tool loop already consumes (#608).

Background: #574 routed chat-completion providers to `/chat/completions` and translated text deltas, but the stream parser ignored `choices[].delta.tool_calls`. The playground tool-use loop in `chatService.ts` only matches on Responses-API `response.output_item.done` with `item.type === "function_call"`, so when a chat-completion provider (DeepSeek, Together, any OpenAI-compat gateway) responded with a tool call, no `function_call` event ever reached the loop. The model's `execute_in_sandbox(...)` invocation arrived as plain assistant text and got rendered as JSON in the chat instead of being executed — runtime-based and mixed skills appeared to "respond" without ever running the sandbox.

Fix: `parseChatCompletionStream` keeps a per-index `Map<number, ToolCallAccumulator>` carrying `{id, name, arguments}`. Each `choices[].delta.tool_calls[]` chunk merges into its index buffer (id + name arrive on the first chunk for that call; the `arguments` JSON string accumulates across many chunks). A turn flushes when any of: explicit `finish_reason` (`tool_calls`, `stop`, anything non-null), upstream `[DONE]` sentinel, or stream EOF — whichever fires first. A `flushed` guard makes flush idempotent so we never double-emit if multiple end signals fire.

The synthesized event matches the Responses-API shape `chatService.ts` already validates with Zod (`outputItemDoneEventSchema`):

```js
{
type: "response.output_item.done",
item: {
type: "function_call",
id, call_id, name, arguments, // arguments is the accumulated JSON string
},
}
```

This way zero changes are needed in `chatService.ts` — its existing `pendingToolCall` capture + `executeToolCall` dispatch path works for both upstream formats now.

Parallel tool calls within one assistant turn are supported (one done event per index, emitted in index order). Missing `index` falls back to 0 (treated as a single tool call). Streams that close without `[DONE]` or `finish_reason` still flush at EOF so a buffered call is never lost.

Coverage: 6 new tests appended to `src/clients/nyxid/llm.test.ts` — chunked accumulation + finish_reason flush, EOF flush without [DONE], parallel tool calls, idempotent flush across finish_reason+[DONE], intermixed text+tool deltas (correct event order), missing `index` fallback. All 17 tests in the file green; full ornn-api suite has no new regressions.
5 changes: 5 additions & 0 deletions .changeset/feat-1059-skillset-web-ui.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": minor
---

Skillset web UI (#1059). A full web surface for the #969 skillsets backend, mirroring the existing skills UI. Browse skillsets at `/skillsets` (one page, tabs Public / Mine / Shared-with-me via `?scope`, with `kind` + `tag` filters and pagination), open a skillset at `/skillsets/:idOrName` (`?version` resolves a specific published version; the page surfaces the name, description, kind, the rendered master prompt, the member list, the server-flattened dependency closure, visibility, and a version picker), create at `/skillsets/new`, publish a new version at `/skillsets/:id/edit` (name locked, version required + bumped), and manage your own at `/my-skillsets`. Owners get a per-skillset permissions editor (public / org / user grants) and a delete flow. The member picker enforces the v1 rules client-side (2–100 members, no nested `skillset:` refs, no self-reference), and the master-prompt editor enforces the required, trimmed 1–8000-char body. New nav entries: "Skillsets" in the top nav and "My Skillsets" in the account menu. All copy is keyed under `skillset*` i18n namespaces in both English and Chinese.
7 changes: 7 additions & 0 deletions .changeset/feat-1064-skillset-member-dependency-graph.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"ornn-web": minor
---

Skillset member-dependency graph (#1064). A skillset author can now declare a "runs before" dependency graph between member skills, visualised with Mermaid. In the create/publish form, a new dependency-graph editor sits between the member picker and the master prompt: click a member, then another, to draw an edge; edges show as removable chips with a live diagram preview and a non-blocking advisory when the members form a cycle. The skillset detail page renders the graph read-only (with pan / zoom / lightbox) under a "Member dependencies" section, with an empty state when no dependencies are declared.

Edges are persisted ENTIRELY inside the skillset's master prompt (`instructions`) as a single managed, comment-fenced Mermaid block — no new backend field, no new API call, and no change to any member skill's metadata or package. The graph is a pure projection of the one `instructions` state: the codec preserves the author's prose byte-for-byte across round-trips and treats any absent / unknown / garbled block as "no edges", so it is forward-compatible and never corrupts a prompt. Distinct from the #968 skill-intrinsic dependency closure. New copy is keyed under the `skillsetGraph` i18n namespace in English and Chinese. No new runtime dependency — reuses the already-installed Mermaid renderer.
5 changes: 5 additions & 0 deletions .changeset/feat-1067-skillset-registry-ui-react-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": minor
---

Rework the skillset UI to mirror the skill registry + a drag-on-canvas dependency editor (#1067). The skill registry shell is now factored into shared, reusable shells — `RegistryTabs`, `RegistrySidebar` (FilterSection / FilterChipList / FilterChip / FilterEmpty), `RegistryGrid`, `DetailHeroStrip`, and `RailCard` — consumed by BOTH the skill and skillset pages so the two surfaces read identically. The skillset browse page (`/skillsets`) gains a left filter `aside` (Kind chip section + Tags input) and the shared cards grid; it deliberately mounts NO keyword search bar because the skillset-search backend has no `q` param. The skillset detail page (`/skillsets/:idOrName`) now renders a `SkillsetHeroStrip` (kind / visibility / version pills + owner Edit / Permissions) and wraps its rail sections (Members / Metadata / Visibility / Danger zone) in the shared `RailCard`. The member-dependency editor (#1064) is rebuilt on `@xyflow/react`: a lazy-loaded, drag-on-canvas graph where dragging between members declares "runs before", with a keyboard-accessible click-to-connect mirror, removable edge chips, and a non-blocking cycle advisory. The react-flow chunk loads ONLY on the create/edit form — the read-only detail page keeps the lightweight Mermaid render. Dependency edges remain a pure projection of the master prompt's managed block; the graph editor never mutates a member skill.
6 changes: 6 additions & 0 deletions .changeset/feat-968-skill-dependencies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"ornn-api": minor
"@chronoai/ornn-sdk": minor
---

Skill dependencies (#968). Skills can now declare other skills they depend on via the `metadata.depends-on` SKILL.md frontmatter field — each entry pins one skill by `<name-or-guid>@<major.minor>` or `<name>@<dist-tag>` (no semver ranges, no self-references; max 50 direct deps). The full transitive closure is validated at publish time (`POST /skills`, `PUT /skills/:id`): missing dependencies, cycles, and conflicting versions of the same skill are rejected before the version is committed. A new `GET /api/v1/skills/:idOrName/closure` endpoint resolves and returns the full closure in deps-first topological order, scoped to what the caller may read. Three new error codes: `dependency_cycle` (409), `dependency_conflict` (409), `skill_dependency_not_found` (404). The TypeScript SDK gains `resolveClosure` / `pullClosure`; the Python SDK gains `resolve_closure` / `pull_closure`.
6 changes: 6 additions & 0 deletions .changeset/feat-969-skillsets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"ornn-api": minor
"@chronoai/ornn-sdk": minor
---

Skillsets (#969). A **skillset** is a named, versioned, owned, visibility-scoped meta-package that references N member skills and carries a `kind` (`generic` | `consensus-supported`). Skillsets mirror the skill ownership/visibility/immutable-versioning model and reuse the `ornn:skill:{create,read,update,delete}` permission scopes. New endpoints: `POST /api/v1/skillsets` (create, private by default), `GET /api/v1/skillsets/:idOrName` (detail), `GET /api/v1/skillsets/:idOrName/versions`, `GET /api/v1/skillsets/:idOrName/closure` (one-call resolve — the union of all members plus each member's #968 dependency closure, deduplicated + topo-sorted), `PUT /api/v1/skillsets/:id` (publish a new immutable version), `PUT /api/v1/skillsets/:id/permissions`, `DELETE /api/v1/skillsets/:id`, and `GET /api/v1/skillset-search` (discovery by kind / tags / scope). Members (2..N) are validated at publish time against the live skill graph via the #968 closure resolver — a missing/unreadable member or a conflicting union closure rejects the publish, reusing the `skill_dependency_not_found` / `dependency_cycle` / `dependency_conflict` codes verbatim. The TypeScript SDK gains `createSkillset` / `getSkillset` / `publishSkillset` / `setSkillsetPermissions` / `deleteSkillset` / `getSkillsetClosure` / `searchSkillsets`; the Python SDK gains `create_skillset` / `get_skillset` / `publish_skillset` / `set_skillset_permissions` / `delete_skillset` / `resolve_skillset_closure` / `search_skillsets`.
6 changes: 6 additions & 0 deletions .changeset/feat-970-ornn-assistant.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"ornn-api": minor
"ornn-web": minor
---

Add Ornn Assistant — an authenticated, repo-aware Q&A assistant. A new `/api/v1/assistant/chat` SSE endpoint and an in-app chat widget answer questions about Ornn and the skill catalog, grounded in a curated knowledge base plus visibility-scoped skill search (no private or PII data exposed). Admins can select the assistant model per provider. (#970)
6 changes: 6 additions & 0 deletions .changeset/feat-978-skillset-master-prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"ornn-api": minor
"@chronoai/ornn-sdk": minor
---

Skillset master prompt (#978). Skillsets now carry a **REQUIRED**, versioned `instructions` field — a markdown master prompt telling an agent HOW to use the set (orchestration, ordering, which member to pick when). It is required on BOTH create (`POST /api/v1/skillsets`) and publish (`PUT /api/v1/skillsets/:id`) with NO carry-forward: every published version explicitly restates its own master prompt (unlike `description`/`kind`/`tags`, which a publish may omit to inherit the prior value). `instructions` is 1..8000 chars, trimmed server-side (a whitespace-only body is rejected), and is distinct from the short `description` (≤1024 chars). It is stored opaque — Ornn does not render, sanitize, template, lint, or search-index it — and is surfaced verbatim on `GET /api/v1/skillsets/:idOrName` and as a root sibling of `items` on `GET /api/v1/skillsets/:idOrName/closure` (`{ data: { instructions, items }, error: null }`). The skill `/skills/:id/closure` envelope is unchanged. The TypeScript SDK adds `instructions` to `CreateSkillsetInput` / `PublishSkillsetInput` / `SkillsetDetail` and a new `SkillsetClosureResult` type returned by `getSkillsetClosure`; the Python SDK requires an `instructions` kwarg on `create_skillset` / `publish_skillset` and adds a new `SkillsetClosureResult` returned by `resolve_skillset_closure`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"ornn-web": minor
---

Skillset detail graph: switched read-only rendering from Mermaid to the react-flow canvas (proper canvas engine, same as editor) for much better space utilization, layout, pan/zoom and hover support. Removed the old direct-mermaid hover code.

Hover dialog for package preview is now larger (wider/taller, better padding/shadow).

Version auto-increaser in edit: removed patch button (and default now uses minor bump); only +minor / +major remain.

All per latest feedback. Tests/build updated.
5 changes: 5 additions & 0 deletions .changeset/feat-skillset-edit-auto-version-bump.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": minor
---

Skillset edit form: the "Version" field for publishing a new version is now automatically pre-filled with the next patch (e.g. 1.0 → 1.1) when you open the page. Three compact +patch / +minor / +major buttons appear directly under the input so you can change the bump level without typing. Manual editing still works. The "must be different from current" validation and server bump rules are unchanged. This removes the previous manual tag entry friction for the common case.
7 changes: 7 additions & 0 deletions .changeset/feat-skillset-graph-hover-package-preview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"ornn-web": minor
---

Skillset detail: the member dependencies graph (Mermaid) now occupies the full vertical space in the left column (permanent package viewer below it has been removed). Hovering a node in the graph shows a floating dialog containing the package preview for that skill (reuses the compact path of SkillsetMemberViewer).

To enable node hover detection the read-only graph now renders the Mermaid SVG directly (trusted source) instead of the sandboxed iframe, and MermaidBlock gained `direct` + `onNodeHover` support for this. Layout comments and one affected page test updated. The graph canvas is now fully utilized while the package viewer UX is preserved on-demand via hover.
5 changes: 5 additions & 0 deletions .changeset/fix-skillset-depgraph-graph-span.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": patch
---

Skillset detail: member dependencies graph now spans its full allocated RailCard height. Removed wasteful `my-4`/`p-4`/`minHeight`/`bg-page` chrome from the Mermaid container for the read-only case (via new optional `className` on `MermaidBlock`), wired `flex flex-col` on the graph's RailCard + `flex-1 min-h-0` so the diagram area claims the space after the card header. The SVG now utilizes the tall left column instead of sitting tiny inside large empty padding. (Also synced a stale HeroStrip test that was asserting removed version-picker/permissions UI.)
5 changes: 5 additions & 0 deletions .changeset/fix-skillset-member-picker-version-combo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": patch
---

Skillset create/edit form: the Members picker now requires an explicit skill + published-version combination. Clicking a skill from the name typeahead fetches its versions and shows a chooser (concrete `name@X.Y` entries, newest first with "latest" badge). Raw `name@ver` entry still works. This prevents accidentally pinning only a skill name (implicit latest); every added member ref is now a deliberate pinned combination, consistent with how members are modeled and displayed on the detail page (closure, graph, chips).
26 changes: 26 additions & 0 deletions .changeset/launch-promo-foundation-724.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
---
"ornn-api": minor
---

Launch-promo foundation — admin-driven manual award flow + caller status (#724, PR 1 of 2).

The landing/news page promises that the first 500 Ornn users who star the GitHub repo and sign in receive a redemption code (200 Playground + 200 Skill Generation credits) plus the NyxID invite code, delivered to the Ornn notification inbox within 24 h. This PR lands the foundation that lets an admin honour that promise today, and gives the calling user a way to see their eligibility.

What ships:

- **`launchPromo` settings section** — `enabled`, `repoOwner`, `repoName`, `totalSlots` (default 500), `awardPlayground` / `awardSkillGen` (default 200), `pollIntervalMs`, `codeExpiryDays`, `nyxidInviteCode`. Defaults are conservative (`enabled: false`, empty repo, empty invite code) so the promo stays dormant until an admin explicitly turns it on.
- **`launch_promo_claims` collection + repo** — one doc per awarded user, keyed on `_id = userId` for primary-key idempotency. Fields: `eligibilityRank`, `redemptionCodeId`, `awardedAt`, `awardedBy`, optional `githubLogin`. Index on `awardedAt desc` for admin observability.
- **`LaunchPromoService.awardUser({ userId, awardedBy, githubLogin? })`** — gates on enabled + rank ≤ `totalSlots` + slots remaining + not-already-claimed, mints a redemption code via the existing redemption-codes service (no quota write — user redeems themselves through Settings → Redeem), drops a `launchPromo.codeDelivered` notification containing the code + NyxID invite code, then records the claim. Duplicate-key during insert (race) cleanly resolves to `ALREADY_CLAIMED`. Notification failure is logged but doesn't roll back the claim — the user already has the grant; admins can resend.
- **`LaunchPromoService.getStatusForUser(userId)`** — composes `{ promoEnabled, claimed, rank, totalSlots, slotsRemaining, awardedAt }` for the `/me/launch-promo` endpoint.
- **`UserDirectoryRepository.getRegistrationRank(userId)`** — 1-based ordering by `firstSeenAt asc`. Two queries (PK lookup + filter count), no scan.
- **New `launchPromo.codeDelivered` NotificationCategory.**
- **Routes** — `GET /me/launch-promo`, `POST /admin/launch-promo/award/:userId` (gated on `ornn:admin:skill`), `GET /admin/launch-promo/recent` for observability. Service-layer error sentinels (`PROMO_DISABLED`, `RANK_EXCEEDED`, `SLOTS_EXHAUSTED`, `ALREADY_CLAIMED`, `USER_NOT_FOUND`) map to 400 / 403 / 409 / 404.

What is **deferred to PR 2** (clearly TODO in the design comments):

- GitHub stargazers HTTP client (public API, no auth) + cron loop driven by `pollIntervalMs`.
- NyxID → GitHub-login resolution (currently the manual admin flow doesn't need this; the cron path will once it lands).
- Frontend admin UI for the settings section + "recent awards" panel.
- Frontend caller-side display ("you're in the first N — claim ready / claimed").

Coverage: 12 colocated unit tests on `LaunchPromoService` covering the happy path, every error sentinel, race-on-insert resolving to `ALREADY_CLAIMED`, and notification-failure-does-not-rollback. All green.
5 changes: 5 additions & 0 deletions .changeset/nice-wolves-trade.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": minor
---

Restore landing announcement popups with glassmorphic style; skillset graph popup click-to-open with blurred backdrop; skill explorer for member picker with scope tabs and version selection; assistant mascot default position right-edge centered
4 changes: 4 additions & 0 deletions .changeset/readme-conversion-polish-640.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

Polish the top-level `README.md` ahead of launch traffic (#640). Three conversion-focused additions: scannable value-prop bullets at the top of "What is Ornn" so visitors see the three reasons to care in one glance; a new "Try Ornn free" section between Quickstart and the comparison table that hooks readers with the launch perk (first 500 users · 400 free GPT-5.5 conversations) the moment they've learned how to use Ornn; and a quiet star CTA above License. README content only, no version bump.
5 changes: 5 additions & 0 deletions .changeset/skillset-breadcrumb-quota.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": patch
---

Restore the breadcrumb row + quota chip (playground + skill-gen pills) on the skillset pages (#1078): `useBreadcrumbs()` had no cases for `/skillsets*` routes, so `RootLayout` hid the whole breadcrumb bar — and with it the auth-only `QuotaChip` — on every skillset page. Adds breadcrumb trails for the skillset browse / detail / new / edit / mine routes (resolving GUID→name like the skill route). Also drops the version badge from the skillset browse card so its badge row matches `SkillCard` (which surfaces version only on the detail page).
5 changes: 5 additions & 0 deletions .changeset/skillset-detail-parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": patch
---

Bring the skillset detail page to visual parity with the skill detail page (#1076): the two-pane layout is now viewport-locked with independently scrolling columns, the master-prompt / member-dependencies / resolved-closure sections use the shared RailCard chrome instead of bespoke cards, and the hero gains the owner + published/updated footer with a varied pill trio (kind · visibility · version).
5 changes: 5 additions & 0 deletions .changeset/skillset-detail-relayout.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"ornn-web": patch
---

Restructure the skillset detail page (#1082): the master prompt becomes the topmost full-width card (right under the hero, out of the right rail); the member-dependency graph moves into the left column above a slimmer fixed-height package viewer; and the package viewer's skill selector becomes a vertical list on the far left of the file tree (skills | files | content) instead of tabs on top. The right rail keeps metadata + resolved closure + visibility + danger; the fragile viewport-height lock is dropped in favor of natural page scroll.
Loading