From f945d0ee2c23d52c0252adeb689368c198d8e23c Mon Sep 17 00:00:00 2001 From: "ornn-release-bot[bot]" <283908294+ornn-release-bot[bot]@users.noreply.github.com> Date: Mon, 15 Jun 2026 13:16:31 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20version=20packages=20=E2=86=92=20v0.12?= =?UTF-8?q?.0=20(#1108)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: ornn-release-bot[bot] <283908294+ornn-release-bot[bot]@users.noreply.github.com> --- .changeset/assistant-mascot-ux.md | 5 -- .../auto-816-user-directory-enumeration.md | 6 -- .changeset/big-moments-unite.md | 2 - .changeset/chat-completion-tool-calls-608.md | 27 -------- .changeset/feat-1059-skillset-web-ui.md | 5 -- ...t-1064-skillset-member-dependency-graph.md | 7 -- ...at-1067-skillset-registry-ui-react-flow.md | 5 -- .changeset/feat-968-skill-dependencies.md | 6 -- .changeset/feat-969-skillsets.md | 6 -- .changeset/feat-970-ornn-assistant.md | 6 -- .changeset/feat-978-skillset-master-prompt.md | 6 -- ...per-canvas-hover-dialog-larger-no-patch.md | 11 ---- .../feat-skillset-edit-auto-version-bump.md | 5 -- ...at-skillset-graph-hover-package-preview.md | 7 -- .../fix-skillset-depgraph-graph-span.md | 5 -- ...ix-skillset-member-picker-version-combo.md | 5 -- .changeset/launch-promo-foundation-724.md | 26 -------- .changeset/nice-wolves-trade.md | 5 -- .changeset/readme-conversion-polish-640.md | 4 -- .changeset/skillset-breadcrumb-quota.md | 5 -- .changeset/skillset-detail-parity.md | 5 -- .changeset/skillset-detail-relayout.md | 5 -- .changeset/skillset-details-ui-parity.md | 5 -- .changeset/skillset-form-compact-scroll.md | 5 -- .changeset/skillset-graph-edges.md | 5 -- .changeset/skillset-graph-modern.md | 5 -- .../skillset-search-and-member-viewer.md | 6 -- .changeset/smooth-skillset-depgraph-canvas.md | 5 -- .changeset/warm-actors-call.md | 5 -- ornn-api/CHANGELOG.md | 65 +++++++++++++++++++ ornn-api/package.json | 2 +- ornn-web/CHANGELOG.md | 60 +++++++++++++++++ ornn-web/package.json | 2 +- sdk/typescript/CHANGELOG.md | 10 +++ sdk/typescript/package.json | 2 +- 35 files changed, 138 insertions(+), 203 deletions(-) delete mode 100644 .changeset/assistant-mascot-ux.md delete mode 100644 .changeset/auto-816-user-directory-enumeration.md delete mode 100644 .changeset/big-moments-unite.md delete mode 100644 .changeset/chat-completion-tool-calls-608.md delete mode 100644 .changeset/feat-1059-skillset-web-ui.md delete mode 100644 .changeset/feat-1064-skillset-member-dependency-graph.md delete mode 100644 .changeset/feat-1067-skillset-registry-ui-react-flow.md delete mode 100644 .changeset/feat-968-skill-dependencies.md delete mode 100644 .changeset/feat-969-skillsets.md delete mode 100644 .changeset/feat-970-ornn-assistant.md delete mode 100644 .changeset/feat-978-skillset-master-prompt.md delete mode 100644 .changeset/feat-graph-proper-canvas-hover-dialog-larger-no-patch.md delete mode 100644 .changeset/feat-skillset-edit-auto-version-bump.md delete mode 100644 .changeset/feat-skillset-graph-hover-package-preview.md delete mode 100644 .changeset/fix-skillset-depgraph-graph-span.md delete mode 100644 .changeset/fix-skillset-member-picker-version-combo.md delete mode 100644 .changeset/launch-promo-foundation-724.md delete mode 100644 .changeset/nice-wolves-trade.md delete mode 100644 .changeset/readme-conversion-polish-640.md delete mode 100644 .changeset/skillset-breadcrumb-quota.md delete mode 100644 .changeset/skillset-detail-parity.md delete mode 100644 .changeset/skillset-detail-relayout.md delete mode 100644 .changeset/skillset-details-ui-parity.md delete mode 100644 .changeset/skillset-form-compact-scroll.md delete mode 100644 .changeset/skillset-graph-edges.md delete mode 100644 .changeset/skillset-graph-modern.md delete mode 100644 .changeset/skillset-search-and-member-viewer.md delete mode 100644 .changeset/smooth-skillset-depgraph-canvas.md delete mode 100644 .changeset/warm-actors-call.md diff --git a/.changeset/assistant-mascot-ux.md b/.changeset/assistant-mascot-ux.md deleted file mode 100644 index d146e336..00000000 --- a/.changeset/assistant-mascot-ux.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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. diff --git a/.changeset/auto-816-user-directory-enumeration.md b/.changeset/auto-816-user-directory-enumeration.md deleted file mode 100644 index 77a0237b..00000000 --- a/.changeset/auto-816-user-directory-enumeration.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"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. diff --git a/.changeset/big-moments-unite.md b/.changeset/big-moments-unite.md deleted file mode 100644 index a845151c..00000000 --- a/.changeset/big-moments-unite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/chat-completion-tool-calls-608.md b/.changeset/chat-completion-tool-calls-608.md deleted file mode 100644 index 6d362e9f..00000000 --- a/.changeset/chat-completion-tool-calls-608.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -"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` 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. diff --git a/.changeset/feat-1059-skillset-web-ui.md b/.changeset/feat-1059-skillset-web-ui.md deleted file mode 100644 index 041669e5..00000000 --- a/.changeset/feat-1059-skillset-web-ui.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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. diff --git a/.changeset/feat-1064-skillset-member-dependency-graph.md b/.changeset/feat-1064-skillset-member-dependency-graph.md deleted file mode 100644 index c045c0f2..00000000 --- a/.changeset/feat-1064-skillset-member-dependency-graph.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"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. diff --git a/.changeset/feat-1067-skillset-registry-ui-react-flow.md b/.changeset/feat-1067-skillset-registry-ui-react-flow.md deleted file mode 100644 index be8b3a55..00000000 --- a/.changeset/feat-1067-skillset-registry-ui-react-flow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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. diff --git a/.changeset/feat-968-skill-dependencies.md b/.changeset/feat-968-skill-dependencies.md deleted file mode 100644 index 20911420..00000000 --- a/.changeset/feat-968-skill-dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"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 `@` or `@` (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`. diff --git a/.changeset/feat-969-skillsets.md b/.changeset/feat-969-skillsets.md deleted file mode 100644 index 2d50d725..00000000 --- a/.changeset/feat-969-skillsets.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"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`. diff --git a/.changeset/feat-970-ornn-assistant.md b/.changeset/feat-970-ornn-assistant.md deleted file mode 100644 index 166714ba..00000000 --- a/.changeset/feat-970-ornn-assistant.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"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) diff --git a/.changeset/feat-978-skillset-master-prompt.md b/.changeset/feat-978-skillset-master-prompt.md deleted file mode 100644 index 0fbc8f95..00000000 --- a/.changeset/feat-978-skillset-master-prompt.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"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`. diff --git a/.changeset/feat-graph-proper-canvas-hover-dialog-larger-no-patch.md b/.changeset/feat-graph-proper-canvas-hover-dialog-larger-no-patch.md deleted file mode 100644 index 62b982c5..00000000 --- a/.changeset/feat-graph-proper-canvas-hover-dialog-larger-no-patch.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -"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. \ No newline at end of file diff --git a/.changeset/feat-skillset-edit-auto-version-bump.md b/.changeset/feat-skillset-edit-auto-version-bump.md deleted file mode 100644 index 0262b517..00000000 --- a/.changeset/feat-skillset-edit-auto-version-bump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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. \ No newline at end of file diff --git a/.changeset/feat-skillset-graph-hover-package-preview.md b/.changeset/feat-skillset-graph-hover-package-preview.md deleted file mode 100644 index 85e26f25..00000000 --- a/.changeset/feat-skillset-graph-hover-package-preview.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -"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. \ No newline at end of file diff --git a/.changeset/fix-skillset-depgraph-graph-span.md b/.changeset/fix-skillset-depgraph-graph-span.md deleted file mode 100644 index a4c85246..00000000 --- a/.changeset/fix-skillset-depgraph-graph-span.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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.) \ No newline at end of file diff --git a/.changeset/fix-skillset-member-picker-version-combo.md b/.changeset/fix-skillset-member-picker-version-combo.md deleted file mode 100644 index 70befe6f..00000000 --- a/.changeset/fix-skillset-member-picker-version-combo.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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). \ No newline at end of file diff --git a/.changeset/launch-promo-foundation-724.md b/.changeset/launch-promo-foundation-724.md deleted file mode 100644 index 187b4c41..00000000 --- a/.changeset/launch-promo-foundation-724.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -"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. diff --git a/.changeset/nice-wolves-trade.md b/.changeset/nice-wolves-trade.md deleted file mode 100644 index 2d9edc38..00000000 --- a/.changeset/nice-wolves-trade.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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 diff --git a/.changeset/readme-conversion-polish-640.md b/.changeset/readme-conversion-polish-640.md deleted file mode 100644 index c6b2256c..00000000 --- a/.changeset/readme-conversion-polish-640.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -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. diff --git a/.changeset/skillset-breadcrumb-quota.md b/.changeset/skillset-breadcrumb-quota.md deleted file mode 100644 index 491f6c09..00000000 --- a/.changeset/skillset-breadcrumb-quota.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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). diff --git a/.changeset/skillset-detail-parity.md b/.changeset/skillset-detail-parity.md deleted file mode 100644 index 1aaf6b31..00000000 --- a/.changeset/skillset-detail-parity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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). diff --git a/.changeset/skillset-detail-relayout.md b/.changeset/skillset-detail-relayout.md deleted file mode 100644 index bc8b4b20..00000000 --- a/.changeset/skillset-detail-relayout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"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. diff --git a/.changeset/skillset-details-ui-parity.md b/.changeset/skillset-details-ui-parity.md deleted file mode 100644 index 8cdfed7f..00000000 --- a/.changeset/skillset-details-ui-parity.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": "minor" ---- - -feat(web): skillset details UI parity + polish (smaller closure font, "Closure" rename, member links to skills, remove perms from hero, versions card in right rail like skills) diff --git a/.changeset/skillset-form-compact-scroll.md b/.changeset/skillset-form-compact-scroll.md deleted file mode 100644 index 469fbbc0..00000000 --- a/.changeset/skillset-form-compact-scroll.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": patch ---- - -Fix the skillset create/edit page so it scrolls (its content was clipped by the overflow-hidden app shell — each page needs its own scroll container), and reorganize the metadata fields into a compact 2-column grid (name + version, description, kind + tags) so the member picker, dependency-graph canvas, and master prompt get the vertical room (#1074). diff --git a/.changeset/skillset-graph-edges.md b/.changeset/skillset-graph-edges.md deleted file mode 100644 index 9c0be01a..00000000 --- a/.changeset/skillset-graph-edges.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": patch ---- - -Dependency graph polish (#1094): the arc-blue edges now animate with a gentle flowing dash and carry a "runs before" label pill so the relationship direction is legible at a glance; the read-only detail-page graph gains zoom in/out/fit controls; and the on-hover package-preview dialog is bigger and no longer vanishes when you move the cursor toward it (a grace timer bridges the node→dialog gap and the dialog stays open while hovered). diff --git a/.changeset/skillset-graph-modern.md b/.changeset/skillset-graph-modern.md deleted file mode 100644 index f63dbe64..00000000 --- a/.changeset/skillset-graph-modern.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": patch ---- - -Modernize the member-dependency graph (#1092): replace react-flow's plain box nodes with a custom Forge card node — a code-glyph icon (arc-blue) + skill name + version, hairline border, letterpress hard-offset shadow, ember border on hover/selected. The read-only detail-page graph now also gets directed arc-blue edges with arrowheads (previously unstyled), and both the editor and read-only canvases gain a faint blueprint grid + vignette. Tokens-only per DESIGN.md (arc-blue diagrammatic accent, ember action accent, letterpress — no soft glow or gradient). diff --git a/.changeset/skillset-search-and-member-viewer.md b/.changeset/skillset-search-and-member-viewer.md deleted file mode 100644 index 376e7661..00000000 --- a/.changeset/skillset-search-and-member-viewer.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"ornn-api": minor -"ornn-web": minor ---- - -Skillset browse + detail upgrades (#1080): the browse page gains a keyword search box (new `q` param on `GET /skillset-search` — case-insensitive substring on name + description) and drops the per-card edit button (manage from the detail page). The skillset detail page's left pane becomes a member skill-package viewer — click any member skill in the set to view its files read-only, mirroring the skill detail page — and the master prompt moves into the top metadata card. The dependency graph and resolved closure are preserved as read-only rail cards. diff --git a/.changeset/smooth-skillset-depgraph-canvas.md b/.changeset/smooth-skillset-depgraph-canvas.md deleted file mode 100644 index ea8ddcca..00000000 --- a/.changeset/smooth-skillset-depgraph-canvas.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": patch ---- - -Smoother skillset dependency-graph canvas (#1072): dragging a node now sticks (was snapping home), drawing a dependency no longer teleports the layout, and the editor gains directed arrowheaded edges, grabbable handles, zoom Controls, a Tidy re-layout button, a taller canvas, and tweened motion — while node positions stay presentation-only (never persisted) and the dependency edges still live solely in the skillset master prompt. diff --git a/.changeset/warm-actors-call.md b/.changeset/warm-actors-call.md deleted file mode 100644 index 5d7f8bb4..00000000 --- a/.changeset/warm-actors-call.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"ornn-web": patch ---- - -Fix skillset detail graph hover popup to 800×40vh with independent pane scroll; enable node drag for repositioning diff --git a/ornn-api/CHANGELOG.md b/ornn-api/CHANGELOG.md index ae49756c..75d59a88 100644 --- a/ornn-api/CHANGELOG.md +++ b/ornn-api/CHANGELOG.md @@ -1,5 +1,70 @@ # ornn-api +## 0.12.0 + +### Minor Changes + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`c4537fc`](https://github.com/ChronoAIProject/Ornn/commit/c4537fc952b5a925c833d5eaf28898e4284625b6) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skill dependencies ([#968](https://github.com/ChronoAIProject/Ornn/issues/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 `@` or `@` (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`. + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`7fe3558`](https://github.com/ChronoAIProject/Ornn/commit/7fe3558ad81c5e19d761a5c0c0a3ac6b5c1ca0f9) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillsets ([#969](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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`. + +- [#975](https://github.com/ChronoAIProject/Ornn/pull/975) [`d641c97`](https://github.com/ChronoAIProject/Ornn/commit/d641c97d7c4e1a8ccfc721840f2ca4ace8191365) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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](https://github.com/ChronoAIProject/Ornn/issues/970)) + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`0eae4a2`](https://github.com/ChronoAIProject/Ornn/commit/0eae4a23b2e6b9046f2d0bfce708bee65515e1db) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset master prompt ([#978](https://github.com/ChronoAIProject/Ornn/issues/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`. + +- [#749](https://github.com/ChronoAIProject/Ornn/pull/749) [`041edec`](https://github.com/ChronoAIProject/Ornn/commit/041edecb4a29fe545acb94f756e32d44e2ae5217) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Launch-promo foundation — admin-driven manual award flow + caller status ([#724](https://github.com/ChronoAIProject/Ornn/issues/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. + +- [#1081](https://github.com/ChronoAIProject/Ornn/pull/1081) [`cfef24f`](https://github.com/ChronoAIProject/Ornn/commit/cfef24fe014050c2868ff8d2a508e67c0349a80c) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset browse + detail upgrades ([#1080](https://github.com/ChronoAIProject/Ornn/issues/1080)): the browse page gains a keyword search box (new `q` param on `GET /skillset-search` — case-insensitive substring on name + description) and drops the per-card edit button (manage from the detail page). The skillset detail page's left pane becomes a member skill-package viewer — click any member skill in the set to view its files read-only, mirroring the skill detail page — and the master prompt moves into the top metadata card. The dependency graph and resolved closure are preserved as read-only rail cards. + +### Patch Changes + +- [#845](https://github.com/ChronoAIProject/Ornn/pull/845) [`f1ad2f7`](https://github.com/ChronoAIProject/Ornn/commit/f1ad2f775362bdc66bdb267c04bf026146e24fa7) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#735](https://github.com/ChronoAIProject/Ornn/pull/735) [`850eef7`](https://github.com/ChronoAIProject/Ornn/commit/850eef7b720b6cec769e44378ad1ca7005d1c968) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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](https://github.com/ChronoAIProject/Ornn/issues/608)). + + Background: [#574](https://github.com/ChronoAIProject/Ornn/issues/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` 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. + ## 0.11.0 ### Patch Changes diff --git a/ornn-api/package.json b/ornn-api/package.json index 58faa57d..d0231f1d 100644 --- a/ornn-api/package.json +++ b/ornn-api/package.json @@ -1,6 +1,6 @@ { "name": "ornn-api", - "version": "0.11.0", + "version": "0.12.0", "private": true, "type": "module", "scripts": { diff --git a/ornn-web/CHANGELOG.md b/ornn-web/CHANGELOG.md index 4c0dd429..374aa41f 100644 --- a/ornn-web/CHANGELOG.md +++ b/ornn-web/CHANGELOG.md @@ -1,5 +1,65 @@ # ornn-web +## 0.12.0 + +### Minor Changes + +- [#1063](https://github.com/ChronoAIProject/Ornn/pull/1063) [`ae666a7`](https://github.com/ChronoAIProject/Ornn/commit/ae666a76e59f089f40307a21cf0205aee72745ad) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#1062](https://github.com/ChronoAIProject/Ornn/pull/1062) [`5fb39a5`](https://github.com/ChronoAIProject/Ornn/commit/5fb39a5ba79cbf692d8ee532d5e8a9d76697d944) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset web UI ([#1059](https://github.com/ChronoAIProject/Ornn/issues/1059)). A full web surface for the [#969](https://github.com/ChronoAIProject/Ornn/issues/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. + +- [#1066](https://github.com/ChronoAIProject/Ornn/pull/1066) [`77cbb52`](https://github.com/ChronoAIProject/Ornn/commit/77cbb5209e3a907e45c342c9e04d0e763a347a1b) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset member-dependency graph ([#1064](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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. + +- [#1069](https://github.com/ChronoAIProject/Ornn/pull/1069) [`12afac9`](https://github.com/ChronoAIProject/Ornn/commit/12afac9ebfdc3b85655030b0a585031001ef5931) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Rework the skillset UI to mirror the skill registry + a drag-on-canvas dependency editor ([#1067](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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. + +- [#975](https://github.com/ChronoAIProject/Ornn/pull/975) [`d641c97`](https://github.com/ChronoAIProject/Ornn/commit/d641c97d7c4e1a8ccfc721840f2ca4ace8191365) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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](https://github.com/ChronoAIProject/Ornn/issues/970)) + +- [#1091](https://github.com/ChronoAIProject/Ornn/pull/1091) [`5ced8d2`](https://github.com/ChronoAIProject/Ornn/commit/5ced8d2df46f2289485a481635def386a3fbe28e) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#1091](https://github.com/ChronoAIProject/Ornn/pull/1091) [`79f5040`](https://github.com/ChronoAIProject/Ornn/commit/79f5040c55fae7f35685efda3949c38af9b7fd30) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#1091](https://github.com/ChronoAIProject/Ornn/pull/1091) [`8aa0b13`](https://github.com/ChronoAIProject/Ornn/commit/8aa0b136dce25ca39e1eaac3a1b1b9c7141c55ae) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#1102](https://github.com/ChronoAIProject/Ornn/pull/1102) [`0e0dfa7`](https://github.com/ChronoAIProject/Ornn/commit/0e0dfa7dc483ed037d47d013459ef3140eadebc5) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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 + +- [#1086](https://github.com/ChronoAIProject/Ornn/pull/1086) [`d2c498b`](https://github.com/ChronoAIProject/Ornn/commit/d2c498b13cbec8591406de2fc3c38a211ab69eec) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - feat(web): skillset details UI parity + polish (smaller closure font, "Closure" rename, member links to skills, remove perms from hero, versions card in right rail like skills) + +- [#1081](https://github.com/ChronoAIProject/Ornn/pull/1081) [`cfef24f`](https://github.com/ChronoAIProject/Ornn/commit/cfef24fe014050c2868ff8d2a508e67c0349a80c) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset browse + detail upgrades ([#1080](https://github.com/ChronoAIProject/Ornn/issues/1080)): the browse page gains a keyword search box (new `q` param on `GET /skillset-search` — case-insensitive substring on name + description) and drops the per-card edit button (manage from the detail page). The skillset detail page's left pane becomes a member skill-package viewer — click any member skill in the set to view its files read-only, mirroring the skill detail page — and the master prompt moves into the top metadata card. The dependency graph and resolved closure are preserved as read-only rail cards. + +### Patch Changes + +- [#845](https://github.com/ChronoAIProject/Ornn/pull/845) [`f1ad2f7`](https://github.com/ChronoAIProject/Ornn/commit/f1ad2f775362bdc66bdb267c04bf026146e24fa7) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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. + +- [#1091](https://github.com/ChronoAIProject/Ornn/pull/1091) [`8518ade`](https://github.com/ChronoAIProject/Ornn/commit/8518ade895bd289f10c2892bcf86fa7adb96e7f0) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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.) + +- [#1091](https://github.com/ChronoAIProject/Ornn/pull/1091) [`f5761dc`](https://github.com/ChronoAIProject/Ornn/commit/f5761dc75a593030e606f161901c1f5f2c023c10) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - 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). + +- [#1079](https://github.com/ChronoAIProject/Ornn/pull/1079) [`fc90136`](https://github.com/ChronoAIProject/Ornn/commit/fc901368d1cf09413c8fd280e6783c01567f2ac9) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Restore the breadcrumb row + quota chip (playground + skill-gen pills) on the skillset pages ([#1078](https://github.com/ChronoAIProject/Ornn/issues/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). + +- [#1077](https://github.com/ChronoAIProject/Ornn/pull/1077) [`0c23921`](https://github.com/ChronoAIProject/Ornn/commit/0c23921e0b2f15bbaa8f4973d46b04f1b0572941) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Bring the skillset detail page to visual parity with the skill detail page ([#1076](https://github.com/ChronoAIProject/Ornn/issues/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). + +- [#1083](https://github.com/ChronoAIProject/Ornn/pull/1083) [`3f5af1e`](https://github.com/ChronoAIProject/Ornn/commit/3f5af1ea9a9969d27d38895e649e04a3f14784c0) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Restructure the skillset detail page ([#1082](https://github.com/ChronoAIProject/Ornn/issues/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. + +- [#1075](https://github.com/ChronoAIProject/Ornn/pull/1075) [`12d23c1`](https://github.com/ChronoAIProject/Ornn/commit/12d23c1655084ef31e0279a47383038aee745b50) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Fix the skillset create/edit page so it scrolls (its content was clipped by the overflow-hidden app shell — each page needs its own scroll container), and reorganize the metadata fields into a compact 2-column grid (name + version, description, kind + tags) so the member picker, dependency-graph canvas, and master prompt get the vertical room ([#1074](https://github.com/ChronoAIProject/Ornn/issues/1074)). + +- [#1095](https://github.com/ChronoAIProject/Ornn/pull/1095) [`dff741d`](https://github.com/ChronoAIProject/Ornn/commit/dff741d71ab08ffb74d855f17db049011abdf646) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Dependency graph polish ([#1094](https://github.com/ChronoAIProject/Ornn/issues/1094)): the arc-blue edges now animate with a gentle flowing dash and carry a "runs before" label pill so the relationship direction is legible at a glance; the read-only detail-page graph gains zoom in/out/fit controls; and the on-hover package-preview dialog is bigger and no longer vanishes when you move the cursor toward it (a grace timer bridges the node→dialog gap and the dialog stays open while hovered). + +- [#1093](https://github.com/ChronoAIProject/Ornn/pull/1093) [`3118759`](https://github.com/ChronoAIProject/Ornn/commit/311875910d4a06176a922c42ccb4a36f471a83a2) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Modernize the member-dependency graph ([#1092](https://github.com/ChronoAIProject/Ornn/issues/1092)): replace react-flow's plain box nodes with a custom Forge card node — a code-glyph icon (arc-blue) + skill name + version, hairline border, letterpress hard-offset shadow, ember border on hover/selected. The read-only detail-page graph now also gets directed arc-blue edges with arrowheads (previously unstyled), and both the editor and read-only canvases gain a faint blueprint grid + vignette. Tokens-only per DESIGN.md (arc-blue diagrammatic accent, ember action accent, letterpress — no soft glow or gradient). + +- [#1073](https://github.com/ChronoAIProject/Ornn/pull/1073) [`13f561a`](https://github.com/ChronoAIProject/Ornn/commit/13f561adf3d1e4cb4946f960deb0f1def12e9fcb) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Smoother skillset dependency-graph canvas ([#1072](https://github.com/ChronoAIProject/Ornn/issues/1072)): dragging a node now sticks (was snapping home), drawing a dependency no longer teleports the layout, and the editor gains directed arrowheaded edges, grabbable handles, zoom Controls, a Tidy re-layout button, a taller canvas, and tweened motion — while node positions stay presentation-only (never persisted) and the dependency edges still live solely in the skillset master prompt. + +- [#1101](https://github.com/ChronoAIProject/Ornn/pull/1101) [`fe70690`](https://github.com/ChronoAIProject/Ornn/commit/fe706907d52ecaa12b8a9e8f9d85644616121ae1) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Fix skillset detail graph hover popup to 800×40vh with independent pane scroll; enable node drag for repositioning + ## 0.11.0 ### Minor Changes diff --git a/ornn-web/package.json b/ornn-web/package.json index 9924bb61..6ebc260e 100644 --- a/ornn-web/package.json +++ b/ornn-web/package.json @@ -1,6 +1,6 @@ { "name": "ornn-web", - "version": "0.11.0", + "version": "0.12.0", "private": true, "type": "module", "scripts": { diff --git a/sdk/typescript/CHANGELOG.md b/sdk/typescript/CHANGELOG.md index c7d33039..cb50286d 100644 --- a/sdk/typescript/CHANGELOG.md +++ b/sdk/typescript/CHANGELOG.md @@ -1,5 +1,15 @@ # @chronoai/ornn-sdk +## 0.4.0 + +### Minor Changes + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`c4537fc`](https://github.com/ChronoAIProject/Ornn/commit/c4537fc952b5a925c833d5eaf28898e4284625b6) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skill dependencies ([#968](https://github.com/ChronoAIProject/Ornn/issues/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 `@` or `@` (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`. + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`7fe3558`](https://github.com/ChronoAIProject/Ornn/commit/7fe3558ad81c5e19d761a5c0c0a3ac6b5c1ca0f9) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillsets ([#969](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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](https://github.com/ChronoAIProject/Ornn/issues/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`. + +- [#982](https://github.com/ChronoAIProject/Ornn/pull/982) [`0eae4a2`](https://github.com/ChronoAIProject/Ornn/commit/0eae4a23b2e6b9046f2d0bfce708bee65515e1db) Thanks [@chronoai-shining](https://github.com/chronoai-shining)! - Skillset master prompt ([#978](https://github.com/ChronoAIProject/Ornn/issues/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`. + ## 0.3.1 ### Patch Changes diff --git a/sdk/typescript/package.json b/sdk/typescript/package.json index 1dae38bf..134fd07f 100644 --- a/sdk/typescript/package.json +++ b/sdk/typescript/package.json @@ -1,6 +1,6 @@ { "name": "@chronoai/ornn-sdk", - "version": "0.3.1", + "version": "0.4.0", "private": true, "description": "TypeScript client for Ornn — the end-to-end skill life-cycle manager for AI agents", "keywords": [