diff --git a/NOTICE b/NOTICE index 0879f582..293d90ca 100644 --- a/NOTICE +++ b/NOTICE @@ -3,11 +3,29 @@ Copyright 2026 Firefly Software Foundation. Author: Firefly Software Foundation SPDX-License-Identifier: Apache-2.0 -This product includes software and original visual assets developed for -Firefly Weave by the Firefly Software Foundation. +This product includes software developed for Firefly Weave by the Firefly +Software Foundation, licensed under the Apache License 2.0. -The original Weave SVG artwork uses the Firefly family's green palette and an -independent woven W symbol. It does not incorporate the PyFly logo. +Firefly marks. The Firefly name, the firefly wordmark with its spark and +chevron, the Firefly icon and the Firefly Weave logo that combines them with +the word "Weave" are trademarks and proprietary artwork of Firefly Software +Solutions Inc. Copyright 2026 Firefly Software Solutions Inc. All rights +reserved. The Firefly Software Foundation uses them in Firefly Weave with the +permission of Firefly Software Solutions Inc. They are not licensed under the +Apache License 2.0, and this notice grants no right to use, modify or +redistribute them apart from unmodified copies of this product. The source +inventory, docs/contributing/source-inventory.toml, lists every file that +carries them. + +Manrope. Studio includes the Manrope typeface, Copyright 2019 The Manrope +Project Authors (https://github.com/sharanda/manrope), licensed under the SIL +Open Font License, Version 1.1 (assets/fonts/manrope/OFL.txt). + +Lucide. Studio's icons are derived from Lucide (https://lucide.dev), +lucide-static 1.52.0, Copyright (c) 2026 Lucide Icons and Contributors, +licensed under the ISC License; portions derive from Feather, Copyright (c) +2013-present Cole Bemis, licensed under the MIT License +(studio/public/licenses/lucide-LICENSE.txt). Firefly Weave depends on separately distributed software, including PyFly. Those dependencies retain their own copyrights, licenses, and notices. This diff --git a/README.md b/README.md index bbd55fc1..7a05302c 100644 --- a/README.md +++ b/README.md @@ -295,8 +295,6 @@ verified scope. ## Meet Lumi -![Lumi, the Firefly Weave guide, with translucent mint wings and an amber lantern](assets/lumi.png) - **Lumi is Weave's firefly guide.** Translucent mint wings, a forest-green body, and a warm amber lantern bring Weave's colors to life. The lantern represents a clear next step through a complex process. @@ -304,7 +302,7 @@ represents a clear next step through a complex process. You will find Lumi throughout the documentation and in Studio. Open the **Ask Lumi** panel for assistance, and [configure its model](docs/guides/lumi.md) separately from workflow AI tasks. In diagrams, -**Lumi's takeaway** highlights the main idea to remember before moving on. +the **Takeaway** band highlights the main idea to remember before moving on. Start with the [visual guide](docs/visual-guide.md) to explore the platform together. ## Contribute and learn more diff --git a/assets/brand/firefly-icon-small.svg b/assets/brand/firefly-icon-small.svg new file mode 100644 index 00000000..8a3d71fd --- /dev/null +++ b/assets/brand/firefly-icon-small.svg @@ -0,0 +1,2 @@ + +FireflyThe Firefly icon for small sizes: the amber spark and a solid chevron on a charcoal rounded tile. diff --git a/assets/brand/firefly-icon.svg b/assets/brand/firefly-icon.svg new file mode 100644 index 00000000..4c52c208 --- /dev/null +++ b/assets/brand/firefly-icon.svg @@ -0,0 +1,2 @@ + +FireflyThe Firefly icon: the amber spark and chevron with its light trail on a charcoal rounded tile. diff --git a/assets/brand/firefly-mark.svg b/assets/brand/firefly-mark.svg new file mode 100644 index 00000000..6d4d18b9 --- /dev/null +++ b/assets/brand/firefly-mark.svg @@ -0,0 +1,2 @@ + +FireflyThe Firefly mark: the amber spark and chevron with its light trail on a transparent background. diff --git a/assets/brand/weave-lockup-color.svg b/assets/brand/weave-lockup-color.svg new file mode 100644 index 00000000..175fa458 --- /dev/null +++ b/assets/brand/weave-lockup-color.svg @@ -0,0 +1,2 @@ + +Firefly WeaveThe Firefly logo, a hairline separator and the word Weave, in charcoal on a transparent background. diff --git a/assets/brand/weave-lockup-reversed.svg b/assets/brand/weave-lockup-reversed.svg new file mode 100644 index 00000000..58ba0519 --- /dev/null +++ b/assets/brand/weave-lockup-reversed.svg @@ -0,0 +1,2 @@ + +Firefly WeaveThe Firefly logo, a hairline separator and the word Weave, in paper on a transparent background. diff --git a/assets/brand/weave-lockup-small-reversed.svg b/assets/brand/weave-lockup-small-reversed.svg new file mode 100644 index 00000000..7816e840 --- /dev/null +++ b/assets/brand/weave-lockup-small-reversed.svg @@ -0,0 +1,2 @@ + +Firefly WeaveThe Firefly logo with a solid chevron, a hairline separator and the word Weave, in paper on a transparent background. diff --git a/assets/fonts/manrope/OFL.txt b/assets/fonts/manrope/OFL.txt new file mode 100644 index 00000000..462280f3 --- /dev/null +++ b/assets/fonts/manrope/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 b/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 new file mode 100644 index 00000000..bd24140a Binary files /dev/null and b/assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2 differ diff --git a/assets/fonts/manrope/manrope-latin-wght-normal.woff2 b/assets/fonts/manrope/manrope-latin-wght-normal.woff2 new file mode 100644 index 00000000..71eb731d Binary files /dev/null and b/assets/fonts/manrope/manrope-latin-wght-normal.woff2 differ diff --git a/assets/lumi.png b/assets/lumi.png deleted file mode 100644 index 0f6de218..00000000 Binary files a/assets/lumi.png and /dev/null differ diff --git a/assets/lumi.svg b/assets/lumi.svg deleted file mode 100644 index 8319101b..00000000 --- a/assets/lumi.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Lumi, the Firefly Weave guide -A forest-green firefly with a softly sculpted face, attentive eyes, folded mint wings, and a warm golden lantern. The angular wings echo the woven Weave symbol. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/README.md b/docs/README.md index 08d3f323..9f86403e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,11 +18,8 @@ SPDX-License-Identifier: Apache-2.0 # Learn and use Firefly Weave -![Lumi, a firefly with translucent mint wings](../assets/lumi.png){ .lumi-guide } - -Meet **Lumi**, your guide through Firefly Weave. Start small: create a workflow, -see how it runs, then connect it to your systems and your people. -[Meet the mascot](visual-assets.md#meet-lumi). +Start small: create a workflow, see how it runs, then connect it to your +systems and your people. Firefly Weave is a durable workflow orchestration and integration platform with human tasks. You describe a business process once, as a **workflow**. Weave runs diff --git a/docs/contributing/source-inventory.toml b/docs/contributing/source-inventory.toml index bfb8492e..c586d825 100644 --- a/docs/contributing/source-inventory.toml +++ b/docs/contributing/source-inventory.toml @@ -17,22 +17,173 @@ version = 1 [[exceptions]] -path = "assets/lumi.png" -kind = "commentless" -reason = "Apache-licensed Lumi mascot master documented in docs/visual-assets.md; PNG cannot carry a source comment header." -copyright = "Copyright 2026 Firefly Software Foundation." -author = "Firefly Software Foundation" -license = "Apache-2.0" +path = "assets/brand/weave-lockup-reversed.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs compact logo, composed by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/brand/weave-lockup-color.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs compact logo, composed by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/brand/weave-lockup-small-reversed.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs compact logo with a solid chevron, composed by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/brand/firefly-icon.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs icon(), written by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/brand/firefly-icon-small.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs icon({ solid: true }), written by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/brand/firefly-mark.svg" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), scripts/logo.mjs icon({ background: none }), written by scripts/brand/weave-lockup.mjs" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "studio/public/assets/weave-lockup-reversed.svg" +kind = "third-party" +source = "Byte-identical copy of assets/brand/weave-lockup-reversed.svg" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "studio/public/assets/weave-lockup-small-reversed.svg" +kind = "third-party" +source = "Byte-identical copy of assets/brand/weave-lockup-small-reversed.svg" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "studio/public/assets/firefly-mark.svg" +kind = "third-party" +source = "Byte-identical copy of assets/brand/firefly-mark.svg" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "studio/public/favicon.svg" +kind = "third-party" +source = "Byte-identical copy of assets/brand/firefly-icon.svg" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "studio/public/favicon.ico" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), npm run build -- --only logo, 02-Logo/favicon/favicon.ico (16, 32, 48)" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" [[exceptions]] -path = "studio/public/assets/lumi.png" +path = "studio/public/apple-touch-icon.png" +kind = "third-party" +source = "Firefly Brand Kit 2.0.0 (private), npm run build -- --only logo, 02-Logo/favicon/apple-touch-icon.png (180)" +reason = "Firefly trademark artwork used with permission; not Apache-2.0; see NOTICE." +copyright = "Copyright 2026 Firefly Software Solutions Inc." +license = "LicenseRef-Firefly-Marks" + +[[exceptions]] +path = "assets/fonts/manrope/manrope-latin-wght-normal.woff2" +kind = "third-party" +source = "@fontsource-variable/manrope 5.3.0, files/manrope-latin-wght-normal.woff2" +reason = "Manrope variable font file (binary), unmodified; see NOTICE." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "assets/fonts/manrope/manrope-latin-ext-wght-normal.woff2" +kind = "third-party" +source = "@fontsource-variable/manrope 5.3.0, files/manrope-latin-ext-wght-normal.woff2" +reason = "Manrope variable font file (binary), unmodified; see NOTICE." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "studio/public/fonts/manrope/manrope-latin-wght-normal.woff2" +kind = "third-party" +source = "@fontsource-variable/manrope 5.3.0, files/manrope-latin-wght-normal.woff2" +reason = "Manrope variable font file (binary), unmodified; see NOTICE." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "studio/public/fonts/manrope/manrope-latin-ext-wght-normal.woff2" +kind = "third-party" +source = "@fontsource-variable/manrope 5.3.0, files/manrope-latin-ext-wght-normal.woff2" +reason = "Manrope variable font file (binary), unmodified; see NOTICE." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "assets/fonts/manrope/OFL.txt" +kind = "third-party" +source = "@fontsource-variable/manrope 5.3.0, LICENSE" +reason = "SIL Open Font License text that must accompany the Manrope files." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "studio/public/licenses/manrope-OFL.txt" +kind = "third-party" +source = "Byte-identical copy of assets/fonts/manrope/OFL.txt" +reason = "SIL Open Font License text shipped in the Studio bundle with the Manrope files." +copyright = "Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope)" +license = "OFL-1.1" + +[[exceptions]] +path = "studio/public/licenses/NOTICE.txt" kind = "commentless" -source = "assets/lumi.png" -reason = "Byte-identical Studio distribution copy of the Apache-licensed Lumi mascot master." +reason = "Byte-identical copy of NOTICE shipped in the Studio bundle; a plain-text notice cannot carry a comment header." copyright = "Copyright 2026 Firefly Software Foundation." author = "Firefly Software Foundation" license = "Apache-2.0" +[[exceptions]] +path = "studio/public/licenses/lucide-LICENSE.txt" +kind = "third-party" +source = "lucide-static 1.52.0, LICENSE" +reason = "ISC and MIT license text that must accompany the Lucide-derived icon geometry." +copyright = "Copyright (c) 2026 Lucide Icons and Contributors; Copyright (c) 2013-present Cole Bemis" +license = "ISC AND MIT" + +[[exceptions]] +path = "studio/src/app/icon-data.ts" +kind = "third-party" +source = "lucide-static 1.52.0 via studio/scripts/build-icons.mjs" +reason = "Generated Lucide icon geometry; regenerate with npm run icons, never edit." +copyright = "Copyright (c) 2026 Lucide Icons and Contributors; Copyright (c) 2013-present Cole Bemis" +license = "ISC AND MIT" + [[exceptions]] path = "tests/fixtures/definitions/invalid/duplicate-key.yaml" kind = "immutable-fixture" diff --git a/docs/diagrams/authoring-diagnostic-loop.svg b/docs/diagrams/authoring-diagnostic-loop.svg index a8b3e8b3..ab342302 100644 --- a/docs/diagrams/authoring-diagnostic-loop.svg +++ b/docs/diagrams/authoring-diagnostic-loop.svg @@ -79,55 +79,9 @@ SPDX-License-Identifier: Apache-2.0 What this tells you Move forward only when the boundary you need has passed. Keep source -location and diagnostic code together when explaining a failure. +location and diagnostic code together when explaining a failure. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Fix the first reported boundary, then check the definition again. +Takeaway +Fix the first reported boundary, then check the definition again. diff --git a/docs/diagrams/authoring-execution-boundaries.svg b/docs/diagrams/authoring-execution-boundaries.svg index 0adcfd4f..47596fef 100644 --- a/docs/diagrams/authoring-execution-boundaries.svg +++ b/docs/diagrams/authoring-execution-boundaries.svg @@ -83,55 +83,9 @@ SPDX-License-Identifier: Apache-2.0 Compilation is one boundary A compiled contract describes behavior. Separate service checks decide -whether a caller can create or execute live resources. +whether a caller can create or execute live resources. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Choose your boundary: offline tools, authenticated API, or explicit embedding. +Takeaway +Choose your boundary: offline tools, authenticated API, or explicit embedding. diff --git a/docs/diagrams/authoring-host-sequence.svg b/docs/diagrams/authoring-host-sequence.svg index cff7ce34..15808a82 100644 --- a/docs/diagrams/authoring-host-sequence.svg +++ b/docs/diagrams/authoring-host-sequence.svg @@ -63,55 +63,9 @@ SPDX-License-Identifier: Apache-2.0 Keep IDs and retry keys with the request The workspace scope selects resources; your token and grants supply authority. A lost mutation response leaves the outcome unknown: retry with the exact -request and the same key. +request and the same key. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Carry the returned IDs and original retry keys into the next request. +Takeaway +Carry the returned IDs and original retry keys into the next request. diff --git a/docs/diagrams/authoring-openapi-directions.svg b/docs/diagrams/authoring-openapi-directions.svg index aae34e9a..24479613 100644 --- a/docs/diagrams/authoring-openapi-directions.svg +++ b/docs/diagrams/authoring-openapi-directions.svg @@ -76,55 +76,9 @@ SPDX-License-Identifier: Apache-2.0 Both directions run offline Neither one starts services, resolves secrets, or calls a provider. -Imported Actions still need publication, a connection, and an activation. +Imported Actions still need publication, a connection, and an activation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Export describes Weave’s API; import turns another API into reviewed Actions. +Takeaway +Export describes Weave’s API; import turns another API into reviewed Actions. diff --git a/docs/diagrams/authoring-schema-boundaries.svg b/docs/diagrams/authoring-schema-boundaries.svg index be7d346d..ed884ab8 100644 --- a/docs/diagrams/authoring-schema-boundaries.svg +++ b/docs/diagrams/authoring-schema-boundaries.svg @@ -83,55 +83,9 @@ SPDX-License-Identifier: Apache-2.0 Classified data is checked too Present values marked x-secret or writeOnly are rejected, including null and -empty values. Optional fields may be absent; defaults do not insert data. +empty values. Optional fields may be absent; defaults do not insert data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Check the data at each boundary, not just the schema that describes it. +Takeaway +Check the data at each boundary, not just the schema that describes it. diff --git a/docs/diagrams/authoring-simulation-controls.svg b/docs/diagrams/authoring-simulation-controls.svg index 8b6edd6a..e0d57a6d 100644 --- a/docs/diagrams/authoring-simulation-controls.svg +++ b/docs/diagrams/authoring-simulation-controls.svg @@ -74,55 +74,9 @@ SPDX-License-Identifier: Apache-2.0 Two clocks have different jobs Virtual time governs timers. Server debug sessions expire after one real -hour; saving progress and virtual time does not extend that lifetime. +hour; saving progress and virtual time does not extend that lifetime. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Move virtual time explicitly; simulations never call live providers. +Takeaway +Move virtual time explicitly; simulations never call live providers. diff --git a/docs/diagrams/authoring-worker-lifecycle.svg b/docs/diagrams/authoring-worker-lifecycle.svg index e5d250a7..82d35520 100644 --- a/docs/diagrams/authoring-worker-lifecycle.svg +++ b/docs/diagrams/authoring-worker-lifecycle.svg @@ -89,55 +89,9 @@ SPDX-License-Identifier: Apache-2.0 Plan for at-least-once delivery A lost response after an effect can leave its outcome unknown. A release alone cannot execute a task; the SDK renews authority and delivers the -attempt outcome. +attempt outcome. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -A current lease permits one attempt; old proofs cannot complete a new one. +Takeaway +A current lease permits one attempt; old proofs cannot complete a new one. diff --git a/docs/diagrams/capability-evidence.svg b/docs/diagrams/capability-evidence.svg index 681f394b..262c7076 100644 --- a/docs/diagrams/capability-evidence.svg +++ b/docs/diagrams/capability-evidence.svg @@ -52,55 +52,9 @@ SPDX-License-Identifier: Apache-2.0 A local acknowledgment does not prove real delivery. Read the capability matrix together with the connector guide. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Match the claim to its evidence: source, local tests, or real provider delivery. +Takeaway +Match the claim to its evidence: source, local tests, or real provider delivery. diff --git a/docs/diagrams/cli-installation.svg b/docs/diagrams/cli-installation.svg index 5eb0b5cc..96635945 100644 --- a/docs/diagrams/cli-installation.svg +++ b/docs/diagrams/cli-installation.svg @@ -52,55 +52,9 @@ SPDX-License-Identifier: Apache-2.0 The command changes only after the checks pass. A failed check leaves your previous CLI selected; older versions stay for rollback. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep the current CLI selected until the new installation passes its checks. +Takeaway +Keep the current CLI selected until the new installation passes its checks. diff --git a/docs/diagrams/cloud-deployment.svg b/docs/diagrams/cloud-deployment.svg index efff3100..53cf8179 100644 --- a/docs/diagrams/cloud-deployment.svg +++ b/docs/diagrams/cloud-deployment.svg @@ -78,55 +78,9 @@ SPDX-License-Identifier: Apache-2.0 Pushing an image grants no Weave authority. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Image delivery, database migration, and worker admission are separate jobs. +Takeaway +Image delivery, database migration, and worker admission are separate jobs. diff --git a/docs/diagrams/compiler-execution.svg b/docs/diagrams/compiler-execution.svg index 03111614..8c6b7094 100644 --- a/docs/diagrams/compiler-execution.svg +++ b/docs/diagrams/compiler-execution.svg @@ -79,55 +79,9 @@ SPDX-License-Identifier: Apache-2.0 An external call can happen before completion is recorded. Use provider idempotency or reconciliation. Simulation and recorded replay do not call providers. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Compilation checks meaning; activation checks authority and readiness. +Takeaway +Compilation checks meaning; activation checks authority and readiness. diff --git a/docs/diagrams/connect-and-sign-in.svg b/docs/diagrams/connect-and-sign-in.svg index e04e18ec..6ba39b93 100644 --- a/docs/diagrams/connect-and-sign-in.svg +++ b/docs/diagrams/connect-and-sign-in.svg @@ -85,55 +85,9 @@ SPDX-License-Identifier: Apache-2.0 the local tokens and asks the provider to revoke the sign-in. The saved platform stays until you remove it in Studio or with weave auth remove. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -The saved platform holds no secrets. Tokens stay in the credential store you chose. +Takeaway +The saved platform holds no secrets. Tokens stay in the credential store you chose. diff --git a/docs/diagrams/data-model-definitions.svg b/docs/diagrams/data-model-definitions.svg index d66c2360..2df8eace 100644 --- a/docs/diagrams/data-model-definitions.svg +++ b/docs/diagrams/data-model-definitions.svg @@ -85,55 +85,9 @@ SPDX-License-Identifier: Apache-2.0 Migrations 0004–0005. Activations also reference environments. Drafts and mutation-idempotency records belong to projects; worker grants add dependencies. These are selected SQL relationships. JSON-held pins are not invented foreign keys. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Versions stay immutable while activations choose where to use them. +Takeaway +Versions stay immutable while activations choose where to use them. diff --git a/docs/diagrams/data-model-integrations.svg b/docs/diagrams/data-model-integrations.svg index d5c70873..56b03ea9 100644 --- a/docs/diagrams/data-model-integrations.svg +++ b/docs/diagrams/data-model-integrations.svg @@ -96,55 +96,9 @@ SPDX-License-Identifier: Apache-2.0 Migrations 0017–0020. Deliveries also reference subscriptions; provider sources reference source bindings and one activation or run. WhatsApp observations join source, fact, and connection revision. Broker receipts have separate FKs (0016). This view does not decide retention. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Event, receipt, and delivery-attempt identities describe different facts. +Takeaway +Event, receipt, and delivery-attempt identities describe different facts. diff --git a/docs/diagrams/data-model-runtime.svg b/docs/diagrams/data-model-runtime.svg index 75691b3f..e3959ad2 100644 --- a/docs/diagrams/data-model-runtime.svg +++ b/docs/diagrams/data-model-runtime.svg @@ -85,55 +85,9 @@ SPDX-License-Identifier: Apache-2.0 Migrations 0006–0007. Generations distinguish attempts and fence stale completions. Runs also own events, step instances, deadlines, and signal receipts; wait wakeups reference deadlines. History, incidents, schedules, and debug state have additional scoped ownership. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -The lease generation connects a completion to its current attempt. +Takeaway +The lease generation connects a completion to its current attempt. diff --git a/docs/diagrams/definition-lifecycle.svg b/docs/diagrams/definition-lifecycle.svg index c7c8461c..e250e494 100644 --- a/docs/diagrams/definition-lifecycle.svg +++ b/docs/diagrams/definition-lifecycle.svg @@ -61,55 +61,9 @@ SPDX-License-Identifier: Apache-2.0 Run B Customer B’s input Its own accepted state + history - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -New inputs create new runs; source edits do not rewrite existing runs. +Takeaway +New inputs create new runs; source edits do not rewrite existing runs. diff --git a/docs/diagrams/documentation-contribution.svg b/docs/diagrams/documentation-contribution.svg index 1e36be9f..6eab2c03 100644 --- a/docs/diagrams/documentation-contribution.svg +++ b/docs/diagrams/documentation-contribution.svg @@ -53,55 +53,9 @@ SPDX-License-Identifier: Apache-2.0 Render at article width; check labels, arrows, and captions. Follow the chapter using only its stated prerequisites. A passing link check cannot prove accuracy. A diagram must not invent a guarantee. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Run the example and inspect the picture before publishing the guide. +Takeaway +Run the example and inspect the picture before publishing the guide. diff --git a/docs/diagrams/echo-data-flow.svg b/docs/diagrams/echo-data-flow.svg index 665b2af9..5ae8a47d 100644 --- a/docs/diagrams/echo-data-flow.svg +++ b/docs/diagrams/echo-data-flow.svg @@ -53,55 +53,9 @@ SPDX-License-Identifier: Apache-2.0 Identity + grants + activation PostgreSQL · result: state.output Only the durable run creates server-side state and history. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -The same message can be simulated locally or saved in a durable run. +Takeaway +The same message can be simulated locally or saved in a durable run. diff --git a/docs/diagrams/execution-lifecycle.svg b/docs/diagrams/execution-lifecycle.svg index dd846106..0d01b371 100644 --- a/docs/diagrams/execution-lifecycle.svg +++ b/docs/diagrams/execution-lifecycle.svg @@ -45,55 +45,9 @@ SPDX-License-Identifier: Apache-2.0 Only finished runs can be archived. Purge needs an archived run and the run.purge permission; live leases or retained references block it, and nothing is partially deleted. A small deletion receipt and access audit remain. External systems and backups are managed separately. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Search by key, then act on one exact run ID. +Takeaway +Search by key, then act on one exact run ID. diff --git a/docs/diagrams/identity-provider-setup.svg b/docs/diagrams/identity-provider-setup.svg index a60e5b21..f4fb004d 100644 --- a/docs/diagrams/identity-provider-setup.svg +++ b/docs/diagrams/identity-provider-setup.svg @@ -105,55 +105,9 @@ SPDX-License-Identifier: Apache-2.0 Local development: weave platform setup prepares its own Keycloak for steps 1 to 4, and weave platform user links a person with grants (step 5). - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Your provider proves identity. Weave grants decide what happens next. +Takeaway +Your provider proves identity. Weave grants decide what happens next. diff --git a/docs/diagrams/integration-delivery.svg b/docs/diagrams/integration-delivery.svg index 88dac204..7e7b41b8 100644 --- a/docs/diagrams/integration-delivery.svg +++ b/docs/diagrams/integration-delivery.svg @@ -62,55 +62,9 @@ SPDX-License-Identifier: Apache-2.0 Provider-specific records are evidence, not delivery guarantees. Teams retains reference lifecycle; WhatsApp retains status facts; Telegram retains update receipts. At-least-once delivery remains. Broker offsets do not create a global effects transaction. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -An admission receipt and a provider acknowledgment prove different things. +Takeaway +An admission receipt and a provider acknowledgment prove different things. diff --git a/docs/diagrams/integrations-admission.svg b/docs/diagrams/integrations-admission.svg index 77ae7da0..68e04ead 100644 --- a/docs/diagrams/integrations-admission.svg +++ b/docs/diagrams/integrations-admission.svg @@ -78,55 +78,9 @@ SPDX-License-Identifier: Apache-2.0 Check each layer separately Package validation checks contracts. Native tests check composition. Neither proves a provider account, live access, or successful delivery. Credentials -stay outside workflow input. +stay outside workflow input. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Installed code still needs published contracts and permission to execute. +Takeaway +Installed code still needs published contracts and permission to execute. diff --git a/docs/diagrams/integrations-directions.svg b/docs/diagrams/integrations-directions.svg index 7c35bd33..d6edd1be 100644 --- a/docs/diagrams/integrations-directions.svg +++ b/docs/diagrams/integrations-directions.svg @@ -88,55 +88,9 @@ SPDX-License-Identifier: Apache-2.0 An acknowledgment is evidence at one boundary Outbound retries keep the same event body and identity. Every lane needs current scoped authority; no receipt alone proves a finished workflow or -delivery. Calling an API from a workflow step is an Action, not shown here. +delivery. Calling an API from a workflow step is an Action, not shown here. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Read an acknowledgment in the context of the boundary that produced it. +Takeaway +Read an acknowledgment in the context of the boundary that produced it. diff --git a/docs/diagrams/integrations-http-profile.svg b/docs/diagrams/integrations-http-profile.svg index 7fc04c76..48b9e35f 100644 --- a/docs/diagrams/integrations-http-profile.svg +++ b/docs/diagrams/integrations-http-profile.svg @@ -82,55 +82,9 @@ SPDX-License-Identifier: Apache-2.0 Keep policy and data separate The native executor enforces the pinned operation. A workflow supplies declared values within that boundary. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep deployment policy fixed and pass only the permitted per-run values. +Takeaway +Keep deployment policy fixed and pass only the permitted per-run values. diff --git a/docs/diagrams/integrations-incidents-replay.svg b/docs/diagrams/integrations-incidents-replay.svg index 9c43fc0d..f4731620 100644 --- a/docs/diagrams/integrations-incidents-replay.svg +++ b/docs/diagrams/integrations-incidents-replay.svg @@ -77,55 +77,9 @@ SPDX-License-Identifier: Apache-2.0 Replay cannot fill missing evidence authorization_verified remains false. Clear the last blocking incident to continue. Whole-run retry needs a terminal parent and creates new operation -keys with possible new effects. +keys with possible new effects. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Inspect the recorded attempt before deciding whether a retry is safe. +Takeaway +Inspect the recorded attempt before deciding whether a retry is safe. diff --git a/docs/diagrams/integrations-kafka-receipts.svg b/docs/diagrams/integrations-kafka-receipts.svg index a543e5e8..e8cf9028 100644 --- a/docs/diagrams/integrations-kafka-receipts.svg +++ b/docs/diagrams/integrations-kafka-receipts.svg @@ -66,55 +66,9 @@ SPDX-License-Identifier: Apache-2.0 Rejected records follow explicit policy Receipt policy may advance after rejection is persisted. Halt policy leaves -the rejected offset uncommitted. +the rejected offset uncommitted. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep the durable receipt before advancing the broker offset. +Takeaway +Keep the durable receipt before advancing the broker offset. diff --git a/docs/diagrams/integrations-messaging.svg b/docs/diagrams/integrations-messaging.svg index a43e479e..ae827fd4 100644 --- a/docs/diagrams/integrations-messaging.svg +++ b/docs/diagrams/integrations-messaging.svg @@ -96,55 +96,9 @@ SPDX-License-Identifier: Apache-2.0 Provider acceptance is not delivery Unknown sends need reconciliation. These profiles and local fixtures do not -certify a live account or installation. +certify a live account or installation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Preserve each provider’s own reference, receipt and status identities. +Takeaway +Preserve each provider’s own reference, receipt and status identities. diff --git a/docs/diagrams/integrations-openapi-review.svg b/docs/diagrams/integrations-openapi-review.svg index c5a6f7d2..8d07ee64 100644 --- a/docs/diagrams/integrations-openapi-review.svg +++ b/docs/diagrams/integrations-openapi-review.svg @@ -79,55 +79,9 @@ SPDX-License-Identifier: Apache-2.0 Import remains an offline operation It allocates no live resource IDs and makes no provider request. Treat the generated files as reviewable starting material. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Imported metadata is a starting point for review, not permission to run. +Takeaway +Imported metadata is a starting point for review, not permission to run. diff --git a/docs/diagrams/integrations-sql-transaction.svg b/docs/diagrams/integrations-sql-transaction.svg index 5ee8a28c..5fc9dcf4 100644 --- a/docs/diagrams/integrations-sql-transaction.svg +++ b/docs/diagrams/integrations-sql-transaction.svg @@ -76,55 +76,9 @@ SPDX-License-Identifier: Apache-2.0 Two databases mean two boundaries A durable Weave task record does not make the external database part of -Weave’s transaction. +Weave’s transaction. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -An uncertain SQL commit needs reconciliation before another attempt. +Takeaway +An uncertain SQL commit needs reconciliation before another attempt. diff --git a/docs/diagrams/integrations-time-and-signals.svg b/docs/diagrams/integrations-time-and-signals.svg index fb1f08e3..facfa8e2 100644 --- a/docs/diagrams/integrations-time-and-signals.svg +++ b/docs/diagrams/integrations-time-and-signals.svg @@ -82,55 +82,9 @@ SPDX-License-Identifier: Apache-2.0 Use the right clock as evidence Database time governs live admission. Offline replay uses the recorded -receipts and deadline facts, not the current wall clock. +receipts and deadline facts, not the current wall clock. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Schedules create runs; waits and signals continue an existing run. +Takeaway +Schedules create runs; waits and signals continue an existing run. diff --git a/docs/diagrams/no-code-integration.svg b/docs/diagrams/no-code-integration.svg index c0a50df6..cf974a6c 100644 --- a/docs/diagrams/no-code-integration.svg +++ b/docs/diagrams/no-code-integration.svg @@ -110,55 +110,9 @@ SPDX-License-Identifier: Apache-2.0 Only HTTPS origins listed on the connection; redirects are not followed. Private and loopback addresses need a network the operator allows; link-local and known metadata addresses are always refused. Responses stop at 1 MiB and calls at 30 seconds. Secrets resolve by handle for the granted release only. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -You describe the request. The platform runs fixed code, only to destinations you allowed. +Takeaway +You describe the request. The platform runs fixed code, only to destinations you allowed. diff --git a/docs/diagrams/operations-authority.svg b/docs/diagrams/operations-authority.svg index 8f801ce5..03632370 100644 --- a/docs/diagrams/operations-authority.svg +++ b/docs/diagrams/operations-authority.svg @@ -81,55 +81,9 @@ SPDX-License-Identifier: Apache-2.0 Keep configuration ownership explicit A private env file does not bypass authorization. Use the right identity for -the process and the exact scope for each operation. +the process and the exact scope for each operation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Give each process the identity and credentials its own job requires. +Takeaway +Give each process the identity and credentials its own job requires. diff --git a/docs/diagrams/operations-evidence.svg b/docs/diagrams/operations-evidence.svg index 82d68177..6b48c1ad 100644 --- a/docs/diagrams/operations-evidence.svg +++ b/docs/diagrams/operations-evidence.svg @@ -76,55 +76,9 @@ SPDX-License-Identifier: Apache-2.0 Explicit WEAVE_TELEMETRY enables owned providers and bounded export to a collector. It is off by default; dropped spans do not erase durable facts or prove an effect never occurred. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Find the failed boundary before retrying a request or external effect. +Takeaway +Find the failed boundary before retrying a request or external effect. diff --git a/docs/diagrams/operations-restore.svg b/docs/diagrams/operations-restore.svg index 56e7d13f..ee6a8228 100644 --- a/docs/diagrams/operations-restore.svg +++ b/docs/diagrams/operations-restore.svg @@ -77,55 +77,9 @@ SPDX-License-Identifier: Apache-2.0 Restored leases are not newly fenced attempts Their original proofs and deadlines remain. A restore does not create a new fencing epoch; avoid running both deployments against the same external -effects. +effects. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep the source fenced while you verify the separate restored target. +Takeaway +Keep the source fenced while you verify the separate restored target. diff --git a/docs/diagrams/operations-retention.svg b/docs/diagrams/operations-retention.svg index f5b6d3c7..f1e394a5 100644 --- a/docs/diagrams/operations-retention.svg +++ b/docs/diagrams/operations-retention.svg @@ -78,55 +78,9 @@ SPDX-License-Identifier: Apache-2.0 Omitted records keep their protection Workflow history, provider receipts, source fences, catalogs, and outbox -history are never deleted here; archived runs are purged one at a time. +history are never deleted here; archived runs are purged one at a time. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Review the exact plan; applying it rechecks every candidate. +Takeaway +Review the exact plan; applying it rechecks every candidate. diff --git a/docs/diagrams/operations-topology.svg b/docs/diagrams/operations-topology.svg index c80d19de..54c698cd 100644 --- a/docs/diagrams/operations-topology.svg +++ b/docs/diagrams/operations-topology.svg @@ -95,55 +95,9 @@ SPDX-License-Identifier: Apache-2.0 Start the dependencies and verify readiness, then start the API and the required admitted executors. Verify a real run, and replace a process deliberately when its configuration changes. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep process identities separate and reuse the installation’s saved receipts. +Takeaway +Keep process identities separate and reuse the installation’s saved receipts. diff --git a/docs/diagrams/operations-upgrade.svg b/docs/diagrams/operations-upgrade.svg index 6bbd4b9a..a9863515 100644 --- a/docs/diagrams/operations-upgrade.svg +++ b/docs/diagrams/operations-upgrade.svg @@ -84,55 +84,9 @@ SPDX-License-Identifier: Apache-2.0 All three gates must pass Only then deliberately reenable writers and monitor. A successful process -start is not enough to accept an upgrade. +start is not enough to accept an upgrade. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Check schema, persisted requirements and a real run before reopening writers. +Takeaway +Check schema, persisted requirements and a real run before reopening writers. diff --git a/docs/diagrams/platform-in-plain-english.svg b/docs/diagrams/platform-in-plain-english.svg index 20471687..285cc412 100644 --- a/docs/diagrams/platform-in-plain-english.svg +++ b/docs/diagrams/platform-in-plain-english.svg @@ -60,55 +60,9 @@ SPDX-License-Identifier: Apache-2.0 Just learning? Start with local simulation. YAML + sample input + mocks → a result, without API, database, or external calls. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -The API coordinates, the database remembers, and integration code calls other systems. +Takeaway +The API coordinates, the database remembers, and integration code calls other systems. diff --git a/docs/diagrams/security-boundaries.svg b/docs/diagrams/security-boundaries.svg index cb3ba4d4..eb3402b2 100644 --- a/docs/diagrams/security-boundaries.svg +++ b/docs/diagrams/security-boundaries.svg @@ -51,55 +51,9 @@ SPDX-License-Identifier: Apache-2.0 Resolve scoped secret handles only for authorized work and approved destinations. Migration owner, application, scheduler and worker identities remain separate. Provider role claims, URL IDs and compiler success do not grant permission. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Identity says who called; current scoped grants decide what they may do. +Takeaway +Identity says who called; current scoped grants decide what they may do. diff --git a/docs/diagrams/sign-in-roles.svg b/docs/diagrams/sign-in-roles.svg index 6ff0463e..d269c571 100644 --- a/docs/diagrams/sign-in-roles.svg +++ b/docs/diagrams/sign-in-roles.svg @@ -73,55 +73,9 @@ SPDX-License-Identifier: Apache-2.0 in its tenant, project, and environment. Provider role claims do not grant access. Hidden buttons in Studio are only a convenience. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Sign-in proves who you are. Only the platform’s grants decide what you may do. +Takeaway +Sign-in proves who you are. Only the platform’s grants decide what you may do. diff --git a/docs/diagrams/system-context.svg b/docs/diagrams/system-context.svg index d01dc978..dcc6da2b 100644 --- a/docs/diagrams/system-context.svg +++ b/docs/diagrams/system-context.svg @@ -71,55 +71,9 @@ SPDX-License-Identifier: Apache-2.0 Connectors run in a native executor; your own handlers run in remote workers. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Keep workflow checks, durable coordination and external effects distinct. +Takeaway +Keep workflow checks, durable coordination and external effects distinct. diff --git a/docs/diagrams/tutorial-route.svg b/docs/diagrams/tutorial-route.svg index 36994a70..bfe689f4 100644 --- a/docs/diagrams/tutorial-route.svg +++ b/docs/diagrams/tutorial-route.svg @@ -65,55 +65,9 @@ SPDX-License-Identifier: Apache-2.0 Both branches depend on the running API. Continue with the CLI tutorial, then an AWS, Azure, or Google Cloud deployment. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -Get one working checkpoint before adding the next integration boundary. +Takeaway +Get one working checkpoint before adding the next integration boundary. diff --git a/docs/diagrams/worker-and-operator-roles.svg b/docs/diagrams/worker-and-operator-roles.svg index ca9bef6b..6144d128 100644 --- a/docs/diagrams/worker-and-operator-roles.svg +++ b/docs/diagrams/worker-and-operator-roles.svg @@ -79,53 +79,6 @@ SPDX-License-Identifier: Apache-2.0 3. An accepted result lets the engine continue A crash can repeat an attempt; use a stable operation key for external effects. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -The operator manages runs. The worker performs tasks. +Takeaway +The operator manages runs. The worker performs tasks. diff --git a/docs/diagrams/worker-recovery.svg b/docs/diagrams/worker-recovery.svg index b7d44dd4..1cc9dd30 100644 --- a/docs/diagrams/worker-recovery.svg +++ b/docs/diagrams/worker-recovery.svg @@ -58,55 +58,9 @@ SPDX-License-Identifier: Apache-2.0 No accepted completion? Recover according to the effect. Safe retries may get a new lease; late results stay fenced. Ambiguous non-idempotent effects need reconciliation. Cancellation is not proof of no effect. - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Lumi’s takeaway -A missing completion does not mean the external action never happened. +Takeaway +A missing completion does not mean the external action never happened. diff --git a/docs/guides/lumi.md b/docs/guides/lumi.md index b15870e1..a42bcfaa 100644 --- a/docs/guides/lumi.md +++ b/docs/guides/lumi.md @@ -18,8 +18,6 @@ SPDX-License-Identifier: Apache-2.0 # Lumi assistant -![Lumi, the Firefly Weave assistant](../../assets/lumi.png){ .lumi-guide } - Lumi is an optional Studio assistant for explaining and drafting Weave definitions. It returns text and source proposals for review. It cannot publish, activate, run, delete, upload, or modify resources. Proposals still need the normal compiler and diff --git a/docs/stylesheets/weave.css b/docs/stylesheets/weave.css index 0b6e7b0d..891400f0 100644 --- a/docs/stylesheets/weave.css +++ b/docs/stylesheets/weave.css @@ -72,9 +72,3 @@ SPDX-License-Identifier: Apache-2.0 @media (prefers-reduced-motion: reduce) { *, *::before, *::after { scroll-behavior: auto !important; transition: none !important; animation: none !important; } } - -/* Keep the companion illustration small enough to leave instructions in focus. */ -.md-typeset img[src$="lumi.png"] { width: 10rem; height: auto; } - -.md-typeset img.lumi-guide { float: right; width: 8rem; margin: 0 0 1rem 1rem; } -.md-typeset img.lumi-guide ~ h2 { clear: both; } diff --git a/docs/visual-assets.md b/docs/visual-assets.md index 8386a679..4d53c779 100644 --- a/docs/visual-assets.md +++ b/docs/visual-assets.md @@ -16,7 +16,7 @@ Author: Firefly Software Foundation SPDX-License-Identifier: Apache-2.0 --> -# Use the Weave logo, Lumi, and diagrams +# Use the Weave logo and diagrams Use this page when you place the Weave logo in a document or slide, or when you draw or change a diagram in this documentation. It tells you which file to use @@ -25,11 +25,13 @@ diagram follows, and how to check a change at its real size. It takes about ten minutes to read. To edit, you need a text editor or a standards-compliant SVG editor, and a Chromium-based browser to check the result. -The brand assets are distributed under the Apache License 2.0. Logos and -technical diagrams use editable SVG source, with no scripts, remote fonts, -embedded raster images, or `foreignObject`. Lumi is an image-generated PNG -with a transparent background. The checked-in image is the master asset; -building Studio or the documentation does not call an image-generation service. +Weave's own logos and technical diagrams are distributed under the Apache +License 2.0. The Firefly marks are not: they are trademarks of Firefly Software +Solutions Inc., used with permission (see `NOTICE`). The source inventory, +`docs/contributing/source-inventory.toml`, lists every file that carries them: +`assets/brand/`, the Studio copies and the favicons. Logos and technical +diagrams use editable SVG source, with no scripts, remote fonts, embedded raster +images, or `foreignObject`. ## Choose the right asset @@ -39,7 +41,6 @@ building Studio or the documentation does not call an image-generation service. | [Monochrome symbol](../assets/weave-logo-mono.svg) | One-color reproduction on light surfaces | 256 × 256 | | [Reversed symbol](../assets/weave-logo-reversed.svg) | The white mark on dark surfaces; the website header uses it | 256 × 256 | | [Banner](../assets/banner.svg) | The README and project overview; it has an opaque white background | 1120 × 280 | -| [Lumi PNG](../assets/lumi.png) | Studio, documentation, slides, and diagram companion artwork; see [Meet Lumi](#meet-lumi) | 1254 × 1254, transparent | | Badges for the [license](../assets/badges/license.svg), [Python version](../assets/badges/python.svg), and [maturity](../assets/badges/alpha.svg) | Small labels that state facts from the source tree. There is no CI, release, coverage, or live-provider badge | 28 pixels high | | Technical diagrams in `docs/diagrams/` | Explaining how Weave works; the [visual guide](visual-guide.md) lists every one | 960 or 1120 pixels wide | @@ -102,7 +103,7 @@ structural ones. | Arial for text (`Arial, Helvetica, sans-serif`), Menlo or Consolas for code | These fonts are installed almost everywhere, so labels do not reflow | | Text at least 16 pixels | Labels stay legible at 100% zoom | | Forest `#173D34` and jade `#367D68` on mist `#EEF4F0`, with warm `#FFF7E5` for cautions | Diagrams look like one family and keep enough contrast | -| Most diagrams end with a "Lumi's takeaway" band | One sentence tells the reader what to remember | +| Most diagrams end with a "Takeaway" band | One sentence tells the reader what to remember | | A `` that states everything the picture shows | Readers who cannot see the image get the same facts | **Every label must be true.** Check each command, path, field, and error code in @@ -179,55 +180,13 @@ other variants and sizes. own file name so a failed capture is never confused with a corrected one, and keep previews outside the repository. -## Meet Lumi +## Mascot artwork -![Lumi, the Firefly Weave guide](../assets/lumi.png) - -**Lumi** is Weave's firefly guide: a sculpted forest-green body, translucent -mint wings, and an amber lantern. The image uses soft lighting and a transparent -background so it sits naturally on white, mist, or dark forest surfaces. - -Use the [PNG master](../assets/lumi.png) for new artwork. Studio's pairing and -home screens and the documentation introductions use this image. Existing -self-contained SVG diagrams and CLI graph exports retain the earlier vector -illustration; those are separate assets, not a vector version of this image. -The official Weave symbol remains the application icon and primary product mark. - -### Reuse Lumi in a page, slide, or diagram - -1. Download the PNG master above. Its alpha channel provides transparency; - there is no white rectangle to remove. -2. Keep the square aspect ratio. Leave space around both antennae and the wings, - and avoid circular crops that cut through them. -3. Use a displayed width of 96–240 pixels for an introduction or diagram - companion. At small toolbar sizes, use the Weave symbol instead: Lumi's face - and wings need room to remain legible. -4. Place Lumi beside a short takeaway, outside the boxes and arrows that explain - the system. Do not use the character as a status, permission, or execution - indicator. -5. Keep a single shared PNG reference in web pages. For the documentation's SVG - diagrams, place it next to the diagram in the surrounding Markdown instead - of embedding a copy of the raster in every SVG. This keeps diagrams editable - and lets the browser cache the image once. - -For a guide under `docs/guides/`, use this pattern: - -```markdown - -![Lumi, the Firefly Weave guide](../../assets/lumi.png){ .lumi-guide } - -Lumi's takeaway: review the proposed change before applying it. - -## Follow the process - -![How a suggestion becomes a reviewed draft](../diagrams/lumi-review-lifecycle.svg) -``` - -The [Lumi assistant guide](guides/lumi.md) shows the image alongside the -explanation and review diagram. In Studio, `studio/public/assets/lumi.png` is -an identical copy of the master; update both together when the artwork changes. -Machine JSON output contains no branding. CLI help uses the official logo; -progress animation settings are in the [CLI reference](reference/cli.md#local-platform-commands). +Firefly Weave no longer uses a mascot. Studio, the documentation, the API +explorer and exported graph drawings carry no character artwork, and diagrams +end with a plain **Takeaway** band. Machine JSON output contains no branding. +CLI help uses the official logo; progress animation settings are in the +[CLI reference](reference/cli.md#local-platform-commands). ## Next steps diff --git a/docs/visual-guide.md b/docs/visual-guide.md index ccc808b1..a00eba57 100644 --- a/docs/visual-guide.md +++ b/docs/visual-guide.md @@ -79,7 +79,7 @@ platform behaves; a generated workflow graph explains your own definition. platform, or an external system. Credentials appear only on the side that needs them. - **A shaded note** gives a rule or a boundary that applies to the whole picture. - **Lumi's takeaway**, at the bottom, is the one idea to remember. + **Takeaway**, at the bottom, is the one idea to remember. - **Database diagrams** show selected relationships, not a complete schema or permission to delete referenced records. diff --git a/scripts/brand/weave-lockup.mjs b/scripts/brand/weave-lockup.mjs new file mode 100644 index 00000000..4dde88ba --- /dev/null +++ b/scripts/brand/weave-lockup.mjs @@ -0,0 +1,140 @@ +/* +Copyright 2026 Firefly Software Foundation. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +Author: Firefly Software Foundation +SPDX-License-Identifier: Apache-2.0 +*/ +// Composes the Firefly Weave lockup and the Firefly icon files from a local +// checkout of the private Firefly Brand Kit. Run it from the kit's root (the +// kit resolves its fonts relative to the working directory): +// +// node /scripts/brand/weave-lockup.mjs --out +// +// No kit code is copied into Weave: the kit's logo and type modules are +// imported from the working directory at run time, and only the generated +// files are written. The construction is the approved one in the brand +// foundation design: the compact Firefly logo, a hairline separator 1X after +// the chevron apex, and "Weave" in Manrope 500 1X after the separator, where +// 1X is the Firefly x-height (108 drawing units). +import { copyFileSync, existsSync, mkdirSync, writeFileSync } from "node:fs"; +import { dirname, join, resolve } from "node:path"; +import { pathToFileURL } from "node:url"; +import { parseArgs } from "node:util"; + +const { values } = parseArgs({ + options: { + out: { type: "string" }, + favicons: { type: "string", default: "dist/Firefly-Brand-Kit/02-Logo/favicon" }, + }, +}); +if (!values.out || !existsSync(join(values.out, "studio/package.json"))) + throw Error("Pass --out ."); +if (!existsSync("scripts/logo.mjs")) + throw Error("Run this from the root of a Firefly Brand Kit checkout: ./scripts/logo.mjs is missing."); + +const kit = (path) => import(pathToFileURL(resolve(path)).href); +const { geometry, placed, svg, icon } = await kit("scripts/logo.mjs"); +const { face, line } = await kit("scripts/lib/type.mjs"); + +const X = 108; +const PAPER = "#f3f1eb"; +const CHARCOAL = "#10110f"; +const r = (v) => Math.round(v * 100) / 100; +const NOTICE = + "\n"; + +/** Adds role, title and desc to a drawing's root without touching the drawing. */ +function accessible(drawing, title, desc) { + const open = drawing.indexOf(">", drawing.indexOf("${title}${desc}${drawing.slice(open)}\n`; +} + +/** The lockup in drawing units, with its measurements. */ +function lockup({ ink, solid }) { + const [x0, top, FW, FH] = geometry().compact; + const logo = svg({ ink, slogan: false, solid, title: "", id: "weave-lockup-trail" }); + const sx = x0 + FW - 1 + X; + const half = (1.25 * FH) / 2; + const [y0, y1] = [-54 - half, -54 + half]; + const separator = ``; + const font = face(500); + const size = font.unitsPerEm * 0.1; + const tracking = -45 / font.unitsPerEm; + const scale = size / font.unitsPerEm; + const run = font.layout("Weave"); + const first = run.glyphs[0].bbox.minX * scale; + const x = sx + X - first; + let cursor = x; + run.positions.slice(0, -1).forEach((p) => (cursor += p.xAdvance * scale + tracking * size)); + const right = cursor + run.positions.at(-1).xOffset * scale + run.glyphs.at(-1).bbox.maxX * scale; + const word = line("Weave", { x, y: 0, size, weight: 500, tracking, fill: ink }); + const box = [x0, r(y0 - 1), r(right + 1 - x0), r(y1 - y0 + 2)]; + const drawing = `${placed(logo, x0, top, FW)}${separator}${word}`; + return { drawing, FW, width: box[2], height: box[3] }; +} + +const colorway = (ink) => (ink === PAPER ? "paper" : "charcoal"); +const files = {}; +for (const [name, ink, solid] of [ + ["weave-lockup-reversed", PAPER, false], + ["weave-lockup-color", CHARCOAL, false], + ["weave-lockup-small-reversed", PAPER, true], +]) { + const { drawing, FW, width, height } = lockup({ ink, solid }); + files[`assets/brand/${name}.svg`] = accessible( + drawing, + "Firefly Weave", + `The Firefly logo${solid ? " with a solid chevron" : ""}, a hairline separator and the word Weave, in ${colorway(ink)} on a transparent background.`, + ); + console.log( + `${name}: FW ${r(FW)}, width ${width}, height ${height}, FW/width ${(FW / width).toFixed(4)}, Firefly part at 200px ${r((FW / width) * 200)}px`, + ); +} +const tile = (options, id) => icon(options).replaceAll("icon-trail", id); +files["assets/brand/firefly-icon.svg"] = accessible( + tile({}, "firefly-icon-trail"), + "Firefly", + "The Firefly icon: the amber spark and chevron with its light trail on a charcoal rounded tile.", +); +files["assets/brand/firefly-icon-small.svg"] = accessible( + tile({ solid: true }, "firefly-icon-small-trail"), + "Firefly", + "The Firefly icon for small sizes: the amber spark and a solid chevron on a charcoal rounded tile.", +); +files["assets/brand/firefly-mark.svg"] = accessible( + tile({ background: "none" }, "firefly-mark-trail"), + "Firefly", + "The Firefly mark: the amber spark and chevron with its light trail on a transparent background.", +); +for (const name of ["weave-lockup-reversed", "weave-lockup-small-reversed", "firefly-mark"]) + files[`studio/public/assets/${name}.svg`] = files[`assets/brand/${name}.svg`]; +files["studio/public/favicon.svg"] = files["assets/brand/firefly-icon.svg"]; + +for (const [path, text] of Object.entries(files)) { + const target = join(values.out, path); + mkdirSync(dirname(target), { recursive: true }); + writeFileSync(target, text); +} +for (const name of ["favicon.ico", "apple-touch-icon.png"]) { + const source = join(values.favicons, name); + if (!existsSync(source)) + throw Error(`Missing ${source}: run "npm run build -- --only logo" in the kit first.`); + copyFileSync(source, join(values.out, "studio/public", name)); +} +console.log(`Wrote ${Object.keys(files).length + 2} files under ${resolve(values.out)}.`); diff --git a/scripts/docs_hook.py b/scripts/docs_hook.py index a35a429d..7808a039 100644 --- a/scripts/docs_hook.py +++ b/scripts/docs_hook.py @@ -45,8 +45,6 @@ "tests/fixtures/e2-provider/README.md": "project/provider-fixture.md", } ASSETS = ( - "assets/lumi.png", - "assets/lumi.svg", "assets/weave-logo.svg", "assets/weave-logo-reversed.svg", "assets/weave-logo-mono.svg", diff --git a/src/firefly_weave/api/documentation.py b/src/firefly_weave/api/documentation.py index 5032aef2..0a2215c2 100644 --- a/src/firefly_weave/api/documentation.py +++ b/src/firefly_weave/api/documentation.py @@ -23,7 +23,6 @@ from starlette.responses import HTMLResponse, JSONResponse from starlette.routing import Route -from firefly_weave.branding import LUMI_SVG_BODY from firefly_weave.contracts.openapi import export_openapi # Pin bytes as well as version: the browser rejects changed CDN assets. @@ -66,13 +65,10 @@ async def swagger(request: Request) -> HTMLResponse: -

Firefly Weave · API explorer

+

Firefly Weave · API explorer

Browse operations, authorize with a current access token, then choose Try it out.

Requests run against this API. Write operations change real data. Tokens stay in this page's memory.

diff --git a/src/firefly_weave/branding.py b/src/firefly_weave/branding.py deleted file mode 100644 index 3ee37adb..00000000 --- a/src/firefly_weave/branding.py +++ /dev/null @@ -1,67 +0,0 @@ -# Copyright 2026 Firefly Software Foundation. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# Author: Firefly Software Foundation -# SPDX-License-Identifier: Apache-2.0 - -"""Lumi artwork for self-contained workflow drawings and the API explorer.""" - -# One mascot per SVG: its gradient IDs are namespaced to avoid graph marker IDs. -LUMI_SVG_BODY = """ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -""" diff --git a/src/firefly_weave/sdk/visualization.py b/src/firefly_weave/sdk/visualization.py index eed6b270..45e17211 100644 --- a/src/firefly_weave/sdk/visualization.py +++ b/src/firefly_weave/sdk/visualization.py @@ -22,7 +22,6 @@ from collections import defaultdict, deque from typing import Literal -from firefly_weave.branding import LUMI_SVG_BODY from firefly_weave.compiler.api import CompiledArtifact from firefly_weave.compiler.ir import ArtifactEnvelope, WorkflowIR from firefly_weave.contracts.values import JsonObject @@ -204,8 +203,6 @@ def esc(value: object) -> str: ) parts.append( f'Firefly Weave · compiled topology · no ' - f"external systems contacted" - f'' - f"{LUMI_SVG_BODY}" + "external systems contacted" ) return "\n".join(parts) + "\n" diff --git a/studio/package-lock.json b/studio/package-lock.json index 0f95843f..0273307c 100644 --- a/studio/package-lock.json +++ b/studio/package-lock.json @@ -28,6 +28,7 @@ "@angular/compiler-cli": "22.2.1", "@playwright/test": "1.55.1", "@types/node": "24.3.0", + "lucide-static": "1.52.0", "prettier": "3.6.2", "typescript": "6.0.2", "vitest": "4.0.8" @@ -5033,6 +5034,13 @@ "node": "20 || >=22" } }, + "node_modules/lucide-static": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-1.52.0.tgz", + "integrity": "sha512-0zZYihAze4ZmUCcyNa9OkWYqn/Y5f9AdTh02AZIxMtP5ravcTTfoSIAnUPBH6ZvKxt+ZW28JB0ldzLRyD82fcw==", + "dev": true, + "license": "ISC" + }, "node_modules/magic-string": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", diff --git a/studio/package.json b/studio/package.json index ad1e5d3f..2174b840 100644 --- a/studio/package.json +++ b/studio/package.json @@ -9,7 +9,8 @@ "check": "tsc --noEmit -p tsconfig.json", "test": "vitest run", "test:browser": "playwright test", - "format:check": "prettier --check \"src/**/*.{ts,html,css}\" \"tests/**/*.ts\" \"*.json\" \"*config.ts\"" + "icons": "node scripts/build-icons.mjs", + "format:check": "prettier --check \"src/**/*.{ts,html,css}\" \"tests/**/*.ts\" \"scripts/**/*.mjs\" \"*.json\" \"*config.ts\"" }, "dependencies": { "@angular/common": "22.2.1", @@ -31,6 +32,7 @@ "@angular/compiler-cli": "22.2.1", "@playwright/test": "1.55.1", "@types/node": "24.3.0", + "lucide-static": "1.52.0", "prettier": "3.6.2", "typescript": "6.0.2", "vitest": "4.0.8" diff --git a/studio/public/apple-touch-icon.png b/studio/public/apple-touch-icon.png new file mode 100644 index 00000000..f1778d60 Binary files /dev/null and b/studio/public/apple-touch-icon.png differ diff --git a/studio/public/assets/firefly-mark.svg b/studio/public/assets/firefly-mark.svg new file mode 100644 index 00000000..6d4d18b9 --- /dev/null +++ b/studio/public/assets/firefly-mark.svg @@ -0,0 +1,2 @@ + +FireflyThe Firefly mark: the amber spark and chevron with its light trail on a transparent background. diff --git a/studio/public/assets/lumi.png b/studio/public/assets/lumi.png deleted file mode 100644 index 0f6de218..00000000 Binary files a/studio/public/assets/lumi.png and /dev/null differ diff --git a/studio/public/assets/lumi.svg b/studio/public/assets/lumi.svg deleted file mode 100644 index 8319101b..00000000 --- a/studio/public/assets/lumi.svg +++ /dev/null @@ -1,67 +0,0 @@ - - -Lumi, the Firefly Weave guide -A forest-green firefly with a softly sculpted face, attentive eyes, folded mint wings, and a warm golden lantern. The angular wings echo the woven Weave symbol. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/studio/public/assets/weave-lockup-reversed.svg b/studio/public/assets/weave-lockup-reversed.svg new file mode 100644 index 00000000..58ba0519 --- /dev/null +++ b/studio/public/assets/weave-lockup-reversed.svg @@ -0,0 +1,2 @@ + +Firefly WeaveThe Firefly logo, a hairline separator and the word Weave, in paper on a transparent background. diff --git a/studio/public/assets/weave-lockup-small-reversed.svg b/studio/public/assets/weave-lockup-small-reversed.svg new file mode 100644 index 00000000..7816e840 --- /dev/null +++ b/studio/public/assets/weave-lockup-small-reversed.svg @@ -0,0 +1,2 @@ + +Firefly WeaveThe Firefly logo with a solid chevron, a hairline separator and the word Weave, in paper on a transparent background. diff --git a/studio/public/assets/weave-logo-reversed.svg b/studio/public/assets/weave-logo-reversed.svg deleted file mode 100644 index bc3c7b09..00000000 --- a/studio/public/assets/weave-logo-reversed.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -Firefly Weave reversed symbol -The woven W in white with a transparent diagonal underpass. For dark backgrounds. - - - - - - - - - - - diff --git a/studio/public/assets/weave-logo.svg b/studio/public/assets/weave-logo.svg deleted file mode 100644 index ca557374..00000000 --- a/studio/public/assets/weave-logo.svg +++ /dev/null @@ -1,31 +0,0 @@ - - -Firefly Weave symbol -Two interlaced V-shaped bands form a compact W. A clear diagonal underpass preserves the woven structure in color and in one color. Forest and jade on a transparent background; use on white or light neutral surfaces. - - - - - - - - - - - diff --git a/studio/public/favicon.ico b/studio/public/favicon.ico new file mode 100644 index 00000000..2615ce3d Binary files /dev/null and b/studio/public/favicon.ico differ diff --git a/studio/public/favicon.svg b/studio/public/favicon.svg new file mode 100644 index 00000000..4c52c208 --- /dev/null +++ b/studio/public/favicon.svg @@ -0,0 +1,2 @@ + +FireflyThe Firefly icon: the amber spark and chevron with its light trail on a charcoal rounded tile. diff --git a/studio/public/fonts/manrope/manrope-latin-ext-wght-normal.woff2 b/studio/public/fonts/manrope/manrope-latin-ext-wght-normal.woff2 new file mode 100644 index 00000000..bd24140a Binary files /dev/null and b/studio/public/fonts/manrope/manrope-latin-ext-wght-normal.woff2 differ diff --git a/studio/public/fonts/manrope/manrope-latin-wght-normal.woff2 b/studio/public/fonts/manrope/manrope-latin-wght-normal.woff2 new file mode 100644 index 00000000..71eb731d Binary files /dev/null and b/studio/public/fonts/manrope/manrope-latin-wght-normal.woff2 differ diff --git a/studio/public/licenses/NOTICE.txt b/studio/public/licenses/NOTICE.txt new file mode 100644 index 00000000..293d90ca --- /dev/null +++ b/studio/public/licenses/NOTICE.txt @@ -0,0 +1,35 @@ +Firefly Weave +Copyright 2026 Firefly Software Foundation. +Author: Firefly Software Foundation +SPDX-License-Identifier: Apache-2.0 + +This product includes software developed for Firefly Weave by the Firefly +Software Foundation, licensed under the Apache License 2.0. + +Firefly marks. The Firefly name, the firefly wordmark with its spark and +chevron, the Firefly icon and the Firefly Weave logo that combines them with +the word "Weave" are trademarks and proprietary artwork of Firefly Software +Solutions Inc. Copyright 2026 Firefly Software Solutions Inc. All rights +reserved. The Firefly Software Foundation uses them in Firefly Weave with the +permission of Firefly Software Solutions Inc. They are not licensed under the +Apache License 2.0, and this notice grants no right to use, modify or +redistribute them apart from unmodified copies of this product. The source +inventory, docs/contributing/source-inventory.toml, lists every file that +carries them. + +Manrope. Studio includes the Manrope typeface, Copyright 2019 The Manrope +Project Authors (https://github.com/sharanda/manrope), licensed under the SIL +Open Font License, Version 1.1 (assets/fonts/manrope/OFL.txt). + +Lucide. Studio's icons are derived from Lucide (https://lucide.dev), +lucide-static 1.52.0, Copyright (c) 2026 Lucide Icons and Contributors, +licensed under the ISC License; portions derive from Feather, Copyright (c) +2013-present Cole Bemis, licensed under the MIT License +(studio/public/licenses/lucide-LICENSE.txt). + +Firefly Weave depends on separately distributed software, including PyFly. +Those dependencies retain their own copyrights, licenses, and notices. This +NOTICE does not reattribute third-party code or replace dependency license terms. + +Apache License 2.0 grants no permission to use trade names or trademarks except +as described in the license. See LICENSE for the complete terms. diff --git a/studio/public/licenses/lucide-LICENSE.txt b/studio/public/licenses/lucide-LICENSE.txt new file mode 100644 index 00000000..718bb3f0 --- /dev/null +++ b/studio/public/licenses/lucide-LICENSE.txt @@ -0,0 +1,43 @@ +ISC License + +Copyright (c) 2026 Lucide Icons and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +The following Lucide icons are derived from the Feather project: + +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + +The MIT License (MIT) (for the icons listed above) + +Copyright (c) 2013-present Cole Bemis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/studio/public/licenses/manrope-OFL.txt b/studio/public/licenses/manrope-OFL.txt new file mode 100644 index 00000000..462280f3 --- /dev/null +++ b/studio/public/licenses/manrope-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2019 The Manrope Project Authors (https://github.com/sharanda/manrope) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/studio/scripts/build-icons.mjs b/studio/scripts/build-icons.mjs new file mode 100644 index 00000000..b96e91d7 --- /dev/null +++ b/studio/scripts/build-icons.mjs @@ -0,0 +1,227 @@ +/* +Copyright 2026 Firefly Software Foundation. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +Author: Firefly Software Foundation +SPDX-License-Identifier: Apache-2.0 +*/ +// Writes src/app/icon-data.ts from lucide-static, Studio's only icon source. +// A new icon is a new entry in iconMap, never an inline SVG: run +// `npm run icons` and commit both files. icon.test.ts regenerates the data +// and fails when the committed file differs. +import { readFileSync, writeFileSync } from "node:fs"; +import { fileURLToPath } from "node:url"; +import * as prettier from "prettier"; + +export const LUCIDE_VERSION = "1.52.0"; + +/** Weave icon name → Lucide icon name (one Lucide icon per Weave name). */ +export const iconMap = { + // Navigation and objects + home: "house", + workflows: "workflow", + runs: "circle-play", + tasks: "clipboard-check", + email: "mail", + connections: "plug", + operations: "network", + workers: "cpu", + settings: "settings", + workspace: "layers", + user: "user-round", + template: "layout-template", + assistant: "messages-square", + // Step kinds (brand mapping; lanes do not reassign them) + action: "zap", + decisionTable: "table", + llm: "sparkles", + transform: "braces", + switch: "split", + parallel: "git-fork", + wait: "hourglass", + signal: "radio-tower", + humanTask: "user-round-check", + fail: "octagon-x", + // Commands + play: "play", + plus: "plus", + search: "search", + chevron: "chevron-right", + undo: "undo-2", + redo: "redo-2", + fit: "scan", + source: "code-xml", + check: "check", + download: "download", + upload: "upload", + trash: "trash", + menu: "menu", + more: "ellipsis", + close: "x", + save: "save", + lock: "lock", + external: "external-link", + copy: "copy", + refresh: "refresh-cw", + warning: "triangle-alert", + help: "circle-question-mark", + logout: "log-out", + cloud: "cloud", + laptop: "laptop", + panel: "panel-right", + tidy: "layout-grid", + failCircle: "circle-x", + // Triggers (Lane E) + manualTrigger: "mouse-pointer-click", + webhook: "webhook", + schedule: "calendar-clock", + kafka: "inbox", + appEvent: "app-window", + calledTrigger: "square-arrow-down-right", + // AI agent slots (Lane A) + agent: "bot", + model: "brain-circuit", + tools: "wrench", + memory: "database", + output: "file-output", + // Flow kinds (Lane L and Lane E) + forEach: "iteration-cw", + callWorkflow: "square-stack", + textTemplate: "text-cursor-input", + // Editor (Lane E) + execute: "flask-conical", + pin: "pin", + unpin: "pin-off", + stale: "clock-alert", + breakpoint: "circle-dot", + runHistory: "history", + stickyNote: "sticky-note", + minimap: "map", + zoomIn: "zoom-in", + zoomOut: "zoom-out", + drag: "grip-vertical", + spinner: "loader-circle", + // Operate (Lane O) + overview: "gauge", + clusters: "server", + metrics: "chart-line", + logs: "scroll-text", + alerts: "bell", + alertFiring: "bell-ring", + incidents: "siren", + approvals: "stamp", + compose: "container", + kubernetes: "ship-wheel", + drain: "circle-pause", + revoke: "ban", + // Severity and health + critical: "octagon-alert", + info: "info", + degraded: "circle-alert", + ok: "circle-check", + off: "circle-off", +}; + +/** The attributes weave-icon binds for each element Lucide uses. */ +const ATTRIBUTES = { + path: ["d"], + circle: ["cx", "cy", "r"], + rect: ["x", "y", "width", "height", "rx", "ry"], + line: ["x1", "y1", "x2", "y2"], + polyline: ["points"], + polygon: ["points"], + ellipse: ["cx", "cy", "rx", "ry"], +}; +const studio = new URL("../", import.meta.url); +const lucide = new URL("node_modules/lucide-static/", studio); +const target = new URL("src/app/icon-data.ts", studio); +const ELEMENT = /<(\w+)\b([^>]*?)\/>/g; + +/** The drawing of one Lucide icon as a list of elements and attributes. */ +export function lucideNodes(name) { + const file = new URL(`icons/${name}.svg`, lucide); + let text; + try { + text = readFileSync(file, "utf8"); + } catch { + throw Error( + `lucide-static has no icon "${name}" (${fileURLToPath(file)}).`, + ); + } + const start = text.indexOf(">", text.indexOf("")); + if (body.replace(ELEMENT, "").trim()) + throw Error(`${name}.svg has content weave-icon cannot draw.`); + const nodes = [...body.matchAll(ELEMENT)].map(([, tag, rest]) => { + const allowed = ATTRIBUTES[tag]; + if (!allowed) + throw Error(`${name}.svg uses <${tag}>, which weave-icon does not draw.`); + const attrs = {}; + for (const [, key, value] of rest.matchAll(/([\w-]+)="([^"]*)"/g)) { + if (!allowed.includes(key)) + throw Error( + `${name}.svg: <${tag}> has an unexpected "${key}" attribute.`, + ); + attrs[key] = value; + } + return { tag, attrs }; + }); + if (!nodes.length) throw Error(`${name}.svg draws nothing.`); + return nodes; +} + +/** The text of src/app/icon-data.ts, formatted as the repository formats it. */ +export async function renderIconData() { + const { version } = JSON.parse( + readFileSync(new URL("package.json", lucide), "utf8"), + ); + if (version !== LUCIDE_VERSION) + throw Error( + `Expected lucide-static ${LUCIDE_VERSION}, found ${version}. Run npm ci.`, + ); + const drawings = Object.fromEntries( + Object.entries(iconMap).map(([weave, name]) => [weave, lucideNodes(name)]), + ); + const attributes = [...new Set(Object.values(ATTRIBUTES).flat())]; + const source = `/* +Generated by studio/scripts/build-icons.mjs from lucide-static ${LUCIDE_VERSION} +(https://lucide.dev). Do not edit: change iconMap in the script and run +\`npm run icons\`. Icon geometry: Copyright (c) 2026 Lucide Icons and +Contributors, ISC License; icons derived from Feather: Copyright (c) +2013-present Cole Bemis, MIT License. Full text: +studio/public/licenses/lucide-LICENSE.txt. +*/ +export type IconTag = ${Object.keys(ATTRIBUTES) + .map((t) => JSON.stringify(t)) + .join(" | ")}; +export type IconAttribute = ${attributes.map((a) => JSON.stringify(a)).join(" | ")}; +export interface IconNode { + readonly tag: IconTag; + readonly attrs: Readonly>>; +} +/** Weave icon name → the Lucide icon it draws. */ +export const lucideNames = ${JSON.stringify(iconMap)} as const; +export type IconName = keyof typeof lucideNames; +/** Each icon's elements, in Lucide's order, on a 24 × 24 grid. */ +export const iconNodes: Readonly> = ${JSON.stringify(drawings)}; +`; + const options = await prettier.resolveConfig(fileURLToPath(target)); + return prettier.format(source, { ...options, parser: "typescript" }); +} + +if (process.argv[1] === fileURLToPath(import.meta.url)) { + writeFileSync(target, await renderIconData()); + console.log( + `Wrote ${fileURLToPath(target)} (${Object.keys(iconMap).length} icons).`, + ); +} diff --git a/studio/src/app/app.html b/studio/src/app/app.html index 0b44a92e..1b0adaf0 100644 --- a/studio/src/app/app.html +++ b/studio/src/app/app.html @@ -18,9 +18,7 @@ @if (connecting) {

- Firefly WeaveFirefly Weave Studio + Firefly Weave

Opening Studio… @@ -29,12 +27,9 @@ } @else if (!paired) {

- Firefly WeaveFirefly Weave Studio + Firefly Weave
- Lumi, the Firefly guide

Your workflows, woven together.

@if (desktopShell) {

@@ -101,11 +96,18 @@

Your workflows, woven together.

href="/" aria-label="Firefly Weave Studio home" (click)="$event.preventDefault(); navigate('home')" - >
+ > @for (group of navGroups; track group.label) { @if (group.label) { @@ -249,8 +251,8 @@

Your workflows, woven together.

} -
diff --git a/studio/src/app/app.ts b/studio/src/app/app.ts index 150d4762..d844548f 100644 --- a/studio/src/app/app.ts +++ b/studio/src/app/app.ts @@ -671,8 +671,8 @@ export class App { { value: "email_manager", label: "Email manager" }, { value: "file_reader", label: "File reader" }, { value: "file_manager", label: "File manager" }, - { value: "lumi_user", label: "Lumi user" }, - { value: "lumi_manager", label: "Lumi manager" }, + { value: "lumi_user", label: "Weave AI user" }, + { value: "lumi_manager", label: "Weave AI manager" }, { value: "deployment_reader", label: "Deployment viewer" }, { value: "deployment_planner", label: "Deployment planner" }, { value: "deployment_approver", label: "Deployment approver" }, diff --git a/studio/src/app/connection-wizard.ts b/studio/src/app/connection-wizard.ts index 18417f94..111b93e8 100644 --- a/studio/src/app/connection-wizard.ts +++ b/studio/src/app/connection-wizard.ts @@ -1021,14 +1021,14 @@ const record = (value: unknown): Record => --icon-stroke: 1.5; } li.current .step-marker { - background: var(--forest); - border-color: var(--forest); - color: #fff; + background: var(--accent); + border-color: var(--accent); + color: var(--on-accent); } li.complete .step-marker { - background: #dbece3; - border-color: #b9d8c8; - color: #174d3c; + background: var(--success-bg); + border-color: var(--success-bd); + color: var(--success-ink); } .step-name { overflow: hidden; @@ -1091,7 +1091,7 @@ const record = (value: unknown): Record => border-color: var(--border); } .choice-card:hover { - border-color: var(--jade); + border-color: var(--border-hover); } .choice-icon { flex: none; @@ -1101,8 +1101,8 @@ const record = (value: unknown): Record => display: inline-flex; align-items: center; justify-content: center; - background: var(--mist); - color: var(--forest); + background: var(--raised); + color: var(--text); } .choice-copy { display: grid; @@ -1189,10 +1189,10 @@ const record = (value: unknown): Record => gap: 12px; margin: 16px 0 0; padding: 14px 16px; - border: 1px solid #ebccce; + border: 1px solid var(--danger-bd); border-radius: 8px; - background: #fff6f5; - color: #6f1f27; + background: var(--danger-bg); + color: var(--danger-ink); min-width: 0; } .problem > weave-icon { @@ -1267,19 +1267,19 @@ const record = (value: unknown): Record => font-weight: 400; } .radio-card.selected { - border-color: var(--jade); - background: #e8f3ed; + border-color: var(--accent); + background: var(--selected); } .radio-card.unavailable { cursor: not-allowed; - background: #f8f9f8; + background: var(--disabled-bg); } .radio-card input { width: 16px; height: 16px; margin: 2px 0 0; flex: none; - accent-color: var(--forest); + accent-color: var(--accent); } .radio-copy { display: grid; @@ -1322,15 +1322,15 @@ const record = (value: unknown): Record => flex-wrap: wrap; align-items: center; gap: 10px 14px; - border: 1px dashed #8caaa0; + border: 1px dashed var(--field-border); border-radius: 10px; - background: #f5faf7; + background: var(--sunken); padding: 18px; margin-bottom: 16px; } .file-drop.dragging { - border-color: var(--jade); - background: #e8f3ed; + border-color: var(--accent); + background: var(--selected); } .file-drop .hint { margin: 0; @@ -1351,12 +1351,12 @@ const record = (value: unknown): Record => text-decoration: none; } a.button.primary-link { - background: var(--forest); - border-color: var(--forest); - color: #fff; + background: var(--accent); + border-color: var(--accent); + color: var(--on-accent); } a.button.primary-link:hover { - background: #285947; + background: var(--accent-hover); } .instructions { margin: 12px 0 0; @@ -1384,14 +1384,14 @@ const record = (value: unknown): Record => } .device-code { font: - 650 28px/1.2 ui-monospace, + 600 28px/1.2 ui-monospace, SFMono-Regular, Consolas, monospace; letter-spacing: 0.12em; padding: 12px 18px; border-radius: 8px; - background: var(--mist); + background: var(--raised); border: 1px solid var(--line); overflow-wrap: anywhere; max-width: 100%; @@ -1408,8 +1408,8 @@ const record = (value: unknown): Record => height: 36px; padding: 8px; border-radius: 10px; - background: var(--gold-soft); - color: #7a5a17; + background: var(--warning-bg); + color: var(--warning-ink); } .access-state p { color: var(--muted); diff --git a/studio/src/app/designer/condition-editor.ts b/studio/src/app/designer/condition-editor.ts index 98340294..5b67cb00 100644 --- a/studio/src/app/designer/condition-editor.ts +++ b/studio/src/app/designer/condition-editor.ts @@ -451,8 +451,8 @@ let sequence = 0; border-left: 1px solid var(--border); } .condition-join button[aria-pressed="true"] { - background: var(--forest); - color: var(--on-dark); + background: var(--accent); + color: var(--on-accent); } .condition-tools { display: flex; diff --git a/studio/src/app/designer/decision-table-editor.ts b/studio/src/app/designer/decision-table-editor.ts index 6b53d81a..b218f693 100644 --- a/studio/src/app/designer/decision-table-editor.ts +++ b/studio/src/app/designer/decision-table-editor.ts @@ -324,7 +324,7 @@ export const freshDecisionTable = (): DecisionTableDraft => ({ gap: 12px; } .rule { - border: 1px solid var(--border, #ddd); + border: 1px solid var(--border); border-radius: 8px; padding: 12px; display: grid; diff --git a/studio/src/app/designer/designer-view.ts b/studio/src/app/designer/designer-view.ts index 3d86e27b..bc182d24 100644 --- a/studio/src/app/designer/designer-view.ts +++ b/studio/src/app/designer/designer-view.ts @@ -347,7 +347,6 @@ import type { App } from "../app"; @for (kind of group.kinds; track kind) {
@if (resume(); as latest) { } @else { @@ -90,7 +90,8 @@ import {

Choose a provider

Name this connection so authors can recognize it. Choose models or - Azure deployments later in workflow AI profiles or Lumi settings. + Azure deployments later in workflow AI profiles or Weave AI + settings.

Override only for an approved proxy or compatible service. The - worker or Lumi gateway must allow the exact endpoint. + worker or Weave AI gateway must allow the exact endpoint.

} @@ -212,7 +213,7 @@ import {

The platform will validate the configuration. No model request or connectivity test is sent. Your operator still needs to authorize - the worker release or configure Lumi's gateway before use. + the worker release or configure Weave AI's gateway before use.

}
@@ -261,8 +262,8 @@ import { font-size: 13px; } .progress li[aria-current] { - color: var(--forest); - font-weight: 650; + color: var(--text); + font-weight: 600; } .number { display: grid; @@ -274,13 +275,13 @@ import { border-radius: 50%; } [aria-current] .number { - background: var(--forest); - border-color: var(--forest); - color: var(--on-dark); + background: var(--accent); + border-color: var(--accent); + color: var(--on-accent); } .complete .number { background: var(--selected); - color: var(--forest); + color: var(--text); } fieldset { display: grid; @@ -348,12 +349,12 @@ import { dd { margin: 0; overflow-wrap: anywhere; - font-weight: 550; + font-weight: 500; } .review-note { - border-left: 3px solid var(--jade); + border-left: 3px solid var(--accent); padding: 10px 12px; - background: var(--mist); + background: var(--raised); } @media (max-width: 420px) { .progress li { diff --git a/studio/src/app/integrations/ai-setup-wizard.ts b/studio/src/app/integrations/ai-setup-wizard.ts index 7b47e0bd..cb7da221 100644 --- a/studio/src/app/integrations/ai-setup-wizard.ts +++ b/studio/src/app/integrations/ai-setup-wizard.ts @@ -110,8 +110,8 @@ import { color: var(--muted); } .settings-progress [aria-current] { - color: var(--forest); - font-weight: 650; + color: var(--text); + font-weight: 600; } .step-number { display: grid; @@ -122,9 +122,9 @@ import { border: 1px solid var(--field-border); } [aria-current] .step-number { - color: var(--on-dark); - background: var(--forest); - border-color: var(--forest); + color: var(--on-accent); + background: var(--accent); + border-color: var(--accent); } .complete .step-number { background: var(--selected); diff --git a/studio/src/app/integrations/ai-shared-context-picker.ts b/studio/src/app/integrations/ai-shared-context-picker.ts index 9b380340..e6b078b2 100644 --- a/studio/src/app/integrations/ai-shared-context-picker.ts +++ b/studio/src/app/integrations/ai-shared-context-picker.ts @@ -61,7 +61,7 @@ import { }

Only selected structured results are sent to this step's provider. - Conversations from Lumi and other executions are never included. + Conversations from Weave AI and other executions are never included.

@if (error) { diff --git a/studio/src/app/integrations/connection-detail.ts b/studio/src/app/integrations/connection-detail.ts index f993492b..6018cc6d 100644 --- a/studio/src/app/integrations/connection-detail.ts +++ b/studio/src/app/integrations/connection-detail.ts @@ -179,7 +179,7 @@ let sequence = 0; .connection-ok { background: var(--success-bg); border-color: var(--success-bd); - border-left-color: var(--jade); + border-left-color: var(--success); color: var(--success-ink); } /* Busy, not unavailable: the global disabled look, a progress cursor. */ diff --git a/studio/src/app/integrations/http-action-builder.ts b/studio/src/app/integrations/http-action-builder.ts index edad4052..ea052156 100644 --- a/studio/src/app/integrations/http-action-builder.ts +++ b/studio/src/app/integrations/http-action-builder.ts @@ -208,7 +208,7 @@ let sequence = 0; min-height: 40px; } .hb-tabs button.selected { - color: var(--forest); + color: var(--text); font-weight: 600; } .hb-tabs button.selected::after { @@ -218,7 +218,7 @@ let sequence = 0; right: 0; bottom: 0; height: 3px; - background: var(--jade); + background: var(--accent); } .hb-panel[hidden] { display: none; diff --git a/studio/src/app/integrations/http-action-describe.ts b/studio/src/app/integrations/http-action-describe.ts index 1bc4e65c..85df5216 100644 --- a/studio/src/app/integrations/http-action-describe.ts +++ b/studio/src/app/integrations/http-action-describe.ts @@ -817,7 +817,7 @@ const newRowId = () => `hb-row-${++rowSequence}`; cursor: pointer; font-size: 12px; font-weight: 600; - color: var(--jade); + color: var(--link); } .monospace { overflow-wrap: anywhere; diff --git a/studio/src/app/integrations/http-action-openapi.ts b/studio/src/app/integrations/http-action-openapi.ts index b40ca465..c4082409 100644 --- a/studio/src/app/integrations/http-action-openapi.ts +++ b/studio/src/app/integrations/http-action-openapi.ts @@ -521,7 +521,7 @@ let sequence = 0; cursor: pointer; font-size: 12px; font-weight: 600; - color: var(--jade); + color: var(--link); } .hb-relax { margin-top: 10px; @@ -588,7 +588,7 @@ let sequence = 0; width: 16px; height: 16px; margin: 0; - accent-color: var(--forest); + accent-color: var(--accent); } .hb-op-path { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; @@ -622,8 +622,8 @@ let sequence = 0; min-width: 0; } .hb-pick.current { - border-color: var(--jade); - background: var(--mist); + border-color: var(--accent); + background: var(--selected); } .hb-pick-name { font-weight: 600; diff --git a/studio/src/app/integrations/http-action-styles.ts b/studio/src/app/integrations/http-action-styles.ts index 3a2717a7..5959ec04 100644 --- a/studio/src/app/integrations/http-action-styles.ts +++ b/studio/src/app/integrations/http-action-styles.ts @@ -117,7 +117,7 @@ export const builderStyles = ` width: 16px; height: 16px; margin: 0; - accent-color: var(--forest); + accent-color: var(--accent); } .hb-effect { display: flex; @@ -127,7 +127,7 @@ export const builderStyles = ` padding: 10px 12px; border-radius: var(--radius-sm); border: 1px solid var(--line); - background: var(--mist); + background: var(--raised); font-size: 12px; line-height: 1.45; } @@ -152,7 +152,7 @@ export const builderStyles = ` border: 1px solid var(--neutral-bd); padding: 1px 8px; background: var(--neutral-bg); - color: var(--forest); + color: var(--text); white-space: nowrap; } .hb-chip.write { @@ -169,7 +169,7 @@ export const builderStyles = ` font-family: var(--font-mono); font-size: 12px; font-weight: 700; - color: var(--forest); + color: var(--text); } .hb-rows { list-style: none; @@ -232,7 +232,7 @@ export const builderStyles = ` flex: none; } .hb-status.ok weave-icon { - color: var(--jade); + color: var(--success-ink); } .hb-status.bad { color: var(--danger-ink); diff --git a/studio/src/app/integrations/http-connection-form.ts b/studio/src/app/integrations/http-connection-form.ts index 788b8478..81c4c1d2 100644 --- a/studio/src/app/integrations/http-connection-form.ts +++ b/studio/src/app/integrations/http-connection-form.ts @@ -259,7 +259,7 @@ const marks: Record = { height: 20px; border-radius: 50%; font: 700 12px/1 var(--font-sans); - background: var(--mist); + background: var(--raised); color: var(--muted); } .readiness-icon[data-tone="ok"] { @@ -291,17 +291,17 @@ const marks: Record = { justify-content: center; font-size: 12px; font-weight: 700; - background: var(--mist); + background: var(--raised); color: var(--muted); } .done .mark { - background: var(--mint); - color: var(--forest); + background: var(--success-bg); + color: var(--success-ink); } .action .mark { - background: var(--gold-soft); - color: #5f4612; - border: 1px solid var(--gold); + background: var(--warning-bg); + color: var(--warning-ink); + border: 1px solid var(--warning-bd); } .title { margin: 2px 0 0; @@ -327,7 +327,7 @@ const marks: Record = { overflow-wrap: anywhere; padding: 6px 8px; border-radius: 5px; - background: var(--mist); + background: var(--sunken); font-size: 12px; } .command button { @@ -593,7 +593,7 @@ export type ConnectionPrefill = Partial; overflow-wrap: anywhere; padding: 8px 10px; border-radius: 5px; - background: var(--mist); + background: var(--raised); } .destination .error { flex-basis: 100%; @@ -613,7 +613,7 @@ export type ConnectionPrefill = Partial; overflow-wrap: anywhere; padding: 8px; border-radius: 5px; - background: var(--mist); + background: var(--sunken); font-size: 12px; } .row { @@ -622,6 +622,15 @@ export type ConnectionPrefill = Partial; gap: 8px; margin-top: 8px; } + /* A long label ("Check configuration (no request is sent)") wraps inside + the dialog. On one line it is wider than a 360 px column and widens + every section of the grid with it. */ + .row button { + max-width: 100%; + padding-block: var(--space-1); + white-space: normal; + text-align: center; + } .created { display: grid; gap: 8px; @@ -653,7 +662,7 @@ export type ConnectionPrefill = Partial; overflow-wrap: anywhere; padding: 8px; border-radius: var(--radius-xs); - background: var(--mist); + background: var(--sunken); font: var(--type-mono); } /* The dialog's footer stays in view at the bottom of the scrolling diff --git a/studio/src/app/lumi/lumi-panel.ts b/studio/src/app/lumi/lumi-panel.ts index e35ede01..0407e842 100644 --- a/studio/src/app/lumi/lumi-panel.ts +++ b/studio/src/app/lumi/lumi-panel.ts @@ -67,8 +67,8 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; ], template: ` @if (host.lumiOpen) { @@ -90,39 +90,40 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; [disabled]="configBusy" (click)="openSettings()" > - Lumi settings + Weave AI settings }
@if (!host.profile) {

- Connect to a platform to ask Lumi. Your workflow can stay a local - draft. + Connect to a platform to ask Weave AI. Your workflow can stay a + local draft.

} @else if (!host.can("lumi.use")) {

- Ask an administrator for access to Lumi in this environment. + Ask an administrator for access to Weave AI in this environment.

} @else if (!settings && !status?.configured && !loading) {

- Lumi is unavailable in this environment. An administrator configures - its model and connection; a platform operator enables the Lumi - gateway. Saving model settings alone does not deploy the gateway. + Weave AI is unavailable in this environment. An administrator + configures its model and connection; a platform operator enables the + Weave AI gateway. Saving model settings alone does not deploy the + gateway.

} @if (loading) { -

Loading Lumi…

+

Loading Weave AI…

} @if (settings) {

- Configure Lumi for this environment. Workflow AI profiles have - their own settings. + Choose Weave AI's model and connection for this environment. + Workflow AI profiles have their own settings.

@if (!host.can("connection.manage")) {

To select or save a provider connection, ask an administrator - for connection.manage in this environment as well as Lumi + for connection.manage in this environment as well as Weave AI manager.

} @@ -130,13 +131,13 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -150,8 +151,8 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;

- Choose Lumi's provider connection. Credentials stay with the - platform operator. + Choose Weave AI's provider connection. Credentials stay with + the platform operator.

- Lumi pins this exact revision. Choose a connection with the - same provider as the profile; changing a workflow profile - will not change these settings. + Weave AI pins this exact revision. Choose a connection with + the same provider as the profile; changing a workflow + profile will not change these settings.

@if (configConnection && !selectedConnection) {

@@ -212,11 +213,11 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; }

- Saving applies these settings to Lumi in the current + Saving applies these settings to Weave AI in the current environment. It does not change workflow AI profiles or send - a model request. The platform operator must enable the Lumi - gateway and authorize this connection before you can ask - Lumi. + a model request. The platform operator must enable the Weave + AI gateway and authorize this connection before you can ask + Weave AI.

@@ -235,7 +236,7 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
} @else if (configBusy) { -

Loading Lumi settings…

+

Loading Weave AI settings…

} @if (!configSchema && configError) { @@ -283,8 +284,8 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i; } @if (item.kind === "workflow" && !current(item)) { }
@@ -326,12 +327,12 @@ const uuid = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@for (turn of conversation.turns; track $index) {
-

{{ turn.role === "user" ? "You" : "Lumi" }}

+

{{ turn.role === "user" ? "You" : "Weave AI" }}

{{ turn.content }}

@for (proposal of turn.proposals ?? []; track $index) {