From a35ab5e2a94698e1af5231609d585175ac74a37a Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 16:48:57 -0700 Subject: [PATCH 01/11] docs(superpowers): spec for @ngaf/chat license artifacts (PR A) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dual-license migration MIT → PolyForm Noncommercial 1.0.0 OR Threadplane commercial. Library files only; pricing page and runtime enforcement live in separate follow-up PRs. Co-Authored-By: Claude Opus 4.7 (1M context) --- ...5-20-ngaf-chat-license-artifacts-design.md | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 docs/superpowers/specs/2026-05-20-ngaf-chat-license-artifacts-design.md diff --git a/docs/superpowers/specs/2026-05-20-ngaf-chat-license-artifacts-design.md b/docs/superpowers/specs/2026-05-20-ngaf-chat-license-artifacts-design.md new file mode 100644 index 00000000..861e7898 --- /dev/null +++ b/docs/superpowers/specs/2026-05-20-ngaf-chat-license-artifacts-design.md @@ -0,0 +1,205 @@ +# PR A — `@ngaf/chat` License Artifacts & Metadata + +**Status:** Design approved, ready for implementation plan. +**Owner:** libs/chat +**Affects:** `libs/chat/` package files only. No other library, no website surfaces (those land in PR B), no runtime enforcement code (that lands in PR C). + +## Goal + +Relicense the `@ngaf/chat` library from MIT to a dual model: **PolyForm Noncommercial 1.0.0** (free for noncommercial use) **OR** a separate Threadplane commercial license. Bundle the license text into the package and update the package metadata + README so consumers see the new posture from the next published version. + +Historical npm versions remain MIT. The change applies to future versions only. + +## Out of scope + +- All other libraries (`@ngaf/render`, `@ngaf/agent`, `@ngaf/langgraph`, `@ngaf/ag-ui`, `@ngaf/a2ui`, `@ngaf/licensing`, `@ngaf/telemetry`, `@ngaf/design-tokens`) stay MIT. Their `package.json`, README, and license files are unchanged. +- Root `README.md`, root `COMMERCIAL.md`, root `LICENSE`, root `NOTICE`. Those are part of the public posture sweep in PR B. +- Pricing page, homepage hero, footer, FAQ, docs MDX. PR B. +- Runtime enforcement, public-key distribution, nag UI, claims schema. PR C. + +## Files in this PR + +All paths relative to repo root. + +| Action | Path | Purpose | +|---|---|---| +| Modify | `libs/chat/package.json` | Update `license` field | +| Create | `libs/chat/LICENSE.md` | PolyForm NC 1.0.0 text + Threadplane preamble | +| Create | `libs/chat/LICENSE-COMMERCIAL.md` | Plain-English summary of the commercial license | +| Create | `libs/chat/COMMERCIAL-USE.md` | Definition of commercial vs. permitted free use + evaluation note | +| Create | `libs/chat/NOTICE.md` | Per-library copyright/attribution notice | +| Modify | `libs/chat/README.md` | Targeted patch — replace MIT line, add Commercial use section | +| Create | `libs/chat/CHANGELOG.md` | First entry: the license change | + +No code logic changes. No website file changes. No infrastructure changes. + +## Detailed content + +### `libs/chat/package.json` — license field + +Attempt the SPDX compound expression: + +```json +{ + "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-Threadplane-Commercial" +} +``` + +Verify by running `npm pack` (or `pnpm pack`) locally on `libs/chat/dist` and confirming no `npm WARN` or error mentions the `license` field. If the registry/tooling rejects it, fall back to: + +```json +{ + "license": "SEE LICENSE IN LICENSE.md" +} +``` + +Either way, the LICENSE.md file is the authoritative source of terms. + +### `libs/chat/LICENSE.md` + +Structure: + +1. One-paragraph Threadplane preamble naming the dual model and pointing at LICENSE-COMMERCIAL.md and COMMERCIAL-USE.md for the commercial path. +2. Horizontal rule. +3. Full unmodified text of **PolyForm Noncommercial License 1.0.0** from polyformproject.org/licenses/noncommercial/1.0.0/. No edits to the official body. + +Preamble text (verbatim, per user's prompt): + +> `@ngaf/chat` is licensed under the PolyForm Noncommercial License 1.0.0. Commercial use requires a separate commercial license from Threadplane. +> +> For the definition of commercial use and which free uses are permitted, see [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). +> For an overview of the commercial license terms, see [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md). +> +> Versions of `@ngaf/chat` published before this license change remain available under their original MIT terms. + +### `libs/chat/LICENSE-COMMERCIAL.md` + +Plain-English summary. Headline: "Commercial license summary". Then sections: + +- **Lead:** "Commercial production use of `@ngaf/chat` requires a paid Threadplane commercial license. This document summarizes the expected terms; the signed commercial agreement is authoritative." +- **You may** (heading + bulleted list, verbatim from the user's spec): + - Use `@ngaf/chat` in commercial production applications. + - Bundle `@ngaf/chat` into hosted SaaS apps, internal tools, and shipped software. + - Modify `@ngaf/chat` for use inside your own application. + - Deploy licensed applications to unlimited end users unless otherwise agreed. + - Use the package in development, staging, CI/CD, and production environments. +- **You may not** (heading + bulleted list, verbatim): + - Redistribute `@ngaf/chat` as a standalone package. + - Sell, publish, or package it as a competing chat UI library, design system, app builder, template kit, SDK, or component library. + - Remove copyright, attribution, or license notices. + - Bypass license-key or entitlement checks. + - Sublicense the package except as embedded in a larger end-user application. +- **How to acquire:** one line pointing at https://threadplane.ai/pricing and https://threadplane.ai/contact for sales. + +### `libs/chat/COMMERCIAL-USE.md` + +Structure: + +- **What counts as commercial use** — verbatim from user's prompt: + > Commercial use means using `@ngaf/chat` in any application, product, service, internal tool, client deliverable, hosted experience, or workflow that is operated by or for a for-profit entity, generates revenue, supports paid services, supports business operations, or is delivered to a paying client. +- **Permitted free use under PolyForm Noncommercial 1.0.0** — verbatim bulleted list: + - Personal projects + - Hobby projects + - Student projects + - Academic research + - Nonprofit use + - Public demos + - Evaluation and prototyping + - Open-source applications released under an OSI-approved license, provided `@ngaf/chat` is not redistributed as a competing component library +- **Evaluation:** verbatim: + > Commercial evaluation is free for 30 days. Commercial production deployment requires a paid Threadplane license. +- **Where to learn more / acquire** — one line pointing back at LICENSE-COMMERCIAL.md and the pricing page. + +### `libs/chat/NOTICE.md` + +Short. Three lines: + +> Copyright © 2026 Threadplane. All rights reserved. +> +> `@ngaf/chat` is dual-licensed: PolyForm Noncommercial 1.0.0 for free noncommercial use, or a paid Threadplane commercial license. See [LICENSE.md](./LICENSE.md), [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md), and [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). +> +> Built on top of the wider Angular Agent UI ecosystem, the other libraries of which remain MIT-licensed. + +### `libs/chat/README.md` — targeted patch + +Current README opens with: `Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). MIT licensed.` + +Replace that single line and append a new section just above the install instructions. + +**Replacement opener (replaces the `MIT licensed` line):** + +> `@ngaf/chat` is source-available and free for noncommercial use under the PolyForm Noncommercial License 1.0.0. Commercial production use requires a Threadplane commercial license. +> +> This package is not licensed as OSI open source because commercial use requires a license. Threadplane uses a source-available model for `@ngaf/chat` while keeping protocol and ecosystem packages permissively licensed where appropriate. + +**New "Commercial use" section** (insert at the top, right after the opener and before any install/usage content): + +```markdown +## Commercial use + +Building a commercial product, SaaS application, internal business tool, agency deliverable, or paid client project with `@ngaf/chat` requires a commercial license. + +Free under PolyForm Noncommercial: +- Personal, hobby, student, academic, nonprofit, public-demo use +- Open-source applications released under an OSI-approved license +- Evaluation and prototyping (up to 30 days for commercial evaluation) + +See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use, [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md) for the commercial license summary, and the Threadplane pricing page for plans. +``` + +No other content in `libs/chat/README.md` changes. + +### `libs/chat/CHANGELOG.md` + +First entry. Use whatever the latest published `@ngaf/chat` version is (look up via `pnpm view @ngaf/chat version` during implementation; today the memory says we're at 0.0.x). Per the project's "patch-only" rule from memory, this is **not** a 0.1.0 bump — it's the next 0.0.x patch. + +```markdown +# @ngaf/chat changelog + +## [Unreleased] + +### Changed + +- **License:** Changed the license for `@ngaf/chat` from MIT to PolyForm Noncommercial 1.0.0 plus commercial licensing. This change applies to future versions only. Historical MIT releases remain under their original license terms. + +### Migration + +- Commercial users upgrading to this version or later need a Threadplane commercial license before production deployment. See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). +``` + +The `[Unreleased]` heading flips to a version stamp when the release is cut (handled by whatever publish script the project already uses; out of scope here). + +## Acceptance criteria + +1. `libs/chat/package.json` `license` field is either the compound SPDX expression or `"SEE LICENSE IN LICENSE.md"` (whichever is accepted by `pnpm pack` / `npm pack` without warning). +2. `libs/chat/LICENSE.md` exists, opens with the Threadplane preamble, and contains the full unmodified PolyForm Noncommercial 1.0.0 text. +3. `libs/chat/LICENSE-COMMERCIAL.md`, `libs/chat/COMMERCIAL-USE.md`, `libs/chat/NOTICE.md`, and `libs/chat/CHANGELOG.md` exist with content per "Detailed content" above. +4. `libs/chat/README.md` no longer claims MIT for `@ngaf/chat`. It opens with the source-available framing and has a top-level "Commercial use" section. +5. No file outside `libs/chat/` is modified. +6. The library still builds: `npx nx build chat` succeeds. +7. The published tarball contains LICENSE.md, LICENSE-COMMERCIAL.md, COMMERCIAL-USE.md, NOTICE.md, and CHANGELOG.md. Verify by running `pnpm pack` against `libs/chat/dist` and inspecting the resulting tarball with `tar -tzf`. +8. No new lint errors. `npx nx run chat:lint` is green. +9. No test changes; existing chat tests still pass. + +## Risks + +- **Registry tooling:** Some npm registry proxies reject `LicenseRef-*` SPDX identifiers. The fallback (`SEE LICENSE IN LICENSE.md`) is the documented escape valve. Decided during implementation by running `pnpm pack`. +- **Publish pipeline:** This PR does *not* publish a new version. The publish workflow change (which version to cut, who triggers it) is out of scope and stays with the release owner. +- **Public posture before pricing page exists:** Users who read this README before PR B lands will see references to "a Threadplane commercial license" without a public pricing page that explains tiers. Mitigation: README links to `LICENSE-COMMERCIAL.md` and `COMMERCIAL-USE.md` which describe the model without needing the website. PR B follows immediately. + +## Verification commands + +```bash +# Build +npx nx build chat + +# Lint +npx nx run chat:lint + +# Pack and inspect the tarball +cd dist/libs/chat && pnpm pack --pack-destination /tmp && tar -tzf /tmp/ngaf-chat-*.tgz | sort + +# Confirm published files include all five new docs +tar -tzf /tmp/ngaf-chat-*.tgz | grep -E 'LICENSE\.md|LICENSE-COMMERCIAL\.md|COMMERCIAL-USE\.md|NOTICE\.md|CHANGELOG\.md' +# Expect 5 lines +``` From 4c74638a147ac061e9f13acf1b03a32131ff3c60 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 16:52:03 -0700 Subject: [PATCH 02/11] docs(superpowers): plan for @ngaf/chat license artifacts (PR A) 9 tasks: LICENSE.md, LICENSE-COMMERCIAL.md, COMMERCIAL-USE.md, NOTICE.md, CHANGELOG.md, README patch, package.json license field (with SPDX-compound + safe-fallback path), ng-package.json assets extension, verification. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../2026-05-20-ngaf-chat-license-artifacts.md | 660 ++++++++++++++++++ 1 file changed, 660 insertions(+) create mode 100644 docs/superpowers/plans/2026-05-20-ngaf-chat-license-artifacts.md diff --git a/docs/superpowers/plans/2026-05-20-ngaf-chat-license-artifacts.md b/docs/superpowers/plans/2026-05-20-ngaf-chat-license-artifacts.md new file mode 100644 index 00000000..61ce24f2 --- /dev/null +++ b/docs/superpowers/plans/2026-05-20-ngaf-chat-license-artifacts.md @@ -0,0 +1,660 @@ +# `@ngaf/chat` License Artifacts (PR A) Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Relicense `@ngaf/chat` from MIT to PolyForm Noncommercial 1.0.0 OR a Threadplane commercial license, by adding five license/policy docs in `libs/chat/`, patching the README to drop "MIT licensed" framing, updating the `package.json` `license` field, and extending `ng-package.json` so the new files end up in the published tarball. + +**Architecture:** All changes scoped to `libs/chat/`. No code logic, no other library, no website. The publishable artifact (`dist/libs/chat/`) is the validation surface — after this PR, the tarball must contain the five new docs and the README must no longer claim MIT for `@ngaf/chat`. + +**Tech Stack:** ng-packagr (controls which files land in `dist/libs/chat/`), pnpm/npm pack (registry validation), nx build/lint (CI parity). + +**Reference:** Spec at `docs/superpowers/specs/2026-05-20-ngaf-chat-license-artifacts-design.md`. + +--- + +## File map + +All paths relative to the repo root. + +- **Create:** `libs/chat/LICENSE.md` — Threadplane preamble + verbatim PolyForm-NC 1.0.0 body. +- **Create:** `libs/chat/LICENSE-COMMERCIAL.md` — plain-English commercial-license summary. +- **Create:** `libs/chat/COMMERCIAL-USE.md` — definition of commercial use + permitted free uses + 30-day evaluation. +- **Create:** `libs/chat/NOTICE.md` — per-library copyright notice. +- **Create:** `libs/chat/CHANGELOG.md` — first entry: the license change + migration note. +- **Modify:** `libs/chat/README.md` — replace one line + add a "Commercial use" section. +- **Modify:** `libs/chat/package.json` — update `license` field. +- **Modify:** `libs/chat/ng-package.json` — extend `assets` so the new docs ship in the tarball. + +No other files in the repo change. + +--- + +## Task 1: Create LICENSE.md with PolyForm-NC body + +**Files:** +- Create: `libs/chat/LICENSE.md` + +- [ ] **Step 1: Create the file** + +Write `libs/chat/LICENSE.md` with this exact content: + +```markdown +# @ngaf/chat License + +`@ngaf/chat` is licensed under the PolyForm Noncommercial License 1.0.0. Commercial use requires a separate commercial license from Threadplane. + +For the definition of commercial use and which free uses are permitted, see [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). +For an overview of the commercial license terms, see [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md). + +Versions of `@ngaf/chat` published before this license change remain available under their original MIT terms. + +--- + +## PolyForm Noncommercial License 1.0.0 + + + +## Acceptance + +In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses. + +## Copyright License + +The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license). + +## Distribution License + +The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license). + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example: + +> Required Notice: Copyright Yoyodyne, Inc. (http://example.com) + +## Changes and New Works License + +The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose. + +## Patent License + +The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software. + +## Noncommercial Purposes + +Any noncommercial purpose is a permitted purpose. + +## Personal Uses + +Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose. + +## Noncommercial Organizations + +Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding. + +## Fair Use + +You may have "fair use" rights for the software under the law. These terms do not limit them. + +## No Other Rights + +These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses. + +## Patent Defense + +If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company. + +## Violations + +The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately. + +## No Liability + +***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.*** + +## Definitions + +The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms. + +**You** refers to the individual or entity agreeing to these terms. + +**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect. + +**Your licenses** are all the licenses granted to you for the software under these terms. + +**Use** means anything you do with the software requiring one of your licenses. +``` + +- [ ] **Step 2: Verify the file** + +Run: `head -5 libs/chat/LICENSE.md` +Expected: starts with `# @ngaf/chat License`. + +Run: `grep -c "PolyForm Noncommercial License 1.0.0" libs/chat/LICENSE.md` +Expected: `2` (preamble + section header). + +- [ ] **Step 3: Commit** + +```bash +git add libs/chat/LICENSE.md +git commit -m "$(cat <<'EOF' +docs(chat): add LICENSE.md with PolyForm Noncommercial 1.0.0 body + +@ngaf/chat is dual-licensed: PolyForm NC 1.0.0 for free noncommercial +use OR a separate Threadplane commercial license. Adds the official +PolyForm NC text alongside a Threadplane preamble that links to the +commercial-summary and commercial-use definition files. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 2: Create LICENSE-COMMERCIAL.md (plain-English summary) + +**Files:** +- Create: `libs/chat/LICENSE-COMMERCIAL.md` + +- [ ] **Step 1: Create the file** + +Write `libs/chat/LICENSE-COMMERCIAL.md` with this exact content: + +```markdown +# `@ngaf/chat` Commercial License — Summary + +Commercial production use of `@ngaf/chat` requires a paid Threadplane commercial license. This document summarizes the expected terms; the signed commercial agreement is authoritative. + +## You may + +- Use `@ngaf/chat` in commercial production applications. +- Bundle `@ngaf/chat` into hosted SaaS apps, internal tools, and shipped software. +- Modify `@ngaf/chat` for use inside your own application. +- Deploy licensed applications to unlimited end users unless otherwise agreed. +- Use the package in development, staging, CI/CD, and production environments. + +## You may not + +- Redistribute `@ngaf/chat` as a standalone package. +- Sell, publish, or package it as a competing chat UI library, design system, app builder, template kit, SDK, or component library. +- Remove copyright, attribution, or license notices. +- Bypass license-key or entitlement checks. +- Sublicense the package except as embedded in a larger end-user application. + +## How to acquire + +See plans and pricing at . For enterprise, procurement, or custom terms, contact us at . + +See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use and which free uses are permitted. +``` + +- [ ] **Step 2: Verify the file** + +Run: `grep -c "Commercial production use" libs/chat/LICENSE-COMMERCIAL.md` +Expected: `1`. + +- [ ] **Step 3: Commit** + +```bash +git add libs/chat/LICENSE-COMMERCIAL.md +git commit -m "$(cat <<'EOF' +docs(chat): add LICENSE-COMMERCIAL.md plain-English summary + +Lists what the commercial license grants (production use, SaaS bundling, +modification, CI/CD use, unlimited end users) and what it prohibits +(competing libraries, removing notices, bypassing entitlement checks, +sublicensing as a standalone package). Routes acquisition through +threadplane.ai/pricing and /contact. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 3: Create COMMERCIAL-USE.md (definitions + evaluation) + +**Files:** +- Create: `libs/chat/COMMERCIAL-USE.md` + +- [ ] **Step 1: Create the file** + +Write `libs/chat/COMMERCIAL-USE.md` with this exact content: + +```markdown +# `@ngaf/chat` — Commercial Use Definition + +## What counts as commercial use + +Commercial use means using `@ngaf/chat` in any application, product, service, internal tool, client deliverable, hosted experience, or workflow that is operated by or for a for-profit entity, generates revenue, supports paid services, supports business operations, or is delivered to a paying client. + +## Permitted free use under PolyForm Noncommercial 1.0.0 + +Free under the PolyForm Noncommercial 1.0.0 license: + +- Personal projects +- Hobby projects +- Student projects +- Academic research +- Nonprofit use +- Public demos +- Evaluation and prototyping +- Open-source applications released under an OSI-approved license, provided `@ngaf/chat` is not redistributed as a competing component library + +## Evaluation + +Commercial evaluation is free for 30 days. Commercial production deployment requires a paid Threadplane license. + +## Learn more + +For the commercial license summary, see [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md). For the full PolyForm Noncommercial text, see [LICENSE.md](./LICENSE.md). For plans and pricing, see . +``` + +- [ ] **Step 2: Verify the file** + +Run: `grep -c "Commercial use means" libs/chat/COMMERCIAL-USE.md` +Expected: `1`. + +- [ ] **Step 3: Commit** + +```bash +git add libs/chat/COMMERCIAL-USE.md +git commit -m "$(cat <<'EOF' +docs(chat): add COMMERCIAL-USE.md defining commercial vs. permitted free use + +Defines commercial use (for-profit operation, revenue, paid services, +client deliverables, business workflows), lists permitted free uses +(personal, hobby, student, academic, nonprofit, demos, evaluation, +OSI-licensed open source), and states the 30-day commercial evaluation +window. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 4: Create NOTICE.md + +**Files:** +- Create: `libs/chat/NOTICE.md` + +- [ ] **Step 1: Create the file** + +Write `libs/chat/NOTICE.md` with this exact content: + +```markdown +# `@ngaf/chat` Notice + +Copyright © 2026 Threadplane. All rights reserved. + +`@ngaf/chat` is dual-licensed: PolyForm Noncommercial 1.0.0 for free noncommercial use, or a paid Threadplane commercial license. See [LICENSE.md](./LICENSE.md), [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md), and [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). + +Built on top of the wider Angular Agent UI ecosystem. The other libraries (`@ngaf/render`, `@ngaf/agent`, `@ngaf/langgraph`, `@ngaf/ag-ui`, `@ngaf/a2ui`, `@ngaf/licensing`, `@ngaf/telemetry`, `@ngaf/design-tokens`) remain MIT-licensed. +``` + +- [ ] **Step 2: Verify the file** + +Run: `grep -c "MIT-licensed" libs/chat/NOTICE.md` +Expected: `1`. + +- [ ] **Step 3: Commit** + +```bash +git add libs/chat/NOTICE.md +git commit -m "$(cat <<'EOF' +docs(chat): add NOTICE.md with copyright + dual-license attribution + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 5: Create CHANGELOG.md with the relicense entry + +**Files:** +- Create: `libs/chat/CHANGELOG.md` + +- [ ] **Step 1: Create the file** + +Write `libs/chat/CHANGELOG.md` with this exact content: + +```markdown +# `@ngaf/chat` changelog + +## [Unreleased] + +### Changed + +- **License:** Changed the license for `@ngaf/chat` from MIT to PolyForm Noncommercial 1.0.0 plus commercial licensing. This change applies to future versions only. Historical MIT releases remain under their original license terms. + +### Migration + +Commercial users upgrading to this version or later need a Threadplane commercial license before production deployment. See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use and the 30-day evaluation window, and for plans. +``` + +- [ ] **Step 2: Verify the file** + +Run: `grep -c "PolyForm Noncommercial 1.0.0 plus commercial licensing" libs/chat/CHANGELOG.md` +Expected: `1`. + +- [ ] **Step 3: Commit** + +```bash +git add libs/chat/CHANGELOG.md +git commit -m "$(cat <<'EOF' +docs(chat): seed CHANGELOG.md with the relicense entry + +First per-library changelog file for @ngaf/chat. Calls out the license +change as the leading entry and includes a migration note for +commercial users. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 6: Patch libs/chat/README.md + +**Files:** +- Modify: `libs/chat/README.md` + +- [ ] **Step 1: Read the current opener** + +Run: `head -10 libs/chat/README.md` + +Expected: starts with `# @ngaf/chat`, then a tagline line, then a line that reads exactly `Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). MIT licensed.` + +- [ ] **Step 2: Replace the MIT line and insert the Commercial use section** + +Use Edit to change this line in `libs/chat/README.md`: + +``` +Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). MIT licensed. +``` + +…to this multi-paragraph block followed by a new `## Commercial use` section: + +``` +Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). + +`@ngaf/chat` is source-available and free for noncommercial use under the PolyForm Noncommercial License 1.0.0. Commercial production use requires a Threadplane commercial license. + +This package is not licensed as OSI open source because commercial use requires a license. Threadplane uses a source-available model for `@ngaf/chat` while keeping protocol and ecosystem packages permissively licensed where appropriate. + +## Commercial use + +Building a commercial product, SaaS application, internal business tool, agency deliverable, or paid client project with `@ngaf/chat` requires a commercial license. + +Free under PolyForm Noncommercial: + +- Personal, hobby, student, academic, nonprofit, public-demo use +- Open-source applications released under an OSI-approved license +- Evaluation and prototyping (commercial evaluation is free for 30 days) + +See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use, [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md) for the commercial license summary, and the [Threadplane pricing page](https://threadplane.ai/pricing) for plans. +``` + +- [ ] **Step 3: Verify** + +Run: `grep -c "MIT licensed\." libs/chat/README.md` +Expected: `0`. + +Run: `grep -c "PolyForm Noncommercial License 1.0.0" libs/chat/README.md` +Expected: `1`. + +Run: `grep -c "## Commercial use" libs/chat/README.md` +Expected: `1`. + +- [ ] **Step 4: Commit** + +```bash +git add libs/chat/README.md +git commit -m "$(cat <<'EOF' +docs(chat): replace MIT framing with source-available + commercial use + +The README now leads with PolyForm Noncommercial 1.0.0 + commercial +licensing posture and adds a top-level "Commercial use" section +pointing at COMMERCIAL-USE.md, LICENSE-COMMERCIAL.md, and the +pricing page. Install/usage content below is unchanged. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 7: Update libs/chat/package.json license field + +**Files:** +- Modify: `libs/chat/package.json` + +- [ ] **Step 1: Try the compound SPDX expression** + +Use Edit to change `libs/chat/package.json`: + +```json + "license": "MIT", +``` + +to: + +```json + "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-Threadplane-Commercial", +``` + +- [ ] **Step 2: Build the lib** + +Run from repo root: `npx nx build chat 2>&1 | tail -10` + +Expected: `Successfully ran target build for project chat`. The build is what `pnpm pack` will operate on next. + +If the build *fails* with a license-related error, fall back to the safe expression: + +```json + "license": "SEE LICENSE IN LICENSE.md", +``` + +…then re-run `npx nx build chat`. Note in your commit message which path was taken. + +- [ ] **Step 3: Pack and inspect for license warnings** + +Run from repo root: + +```bash +pnpm --filter @ngaf/chat pack --pack-destination /tmp 2>&1 | tail -20 +``` + +(If `pnpm --filter` doesn't resolve the package, fall back to `cd dist/libs/chat && pnpm pack --pack-destination /tmp`.) + +Expected: produces a tarball at `/tmp/ngaf-chat-*.tgz` and no `WARN` or `ERR` lines mentioning `license`. If npm/pnpm warns "license should be a valid SPDX license expression," abort the compound and fall back per Step 2. + +- [ ] **Step 4: Commit** + +If the compound expression worked: + +```bash +git add libs/chat/package.json +git commit -m "$(cat <<'EOF' +feat(chat)!: relicense @ngaf/chat — MIT → PolyForm-NC 1.0.0 OR Threadplane-Commercial + +BREAKING: package.json license field changes. Future versions of +@ngaf/chat are dual-licensed under PolyForm Noncommercial 1.0.0 OR +a Threadplane commercial license. Historical MIT versions remain +under their original license terms. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +If the fallback was used, the same commit message applies but append a one-line PS: + +``` +PS: pnpm pack rejected the compound SPDX expression; using +"SEE LICENSE IN LICENSE.md" per spec fallback. LICENSE.md is +authoritative. +``` + +--- + +## Task 8: Extend ng-package.json so the new docs ship in the tarball + +**Files:** +- Modify: `libs/chat/ng-package.json` + +By default, ng-packagr auto-copies `README.md` but NOT `LICENSE.md`, `LICENSE-COMMERCIAL.md`, `COMMERCIAL-USE.md`, `NOTICE.md`, or `CHANGELOG.md`. Without this task, the published tarball will be missing four of the five new docs and the license claim in `package.json` will reference a `LICENSE.md` that doesn't exist in the published artifact. + +- [ ] **Step 1: Read current ng-package.json** + +Run: `cat libs/chat/ng-package.json` + +Expected: +```json +{ + "$schema": "../../node_modules/ng-packagr/ng-package.schema.json", + "dest": "../../dist/libs/chat", + "lib": { + "entryFile": "src/public-api.ts" + }, + "allowedNonPeerDependencies": ["@cacheplane/partial-json", "@cacheplane/partial-markdown"], + "assets": [ + { "input": "src/lib/styles", "glob": "chat.css", "output": "." }, + { "input": "src/themes", "glob": "*.css", "output": "themes" } + ] +} +``` + +- [ ] **Step 2: Extend the assets array** + +Use Edit to extend the `assets` array so it includes the five docs: + +```json + "assets": [ + { "input": "src/lib/styles", "glob": "chat.css", "output": "." }, + { "input": "src/themes", "glob": "*.css", "output": "themes" }, + { "input": ".", "glob": "LICENSE.md", "output": "." }, + { "input": ".", "glob": "LICENSE-COMMERCIAL.md", "output": "." }, + { "input": ".", "glob": "COMMERCIAL-USE.md", "output": "." }, + { "input": ".", "glob": "NOTICE.md", "output": "." }, + { "input": ".", "glob": "CHANGELOG.md", "output": "." } + ] +``` + +- [ ] **Step 3: Rebuild and verify the dist contents** + +Run from repo root: + +```bash +npx nx build chat 2>&1 | tail -5 +ls dist/libs/chat | sort +``` + +Expected: build succeeds. The `ls` output must include all five new files alongside the pre-existing `README.md`, `package.json`, `fesm2022/`, `debug/`, `testing/`, `themes/`, `types/`. + +If any of the five docs is missing from `dist/libs/chat/`, the ng-package.json `assets` entry for that file is wrong — re-check the glob. + +- [ ] **Step 4: Pack and confirm the tarball** + +Run from repo root: + +```bash +cd dist/libs/chat && pnpm pack --pack-destination /tmp && cd - && tar -tzf /tmp/ngaf-chat-*.tgz | grep -E 'LICENSE\.md|LICENSE-COMMERCIAL\.md|COMMERCIAL-USE\.md|NOTICE\.md|CHANGELOG\.md' | sort +``` + +Expected: exactly 5 lines (the five docs), all under `package/`. + +- [ ] **Step 5: Commit** + +```bash +git add libs/chat/ng-package.json +git commit -m "$(cat <<'EOF' +build(chat): ship LICENSE.md and policy docs in the published tarball + +ng-packagr only auto-copies README.md. Extends the assets array so +LICENSE.md, LICENSE-COMMERCIAL.md, COMMERCIAL-USE.md, NOTICE.md, and +CHANGELOG.md end up in dist/libs/chat and therefore in the published +npm tarball. Without this, package.json's license claim would point at +a LICENSE.md that doesn't exist in the published artifact. + +Co-Authored-By: Claude Opus 4.7 (1M context) +EOF +)" +``` + +--- + +## Task 9: Final verification + +**Files:** none (verification only). + +- [ ] **Step 1: Lint** + +Run from repo root: `npx nx run chat:lint 2>&1 | tail -5` +Expected: `Successfully ran target lint for project chat`. No new warnings on touched files. + +- [ ] **Step 2: Tests still pass** + +Run from repo root: `npx nx run chat:test 2>&1 | tail -5` +Expected: `Successfully ran target test for project chat`. (Pre-existing pass count; no test files were touched in this PR.) + +- [ ] **Step 3: Confirm acceptance criteria** + +```bash +# 1. package.json license field is set +grep '"license"' libs/chat/package.json + +# 2. LICENSE.md, LICENSE-COMMERCIAL.md, COMMERCIAL-USE.md, NOTICE.md, CHANGELOG.md all exist +ls libs/chat/LICENSE.md libs/chat/LICENSE-COMMERCIAL.md libs/chat/COMMERCIAL-USE.md libs/chat/NOTICE.md libs/chat/CHANGELOG.md + +# 3. README no longer claims MIT for @ngaf/chat +! grep -q "MIT licensed\." libs/chat/README.md && echo "README MIT claim removed" + +# 4. README contains the new framing +grep -c "PolyForm Noncommercial License 1.0.0" libs/chat/README.md # expect 1 +grep -c "## Commercial use" libs/chat/README.md # expect 1 + +# 5. No other library or website file modified +git diff --stat origin/main..HEAD -- 'libs/*' | grep -v 'libs/chat/' && echo "FAIL: outside libs/chat/" || echo "OK: scope limited to libs/chat/" +git diff --stat origin/main..HEAD -- 'apps/' | head -1 && echo "FAIL: apps/ touched" || echo "OK: no apps/ change" +``` + +All checks should pass / report `OK`. + +- [ ] **Step 4: Final tarball check** + +```bash +ls /tmp/ngaf-chat-*.tgz && tar -tzf /tmp/ngaf-chat-*.tgz | grep -E 'LICENSE\.md|LICENSE-COMMERCIAL\.md|COMMERCIAL-USE\.md|NOTICE\.md|CHANGELOG\.md|README\.md|package\.json' | sort +``` + +Expected: 7 paths inside the tarball (`package/CHANGELOG.md`, `package/COMMERCIAL-USE.md`, `package/LICENSE-COMMERCIAL.md`, `package/LICENSE.md`, `package/NOTICE.md`, `package/README.md`, `package/package.json`). + +--- + +## Self-review + +**Spec coverage:** +- Detailed content § `LICENSE.md` → Task 1. ✓ +- Detailed content § `LICENSE-COMMERCIAL.md` → Task 2. ✓ +- Detailed content § `COMMERCIAL-USE.md` → Task 3. ✓ +- Detailed content § `NOTICE.md` → Task 4. ✓ +- Detailed content § `CHANGELOG.md` → Task 5. ✓ +- Detailed content § README targeted patch → Task 6. ✓ +- Detailed content § `package.json` license field (with fallback path) → Task 7. ✓ +- Spec acceptance criterion 7 (tarball contains the five new docs) → Task 8 + Task 9 Step 4. ✓ +- Spec verification commands (`npx nx build chat`, `npx nx run chat:lint`, `pnpm pack`) → Tasks 7, 8, 9. ✓ +- Out-of-scope (no other library / no apps / no runtime code) → enforced via Task 9 Step 3 scope check. ✓ + +**Placeholder scan:** Every code block / file body is fully written; no `TBD`, no "see spec." The only conditional path is the package.json license-field fallback, which is fully documented inline. + +**Type consistency:** No types involved (docs-only PR). Filenames and links are consistent across files: every cross-reference uses the same `./LICENSE.md`, `./LICENSE-COMMERCIAL.md`, `./COMMERCIAL-USE.md` casing. Threadplane URL `https://threadplane.ai/pricing` and `/contact` used consistently. + +Plan complete. From 3d6739210ff407790cc95855c1ec1477c98b190a Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:18:10 -0700 Subject: [PATCH 03/11] docs(chat): add LICENSE.md with PolyForm Noncommercial 1.0.0 body @ngaf/chat is dual-licensed: PolyForm NC 1.0.0 for free noncommercial use OR a separate Threadplane commercial license. Adds the official PolyForm NC text alongside a Threadplane preamble that links to the commercial-summary and commercial-use definition files. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/LICENSE.md | 84 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 libs/chat/LICENSE.md diff --git a/libs/chat/LICENSE.md b/libs/chat/LICENSE.md new file mode 100644 index 00000000..ed58901b --- /dev/null +++ b/libs/chat/LICENSE.md @@ -0,0 +1,84 @@ +# @ngaf/chat License + +`@ngaf/chat` is licensed under the PolyForm Noncommercial License 1.0.0. Commercial use requires a separate commercial license from Threadplane. + +For the definition of commercial use and which free uses are permitted, see [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). +For an overview of the commercial license terms, see [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md). + +Versions of `@ngaf/chat` published before this license change remain available under their original MIT terms. + +--- + +## PolyForm Noncommercial License 1.0.0 + + + +## Acceptance + +In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses. + +## Copyright License + +The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license). + +## Distribution License + +The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license). + +## Notices + +You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example: + +> Required Notice: Copyright Yoyodyne, Inc. (http://example.com) + +## Changes and New Works License + +The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose. + +## Patent License + +The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software. + +## Noncommercial Purposes + +Any noncommercial purpose is a permitted purpose. + +## Personal Uses + +Personal use for research, experiment, and testing for the benefit of public knowledge, personal study, private entertainment, hobby projects, amateur pursuits, or religious observance, without any anticipated commercial application, is use for a permitted purpose. + +## Noncommercial Organizations + +Use by any charitable organization, educational institution, public research organization, public safety or health organization, environmental protection organization, or government institution is use for a permitted purpose regardless of the source of funding or obligations resulting from the funding. + +## Fair Use + +You may have "fair use" rights for the software under the law. These terms do not limit them. + +## No Other Rights + +These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses. + +## Patent Defense + +If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company. + +## Violations + +The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately. + +## No Liability + +***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.*** + +## Definitions + +The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms. + +**You** refers to the individual or entity agreeing to these terms. + +**Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all organizations that have control over, are under the control of, or are under common control with that organization. **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect. + +**Your licenses** are all the licenses granted to you for the software under these terms. + +**Use** means anything you do with the software requiring one of your licenses. From f5ca54ff7065e3db301a5a2cbe9a7423d5cb0a1e Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:18:27 -0700 Subject: [PATCH 04/11] docs(chat): add LICENSE-COMMERCIAL.md plain-English summary Lists what the commercial license grants (production use, SaaS bundling, modification, CI/CD use, unlimited end users) and what it prohibits (competing libraries, removing notices, bypassing entitlement checks, sublicensing as a standalone package). Routes acquisition through threadplane.ai/pricing and /contact. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/LICENSE-COMMERCIAL.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 libs/chat/LICENSE-COMMERCIAL.md diff --git a/libs/chat/LICENSE-COMMERCIAL.md b/libs/chat/LICENSE-COMMERCIAL.md new file mode 100644 index 00000000..a3495687 --- /dev/null +++ b/libs/chat/LICENSE-COMMERCIAL.md @@ -0,0 +1,25 @@ +# `@ngaf/chat` Commercial License — Summary + +Commercial production use of `@ngaf/chat` requires a paid Threadplane commercial license. This document summarizes the expected terms; the signed commercial agreement is authoritative. + +## You may + +- Use `@ngaf/chat` in commercial production applications. +- Bundle `@ngaf/chat` into hosted SaaS apps, internal tools, and shipped software. +- Modify `@ngaf/chat` for use inside your own application. +- Deploy licensed applications to unlimited end users unless otherwise agreed. +- Use the package in development, staging, CI/CD, and production environments. + +## You may not + +- Redistribute `@ngaf/chat` as a standalone package. +- Sell, publish, or package it as a competing chat UI library, design system, app builder, template kit, SDK, or component library. +- Remove copyright, attribution, or license notices. +- Bypass license-key or entitlement checks. +- Sublicense the package except as embedded in a larger end-user application. + +## How to acquire + +See plans and pricing at . For enterprise, procurement, or custom terms, contact us at . + +See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use and which free uses are permitted. From 7aa252b8dd1f7446a3b078eab0142a157e9dda80 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:18:42 -0700 Subject: [PATCH 05/11] docs(chat): add COMMERCIAL-USE.md defining commercial vs. permitted free use Defines commercial use (for-profit operation, revenue, paid services, client deliverables, business workflows), lists permitted free uses (personal, hobby, student, academic, nonprofit, demos, evaluation, OSI-licensed open source), and states the 30-day commercial evaluation window. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/COMMERCIAL-USE.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 libs/chat/COMMERCIAL-USE.md diff --git a/libs/chat/COMMERCIAL-USE.md b/libs/chat/COMMERCIAL-USE.md new file mode 100644 index 00000000..6e6ed871 --- /dev/null +++ b/libs/chat/COMMERCIAL-USE.md @@ -0,0 +1,26 @@ +# `@ngaf/chat` — Commercial Use Definition + +## What counts as commercial use + +Commercial use means using `@ngaf/chat` in any application, product, service, internal tool, client deliverable, hosted experience, or workflow that is operated by or for a for-profit entity, generates revenue, supports paid services, supports business operations, or is delivered to a paying client. + +## Permitted free use under PolyForm Noncommercial 1.0.0 + +Free under the PolyForm Noncommercial 1.0.0 license: + +- Personal projects +- Hobby projects +- Student projects +- Academic research +- Nonprofit use +- Public demos +- Evaluation and prototyping +- Open-source applications released under an OSI-approved license, provided `@ngaf/chat` is not redistributed as a competing component library + +## Evaluation + +Commercial evaluation is free for 30 days. Commercial production deployment requires a paid Threadplane license. + +## Learn more + +For the commercial license summary, see [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md). For the full PolyForm Noncommercial text, see [LICENSE.md](./LICENSE.md). For plans and pricing, see . From 05892187044bf4bad5da3551035fd1ea8e93f3d1 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:18:53 -0700 Subject: [PATCH 06/11] docs(chat): add NOTICE.md with copyright + dual-license attribution Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/NOTICE.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 libs/chat/NOTICE.md diff --git a/libs/chat/NOTICE.md b/libs/chat/NOTICE.md new file mode 100644 index 00000000..07892c1c --- /dev/null +++ b/libs/chat/NOTICE.md @@ -0,0 +1,7 @@ +# `@ngaf/chat` Notice + +Copyright © 2026 Threadplane. All rights reserved. + +`@ngaf/chat` is dual-licensed: PolyForm Noncommercial 1.0.0 for free noncommercial use, or a paid Threadplane commercial license. See [LICENSE.md](./LICENSE.md), [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md), and [COMMERCIAL-USE.md](./COMMERCIAL-USE.md). + +Built on top of the wider Angular Agent UI ecosystem. The other libraries (`@ngaf/render`, `@ngaf/agent`, `@ngaf/langgraph`, `@ngaf/ag-ui`, `@ngaf/a2ui`, `@ngaf/licensing`, `@ngaf/telemetry`, `@ngaf/design-tokens`) remain MIT-licensed. From e59152124b5df4efc9719d7e68c10b747e80264b Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:19:06 -0700 Subject: [PATCH 07/11] docs(chat): seed CHANGELOG.md with the relicense entry First per-library changelog file for @ngaf/chat. Calls out the license change as the leading entry and includes a migration note for commercial users. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/CHANGELOG.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 libs/chat/CHANGELOG.md diff --git a/libs/chat/CHANGELOG.md b/libs/chat/CHANGELOG.md new file mode 100644 index 00000000..de575956 --- /dev/null +++ b/libs/chat/CHANGELOG.md @@ -0,0 +1,11 @@ +# `@ngaf/chat` changelog + +## [Unreleased] + +### Changed + +- **License:** Changed the license for `@ngaf/chat` from MIT to PolyForm Noncommercial 1.0.0 plus commercial licensing. This change applies to future versions only. Historical MIT releases remain under their original license terms. + +### Migration + +Commercial users upgrading to this version or later need a Threadplane commercial license before production deployment. See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use and the 30-day evaluation window, and for plans. From e5ef47e740d95b291570d1c4260136285b5a9981 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:20:19 -0700 Subject: [PATCH 08/11] docs(chat): replace MIT framing with source-available + commercial use The README now leads with PolyForm Noncommercial 1.0.0 + commercial licensing posture and adds a top-level "Commercial use" section pointing at COMMERCIAL-USE.md, LICENSE-COMMERCIAL.md, and the pricing page. Install/usage content below is unchanged. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libs/chat/README.md b/libs/chat/README.md index 81dad8ff..ede28c9b 100644 --- a/libs/chat/README.md +++ b/libs/chat/README.md @@ -2,7 +2,23 @@ Drop-in agent chat UI for Angular 20+. Headless primitives that read from a runtime-neutral `Agent` contract, plus opinionated compositions (``, ``, GenUI surfaces) you can ship in days. -Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). MIT licensed. +Part of [Agent UI for Angular](https://github.com/cacheplane/angular-agent-framework). + +`@ngaf/chat` is source-available and free for noncommercial use under the PolyForm Noncommercial License 1.0.0. Commercial production use requires a Threadplane commercial license. + +This package is not licensed as OSI open source because commercial use requires a license. Threadplane uses a source-available model for `@ngaf/chat` while keeping protocol and ecosystem packages permissively licensed where appropriate. + +## Commercial use + +Building a commercial product, SaaS application, internal business tool, agency deliverable, or paid client project with `@ngaf/chat` requires a commercial license. + +Free under PolyForm Noncommercial: + +- Personal, hobby, student, academic, nonprofit, public-demo use +- Open-source applications released under an OSI-approved license +- Evaluation and prototyping (commercial evaluation is free for 30 days) + +See [COMMERCIAL-USE.md](./COMMERCIAL-USE.md) for the definition of commercial use, [LICENSE-COMMERCIAL.md](./LICENSE-COMMERCIAL.md) for the commercial license summary, and the [Threadplane pricing page](https://threadplane.ai/pricing) for plans. ## Runtime adapters From 7ffd90fb723145844501cf94e34588f53adfa771 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:21:16 -0700 Subject: [PATCH 09/11] =?UTF-8?q?feat(chat)!:=20relicense=20@ngaf/chat=20?= =?UTF-8?q?=E2=80=94=20MIT=20=E2=86=92=20PolyForm-NC=201.0.0=20OR=20Thread?= =?UTF-8?q?plane-Commercial?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BREAKING: package.json license field changes. Future versions of @ngaf/chat are dual-licensed under PolyForm Noncommercial 1.0.0 OR a Threadplane commercial license. Historical MIT versions remain under their original license terms. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/chat/package.json b/libs/chat/package.json index ff0db163..8168db2c 100644 --- a/libs/chat/package.json +++ b/libs/chat/package.json @@ -25,7 +25,7 @@ "rxjs": "~7.8.0", "marked": "^15.0.0 || ^16.0.0" }, - "license": "MIT", + "license": "PolyForm-Noncommercial-1.0.0 OR LicenseRef-Threadplane-Commercial", "repository": { "type": "git", "url": "https://github.com/cacheplane/angular-agent-framework.git", From abee0a2456ababd5e7c4f98db7c878bdf4c2c5c5 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Wed, 20 May 2026 17:22:18 -0700 Subject: [PATCH 10/11] build(chat): ship LICENSE.md and policy docs in the published tarball ng-packagr only auto-copies README.md. Extends the assets array so LICENSE.md, LICENSE-COMMERCIAL.md, COMMERCIAL-USE.md, NOTICE.md, and CHANGELOG.md end up in dist/libs/chat and therefore in the published npm tarball. Without this, package.json's license claim would point at a LICENSE.md that doesn't exist in the published artifact. Co-Authored-By: Claude Opus 4.7 (1M context) --- libs/chat/ng-package.json | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libs/chat/ng-package.json b/libs/chat/ng-package.json index 8b492da8..3c4fd9ec 100644 --- a/libs/chat/ng-package.json +++ b/libs/chat/ng-package.json @@ -7,6 +7,11 @@ "allowedNonPeerDependencies": ["@cacheplane/partial-json", "@cacheplane/partial-markdown"], "assets": [ { "input": "src/lib/styles", "glob": "chat.css", "output": "." }, - { "input": "src/themes", "glob": "*.css", "output": "themes" } + { "input": "src/themes", "glob": "*.css", "output": "themes" }, + { "input": ".", "glob": "LICENSE.md", "output": "." }, + { "input": ".", "glob": "LICENSE-COMMERCIAL.md", "output": "." }, + { "input": ".", "glob": "COMMERCIAL-USE.md", "output": "." }, + { "input": ".", "glob": "NOTICE.md", "output": "." }, + { "input": ".", "glob": "CHANGELOG.md", "output": "." } ] } From 3271b4123134cb83d02c70e2bccb17a0783592ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 21 May 2026 00:26:16 +0000 Subject: [PATCH 11/11] chore(docs): regenerate api docs --- apps/website/content/docs/agent/api/api-docs.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/apps/website/content/docs/agent/api/api-docs.json b/apps/website/content/docs/agent/api/api-docs.json index 61d9f616..a3132bf8 100644 --- a/apps/website/content/docs/agent/api/api-docs.json +++ b/apps/website/content/docs/agent/api/api-docs.json @@ -296,6 +296,19 @@ } ] }, + { + "name": "getThread", + "signature": "getThread(threadId: string)", + "description": "Fetch a single thread by id. Returns `null` when the server\n returns 404 (thread doesn't exist) so callers can distinguish\n \"missing\" from \"couldn't reach the server\" — genuine network\n errors rethrow. Used by URL-based thread routing to validate a\n pasted/shared thread id before activating it.", + "params": [ + { + "name": "threadId", + "type": "string", + "description": "", + "optional": false + } + ] + }, { "name": "moveToProject", "signature": "moveToProject(threadId: string, projectId: string | null)",